package index import ( "context" "net/http" "net/http/httptest" "strings" "testing" "time" "tea.karlcom.de/karl/bucketeer/internal/model" ) func newTestIndexer(handler http.Handler) (*Indexer, string) { srv := httptest.NewServer(handler) x := New(50, 2*time.Second) x.scheme = "http" x.gcsBase = srv.URL return x, strings.TrimPrefix(srv.URL, "http://") } func TestListS3(t *testing.T) { body := ` false photos/ photos/a.jpg2024-01-02T03:04:05.000Z"abc"1234 readme.txt12 ` x, host := newTestIndexer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Query().Get("list-type") != "2" { t.Errorf("expected list-type=2, got %q", r.URL.RawQuery) } w.Header().Set("Content-Type", "application/xml") _, _ = w.Write([]byte(body)) })) entries, err := x.List(context.Background(), model.Candidate{Hostname: host, Provider: model.ProviderAWS, Service: model.ServiceS3}) if err != nil { t.Fatal(err) } if len(entries) != 3 { t.Fatalf("got %d entries: %+v", len(entries), entries) } if entries[0].Kind != "prefix" || entries[0].Name != "photos/" { t.Fatalf("prefix entry wrong: %+v", entries[0]) } if entries[1].Name != "photos/a.jpg" || entries[1].Size != 1234 || entries[1].ETag != "abc" { t.Fatalf("object entry wrong: %+v", entries[1]) } if entries[1].Updated.IsZero() { t.Fatal("expected updated timestamp parsed") } } func TestListGCS(t *testing.T) { body := `{"items":[{"name":"a/b.txt","size":"42","updated":"2024-05-06T07:08:09Z","contentType":"text/plain","etag":"e1"}],"prefixes":["a/"]}` x, _ := newTestIndexer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if !strings.HasPrefix(r.URL.Path, "/storage/v1/b/") { t.Errorf("unexpected path %q", r.URL.Path) } _, _ = w.Write([]byte(body)) })) entries, err := x.List(context.Background(), model.Candidate{Resource: "mybucket", Provider: model.ProviderGCP, Service: model.ServiceObjectStorage}) if err != nil { t.Fatal(err) } if len(entries) != 2 || entries[1].Name != "a/b.txt" || entries[1].Size != 42 || entries[1].ContentType != "text/plain" { t.Fatalf("unexpected entries: %+v", entries) } } func TestListFirebase(t *testing.T) { x, host := newTestIndexer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte(`{"users":true,"orders":true}`)) })) entries, err := x.List(context.Background(), model.Candidate{Hostname: host, Provider: model.ProviderGCP, Service: model.ServiceFirebaseDB}) if err != nil { t.Fatal(err) } if len(entries) != 2 || entries[0].Kind != "key" { t.Fatalf("unexpected entries: %+v", entries) } } func TestListBounded(t *testing.T) { var keys strings.Builder for i := 0; i < 100; i++ { keys.WriteString("k") keys.WriteString(string(rune('a' + i%26))) keys.WriteString("1") } body := `false` + keys.String() + `` x, host := newTestIndexer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte(body)) })) x.maxObjects = 10 entries, err := x.List(context.Background(), model.Candidate{Hostname: host, Provider: model.ProviderAWS, Service: model.ServiceS3}) if err != nil { t.Fatal(err) } if len(entries) > 10 { t.Fatalf("got %d entries, want <= 10", len(entries)) } }