package meilisearch import ( "crypto/tls" "github.com/stretchr/testify/require" "testing" ) func TestIndex_Delete(t *testing.T) { sv := setup(t, "") customSv := setup(t, "", WithCustomClientWithTLS(&tls.Config{ InsecureSkipVerify: true, })) type args struct { createUid []string deleteUid []string } tests := []struct { name string client ServiceManager args args }{ { name: "TestIndexDeleteOneIndex", client: sv, args: args{ createUid: []string{"TestIndexDeleteOneIndex"}, deleteUid: []string{"TestIndexDeleteOneIndex"}, }, }, { name: "TestIndexDeleteOneIndexWithCustomClient", client: customSv, args: args{ createUid: []string{"TestIndexDeleteOneIndexWithCustomClient"}, deleteUid: []string{"TestIndexDeleteOneIndexWithCustomClient"}, }, }, { name: "TestIndexDeleteMultipleIndex", client: sv, args: args{ createUid: []string{ "TestIndexDeleteMultipleIndex_1", "TestIndexDeleteMultipleIndex_2", "TestIndexDeleteMultipleIndex_3", "TestIndexDeleteMultipleIndex_4", "TestIndexDeleteMultipleIndex_5", }, deleteUid: []string{ "TestIndexDeleteMultipleIndex_1", "TestIndexDeleteMultipleIndex_2", "TestIndexDeleteMultipleIndex_3", "TestIndexDeleteMultipleIndex_4", "TestIndexDeleteMultipleIndex_5", }, }, }, { name: "TestIndexDeleteNotExistingIndex", client: sv, args: args{ createUid: []string{}, deleteUid: []string{"TestIndexDeleteNotExistingIndex"}, }, }, { name: "TestIndexDeleteMultipleNotExistingIndex", client: sv, args: args{ createUid: []string{}, deleteUid: []string{ "TestIndexDeleteMultipleNotExistingIndex_1", "TestIndexDeleteMultipleNotExistingIndex_2", "TestIndexDeleteMultipleNotExistingIndex_3", }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { c := tt.client t.Cleanup(cleanup(c)) for _, uid := range tt.args.createUid { _, err := setUpEmptyIndex(sv, &IndexConfig{Uid: uid}) require.NoError(t, err, "CreateIndex() in DeleteTest error should be nil") } for k := range tt.args.deleteUid { i := c.Index(tt.args.deleteUid[k]) gotResp, err := i.Delete(tt.args.deleteUid[k]) require.True(t, gotResp) require.NoError(t, err) } }) } } func TestIndex_GetStats(t *testing.T) { sv := setup(t, "") customSv := setup(t, "", WithCustomClientWithTLS(&tls.Config{ InsecureSkipVerify: true, })) type args struct { UID string client ServiceManager } tests := []struct { name string args args wantResp *StatsIndex }{ { name: "TestIndexBasicGetStats", args: args{ UID: "TestIndexBasicGetStats", client: sv, }, wantResp: &StatsIndex{ NumberOfDocuments: 6, IsIndexing: false, FieldDistribution: map[string]int64{"book_id": 6, "title": 6}, RawDocumentDbSize: 4096, AvgDocumentSize: 674, }, }, { name: "TestIndexGetStatsWithCustomClient", args: args{ UID: "TestIndexGetStatsWithCustomClient", client: customSv, }, wantResp: &StatsIndex{ NumberOfDocuments: 6, IsIndexing: false, FieldDistribution: map[string]int64{"book_id": 6, "title": 6}, RawDocumentDbSize: 4096, AvgDocumentSize: 674, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { setUpBasicIndex(sv, tt.args.UID) c := tt.args.client i := c.Index(tt.args.UID) t.Cleanup(cleanup(c)) gotResp, err := i.GetStats() require.NoError(t, err) require.Equal(t, tt.wantResp, gotResp) }) } } func Test_newIndex(t *testing.T) { sv := setup(t, "") customSv := setup(t, "", WithCustomClientWithTLS(&tls.Config{ InsecureSkipVerify: true, })) type args struct { client ServiceManager uid string } tests := []struct { name string args args want IndexManager }{ { name: "TestBasicNewIndex", args: args{ client: sv, uid: "TestBasicNewIndex", }, want: sv.Index("TestBasicNewIndex"), }, { name: "TestNewIndexCustomClient", args: args{ client: sv, uid: "TestNewIndexCustomClient", }, want: customSv.Index("TestNewIndexCustomClient"), }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { c := tt.args.client t.Cleanup(cleanup(c)) gotIdx := c.Index(tt.args.uid) task, err := c.CreateIndex(&IndexConfig{Uid: tt.args.uid}) require.NoError(t, err) testWaitForTask(t, gotIdx, task) gotIdxResult, err := gotIdx.FetchInfo() require.NoError(t, err) wantIdxResult, err := tt.want.FetchInfo() require.NoError(t, err) require.Equal(t, gotIdxResult.UID, wantIdxResult.UID) // Timestamps should be empty unless fetched require.NotZero(t, gotIdxResult.CreatedAt) require.NotZero(t, gotIdxResult.UpdatedAt) }) } } func TestIndex_FetchInfo(t *testing.T) { sv := setup(t, "") customSv := setup(t, "", WithCustomClientWithTLS(&tls.Config{ InsecureSkipVerify: true, })) broken := setup(t, "", WithAPIKey("wrong")) type args struct { UID string client ServiceManager } tests := []struct { name string args args wantResp *IndexResult }{ { name: "TestIndexBasicFetchInfo", args: args{ UID: "TestIndexBasicFetchInfo", client: sv, }, wantResp: &IndexResult{ UID: "TestIndexBasicFetchInfo", PrimaryKey: "book_id", }, }, { name: "TestIndexFetchInfoWithCustomClient", args: args{ UID: "TestIndexFetchInfoWithCustomClient", client: customSv, }, wantResp: &IndexResult{ UID: "TestIndexFetchInfoWithCustomClient", PrimaryKey: "book_id", }, }, { name: "TestIndexFetchInfoWithBrokenClient", args: args{ UID: "TestIndexFetchInfoWithCustomClient", client: broken, }, wantResp: nil, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { setUpBasicIndex(sv, tt.args.UID) c := tt.args.client t.Cleanup(cleanup(c)) i := c.Index(tt.args.UID) gotResp, err := i.FetchInfo() if tt.wantResp == nil { require.Error(t, err) require.Nil(t, gotResp) } else { require.NoError(t, err) require.Equal(t, tt.wantResp.UID, gotResp.UID) require.Equal(t, tt.wantResp.PrimaryKey, gotResp.PrimaryKey) // Make sure that timestamps are also fetched and are updated require.NotZero(t, gotResp.CreatedAt) require.NotZero(t, gotResp.UpdatedAt) } }) } } func TestIndex_FetchPrimaryKey(t *testing.T) { sv := setup(t, "") customSv := setup(t, "", WithCustomClientWithTLS(&tls.Config{ InsecureSkipVerify: true, })) type args struct { UID string client ServiceManager } tests := []struct { name string args args wantPrimaryKey string }{ { name: "TestIndexBasicFetchPrimaryKey", args: args{ UID: "TestIndexBasicFetchPrimaryKey", client: sv, }, wantPrimaryKey: "book_id", }, { name: "TestIndexFetchPrimaryKeyWithCustomClient", args: args{ UID: "TestIndexFetchPrimaryKeyWithCustomClient", client: customSv, }, wantPrimaryKey: "book_id", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { setUpBasicIndex(tt.args.client, tt.args.UID) c := tt.args.client i := c.Index(tt.args.UID) t.Cleanup(cleanup(c)) gotPrimaryKey, err := i.FetchPrimaryKey() require.NoError(t, err) require.Equal(t, &tt.wantPrimaryKey, gotPrimaryKey) }) } } func TestIndex_UpdateIndex(t *testing.T) { sv := setup(t, "") customSv := setup(t, "", WithCustomClientWithTLS(&tls.Config{ InsecureSkipVerify: true, })) type args struct { primaryKey string config IndexConfig client ServiceManager } tests := []struct { name string args args wantResp *IndexResult }{ { name: "TestIndexBasicUpdateIndex", args: args{ client: sv, config: IndexConfig{ Uid: "indexUID", }, primaryKey: "book_id", }, wantResp: &IndexResult{ UID: "indexUID", PrimaryKey: "book_id", }, }, { name: "TestIndexUpdateIndexWithCustomClient", args: args{ client: customSv, config: IndexConfig{ Uid: "indexUID", }, primaryKey: "book_id", }, wantResp: &IndexResult{ UID: "indexUID", PrimaryKey: "book_id", }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { c := tt.args.client t.Cleanup(cleanup(c)) i, err := setUpEmptyIndex(tt.args.client, &tt.args.config) require.NoError(t, err) require.Equal(t, tt.args.config.Uid, i.UID) // Store original timestamps createdAt := i.CreatedAt updatedAt := i.UpdatedAt gotResp, err := i.UpdateIndex(tt.args.primaryKey) require.NoError(t, err) _, err = c.WaitForTask(gotResp.TaskUID, 0) require.NoError(t, err) require.NoError(t, err) require.Equal(t, tt.wantResp.UID, gotResp.IndexUID) gotIndex, err := c.GetIndex(tt.args.config.Uid) require.NoError(t, err) require.Equal(t, tt.wantResp.PrimaryKey, gotIndex.PrimaryKey) // Make sure that timestamps were correctly updated as well require.Equal(t, createdAt, gotIndex.CreatedAt) require.NotEqual(t, updatedAt, gotIndex.UpdatedAt) }) } } func TestIndexManagerAndReaders(t *testing.T) { c := setup(t, "") idx := c.Index("indexUID") require.NotNil(t, idx) require.NotNil(t, idx.GetIndexReader()) require.NotNil(t, idx.GetTaskReader()) require.NotNil(t, idx.GetSettingsManager()) require.NotNil(t, idx.GetSettingsReader()) require.NotNil(t, idx.GetSearch()) require.NotNil(t, idx.GetDocumentManager()) require.NotNil(t, idx.GetDocumentReader()) }