56 lines
1.5 KiB
Go
56 lines
1.5 KiB
Go
package outboundimage
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
type fakeObjectStore struct {
|
|
key string
|
|
data []byte
|
|
contentType string
|
|
ttl time.Duration
|
|
}
|
|
|
|
func (s *fakeObjectStore) Put(_ context.Context, key string, data []byte, contentType string) error {
|
|
s.key = key
|
|
s.data = append([]byte(nil), data...)
|
|
s.contentType = contentType
|
|
return nil
|
|
}
|
|
|
|
func (s *fakeObjectStore) PresignGet(_ context.Context, key string, ttl time.Duration) (string, error) {
|
|
s.ttl = ttl
|
|
return "https://private-oss.example/" + key + "?signature=short", nil
|
|
}
|
|
|
|
func TestHashPublisherUsesDeterministicTemporaryKeyAndTwoHourHTTPSURL(t *testing.T) {
|
|
store := &fakeObjectStore{}
|
|
publisher := NewHashPublisher(store, "dobotai/im-images", 2*time.Hour)
|
|
|
|
first, err := publisher.Publish(context.Background(), []byte("same-image"), "image/jpeg")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
firstKey := store.key
|
|
second, err := publisher.Publish(context.Background(), []byte("same-image"), "image/jpeg")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if first != second || firstKey != store.key {
|
|
t.Fatalf("publish is not deterministic: url1=%q url2=%q key1=%q key2=%q", first, second, firstKey, store.key)
|
|
}
|
|
if !strings.HasPrefix(store.key, "dobotai/im-images/") || !strings.HasSuffix(store.key, ".jpg") {
|
|
t.Fatalf("key=%q", store.key)
|
|
}
|
|
if strings.Contains(store.key, "same-image") {
|
|
t.Fatalf("key leaks content: %q", store.key)
|
|
}
|
|
if store.ttl != 2*time.Hour || !strings.HasPrefix(first, "https://") {
|
|
t.Fatalf("ttl=%s url=%q", store.ttl, first)
|
|
}
|
|
}
|