package repository_test import ( "context" "os" "path" "testing" "queryorchestration/internal/database/repository" "queryorchestration/internal/serviceconfig" "queryorchestration/internal/test" "github.com/jackc/pgx/v5/pgtype" "github.com/stretchr/testify/assert" ) func TestResults(t *testing.T) { if testing.Short() { t.Skip("Skipping long test in short mode") } ctx := context.Background() cfg := &serviceconfig.BaseConfig{} test.SetCfgProvider(t, cfg) cfg.SetBasePath(path.Join(os.Getenv("PWD"), "../../..")) _, cleanup := test.CreateDB(t, ctx, &test.CreateDatabaseConfig{ Cfg: cfg, RunMigrations: true, }) defer cleanup() queries := cfg.GetDBQueries() jsonQueryID, err := queries.CreateQuery(ctx, repository.Querytype(repository.QuerytypeJsonExtractor)) assert.NoError(t, err) _, err = queries.AddLatestQueryVersion(ctx, jsonQueryID) assert.NoError(t, err) err = queries.AddActiveQueryVersion(ctx, &repository.AddActiveQueryVersionParams{ Queryid: jsonQueryID, Versionid: 1, }) assert.NoError(t, err) clientId, err := queries.CreateClient(ctx, "example_client") assert.NoError(t, err) jobId, err := queries.CreateJob(ctx, clientId) assert.NoError(t, err) issynced, err := queries.IsJobSynced(ctx, jobId) assert.NoError(t, err) assert.True(t, issynced) documentID, err := queries.CreateDocument(ctx, &repository.CreateDocumentParams{ Jobid: jobId, Hash: "example_hash", }) assert.NoError(t, err) issynced, err = queries.IsJobSynced(ctx, jobId) assert.NoError(t, err) assert.False(t, issynced) version, err := queries.AddLatestCollectorVersion(ctx, jobId) assert.NoError(t, err) err = queries.SetActiveCollectorVersion(ctx, &repository.SetActiveCollectorVersionParams{ Versionid: version, Jobid: jobId, }) assert.NoError(t, err) issynced, err = queries.IsJobSynced(ctx, jobId) assert.NoError(t, err) assert.False(t, issynced) bucket := "example_bucket" key := "example_key" cleanid, err := queries.AddDocumentClean(ctx, &repository.AddDocumentCleanParams{ Documentid: documentID, Bucket: &bucket, Key: &key, Mimetype: repository.NullCleanmimetype{ Valid: true, Cleanmimetype: repository.CleanmimetypeApplicationPdf, }, }) assert.NoError(t, err) err = queries.AddDocumentCleanEntry(ctx, &repository.AddDocumentCleanEntryParams{ Cleanid: cleanid, Version: 1, }) assert.NoError(t, err) issynced, err = queries.IsJobSynced(ctx, jobId) assert.NoError(t, err) assert.False(t, issynced) cleanentry, err := queries.GetDocumentCleanEntry(ctx, documentID) assert.NoError(t, err) err = queries.AddDocumentTextEntry(ctx, &repository.AddDocumentTextEntryParams{ Version: 1, Bucket: "hi", Key: "hello", Cleanentryid: cleanentry.ID, }) assert.NoError(t, err) issynced, err = queries.IsJobSynced(ctx, jobId) assert.NoError(t, err) assert.True(t, issynced) textentry, err := queries.GetDocumentTextEntry(ctx, documentID) assert.NoError(t, err) err = queries.AddCollectorQuery(ctx, &repository.AddCollectorQueryParams{ Jobid: jobId, Queryid: jsonQueryID, Addedversion: 1, Name: "example_key", }) assert.NoError(t, err) issynced, err = queries.IsJobSynced(ctx, jobId) assert.NoError(t, err) assert.False(t, issynced) jsonResultValue := "example_value" _, err = queries.AddResult(ctx, &repository.AddResultParams{ Queryid: jsonQueryID, Value: jsonResultValue, Textentryid: textentry.ID, Queryversion: 1, }) assert.NoError(t, err) issynced, err = queries.IsJobSynced(ctx, jobId) assert.NoError(t, err) assert.True(t, issynced) qv := int32(1) res, err := queries.GetResultValueWithVersion(ctx, &repository.GetResultValueWithVersionParams{ Queryid: jsonQueryID, Queryversion: &qv, Documentid: documentID, }) assert.NoError(t, err) assert.NotNil(t, res.Value) assert.Equal(t, jsonResultValue, *res.Value) } func TestResultValues(t *testing.T) { if testing.Short() { t.Skip("Skipping long test in short mode") } ctx := context.Background() cfg := &serviceconfig.BaseConfig{} test.SetCfgProvider(t, cfg) cfg.SetBasePath(path.Join(os.Getenv("PWD"), "../../..")) _, cleanup := test.CreateDB(t, ctx, &test.CreateDatabaseConfig{ Cfg: cfg, RunMigrations: true, }) defer cleanup() queries := cfg.GetDBQueries() jsonQueryID, err := queries.CreateQuery(ctx, repository.Querytype(repository.QuerytypeJsonExtractor)) assert.NoError(t, err) clientId, err := queries.CreateClient(ctx, "example_client") assert.NoError(t, err) jobId, err := queries.CreateJob(ctx, clientId) assert.NoError(t, err) documentID, err := queries.CreateDocument(ctx, &repository.CreateDocumentParams{ Jobid: jobId, Hash: "example_hash", }) assert.NoError(t, err) documentTwoID, err := queries.CreateDocument(ctx, &repository.CreateDocumentParams{ Jobid: jobId, Hash: "example_hash_two", }) assert.NoError(t, err) contextQueryID, err := queries.CreateQuery(ctx, repository.Querytype(repository.QuerytypeContextFull)) assert.NoError(t, err) _, err = queries.AddLatestQueryVersion(ctx, jsonQueryID) assert.NoError(t, err) err = queries.AddActiveQueryVersion(ctx, &repository.AddActiveQueryVersionParams{ Queryid: jsonQueryID, Versionid: 1, }) assert.NoError(t, err) _, err = queries.AddLatestQueryVersion(ctx, contextQueryID) assert.NoError(t, err) _, err = queries.AddLatestQueryVersion(ctx, contextQueryID) assert.NoError(t, err) err = queries.AddActiveQueryVersion(ctx, &repository.AddActiveQueryVersionParams{ Queryid: contextQueryID, Versionid: 2, }) assert.NoError(t, err) jsonVersion := int32(1) err = queries.AddRequiredQuery(ctx, &repository.AddRequiredQueryParams{ Queryid: jsonQueryID, Requiredqueryid: contextQueryID, Addedversion: jsonVersion, }) assert.NoError(t, err) contextQuery, err := queries.GetQuery(ctx, contextQueryID) assert.NoError(t, err) qResults, err := queries.ListQueryRequirementValues(ctx, &repository.ListQueryRequirementValuesParams{ Queryid: jsonQueryID, Documentid: documentID, Version: &jsonVersion, }) assert.NoError(t, err) assert.Len(t, qResults, 0) qResults, err = queries.ListQueryRequirementValues(ctx, &repository.ListQueryRequirementValuesParams{ Queryid: jsonQueryID, Documentid: documentTwoID, Version: &jsonVersion, }) assert.NoError(t, err) assert.Len(t, qResults, 0) version, err := queries.AddLatestCollectorVersion(ctx, jobId) assert.NoError(t, err) err = queries.SetActiveCollectorVersion(ctx, &repository.SetActiveCollectorVersionParams{ Versionid: version, Jobid: jobId, }) assert.NoError(t, err) bucket := "example_bucket" key := "example_key" cleanid, err := queries.AddDocumentClean(ctx, &repository.AddDocumentCleanParams{ Documentid: documentID, Bucket: &bucket, Key: &key, Mimetype: repository.NullCleanmimetype{ Valid: true, Cleanmimetype: repository.CleanmimetypeApplicationPdf, }, }) assert.NoError(t, err) err = queries.AddDocumentCleanEntry(ctx, &repository.AddDocumentCleanEntryParams{ Cleanid: cleanid, Version: 1, }) assert.NoError(t, err) cleanentry, err := queries.GetDocumentCleanEntry(ctx, documentID) assert.NoError(t, err) err = queries.AddDocumentTextEntry(ctx, &repository.AddDocumentTextEntryParams{ Version: 1, Bucket: "hi", Key: "hello", Cleanentryid: cleanentry.ID, }) assert.NoError(t, err) textentry, err := queries.GetDocumentTextEntry(ctx, documentID) assert.NoError(t, err) result := repository.AddResultParams{ Queryid: contextQueryID, Value: "context_value_1", Textentryid: textentry.ID, Queryversion: contextQuery.Activeversion, } _, err = queries.AddResult(ctx, &result) assert.NoError(t, err) qResults, err = queries.ListQueryRequirementValues(ctx, &repository.ListQueryRequirementValuesParams{ Queryid: jsonQueryID, Documentid: documentID, Version: &jsonVersion, }) assert.NoError(t, err) assert.Len(t, qResults, 1) assert.Equal(t, contextQueryID, qResults[0].Queryid) assert.Equal(t, repository.QuerytypeContextFull, qResults[0].Type) assert.Equal(t, "context_value_1", *qResults[0].Value) assert.NotEqual(t, pgtype.UUID{}, qResults[0].ID) assert.True(t, qResults[0].ID.Valid) qResults, err = queries.ListQueryRequirementValues(ctx, &repository.ListQueryRequirementValuesParams{ Queryid: jsonQueryID, Documentid: documentTwoID, Version: &jsonVersion, }) assert.NoError(t, err) assert.Len(t, qResults, 0) _, err = queries.AddResult(ctx, &repository.AddResultParams{ Queryid: contextQueryID, Value: "context_value_2", Textentryid: textentry.ID, Queryversion: contextQuery.Activeversion - 1, }) assert.NoError(t, err) qResults, err = queries.ListQueryRequirementValues(ctx, &repository.ListQueryRequirementValuesParams{ Queryid: jsonQueryID, Documentid: documentID, Version: &jsonVersion, }) assert.NoError(t, err) assert.Len(t, qResults, 1) assert.Equal(t, contextQueryID, qResults[0].Queryid) assert.Equal(t, repository.QuerytypeContextFull, qResults[0].Type) assert.Equal(t, "context_value_1", *qResults[0].Value) assert.NotEqual(t, pgtype.UUID{}, qResults[0].ID) assert.True(t, qResults[0].ID.Valid) _, err = queries.AddResult(ctx, &repository.AddResultParams{ Queryid: contextQueryID, Value: "context_value_3", Textentryid: textentry.ID, Queryversion: contextQuery.Activeversion, }) assert.NoError(t, err) qResults, err = queries.ListQueryRequirementValues(ctx, &repository.ListQueryRequirementValuesParams{ Queryid: jsonQueryID, Documentid: documentID, Version: &jsonVersion, }) assert.NoError(t, err) assert.Len(t, qResults, 1) assert.Equal(t, contextQueryID, qResults[0].Queryid) assert.Equal(t, repository.QuerytypeContextFull, qResults[0].Type) assert.Equal(t, "context_value_3", *qResults[0].Value) assert.NotEqual(t, pgtype.UUID{}, qResults[0].ID) assert.True(t, qResults[0].ID.Valid) _, err = queries.AddResult(ctx, &repository.AddResultParams{ Queryid: jsonQueryID, Value: "json_value_1", Textentryid: textentry.ID, Queryversion: jsonVersion, }) assert.NoError(t, err) qResults, err = queries.ListQueryRequirementValues(ctx, &repository.ListQueryRequirementValuesParams{ Queryid: jsonQueryID, Documentid: documentID, Version: &jsonVersion, }) assert.NoError(t, err) assert.Len(t, qResults, 1) assert.Equal(t, contextQueryID, qResults[0].Queryid) assert.Equal(t, repository.QuerytypeContextFull, qResults[0].Type) assert.Equal(t, "context_value_3", *qResults[0].Value) assert.NotEqual(t, pgtype.UUID{}, qResults[0].ID) assert.True(t, qResults[0].ID.Valid) } func TestUnsyncedNoDepsQueries(t *testing.T) { if testing.Short() { t.Skip("Skipping long test in short mode") } ctx := context.Background() cfg := &serviceconfig.BaseConfig{} test.SetCfgProvider(t, cfg) cfg.SetBasePath(path.Join(os.Getenv("PWD"), "../../..")) _, cleanup := test.CreateDB(t, ctx, &test.CreateDatabaseConfig{ Cfg: cfg, RunMigrations: true, }) defer cleanup() queries := cfg.GetDBQueries() clientId, err := queries.CreateClient(ctx, "example_client") assert.NoError(t, err) jobId, err := queries.CreateJob(ctx, clientId) assert.NoError(t, err) version, err := queries.AddLatestCollectorVersion(ctx, jobId) assert.NoError(t, err) err = queries.SetActiveCollectorVersion(ctx, &repository.SetActiveCollectorVersionParams{ Versionid: version, Jobid: jobId, }) assert.NoError(t, err) documentID, err := queries.CreateDocument(ctx, &repository.CreateDocumentParams{ Jobid: jobId, Hash: "example_hash", }) assert.NoError(t, err) documentTwoID, err := queries.CreateDocument(ctx, &repository.CreateDocumentParams{ Jobid: jobId, Hash: "example_hash_two", }) assert.NoError(t, err) contextQueryID, err := queries.CreateQuery(ctx, repository.Querytype(repository.QuerytypeContextFull)) assert.NoError(t, err) jsonQueryID, err := queries.CreateQuery(ctx, repository.Querytype(repository.QuerytypeJsonExtractor)) assert.NoError(t, err) _, err = queries.AddLatestQueryVersion(ctx, jsonQueryID) assert.NoError(t, err) err = queries.AddActiveQueryVersion(ctx, &repository.AddActiveQueryVersionParams{ Queryid: jsonQueryID, Versionid: 1, }) assert.NoError(t, err) _, err = queries.AddLatestQueryVersion(ctx, contextQueryID) assert.NoError(t, err) err = queries.AddActiveQueryVersion(ctx, &repository.AddActiveQueryVersionParams{ Queryid: contextQueryID, Versionid: 1, }) assert.NoError(t, err) err = queries.AddRequiredQuery(ctx, &repository.AddRequiredQueryParams{ Queryid: jsonQueryID, Requiredqueryid: contextQueryID, Addedversion: 1, }) assert.NoError(t, err) err = queries.AddCollectorQuery(ctx, &repository.AddCollectorQueryParams{ Jobid: jobId, Name: "example_name", Queryid: jsonQueryID, Addedversion: 1, }) assert.NoError(t, err) qs, err := queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentID) assert.NoError(t, err) assert.Len(t, qs, 0) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentTwoID) assert.NoError(t, err) assert.Len(t, qs, 0) bucket := "example_bucket" key := "example_key" cleanid, err := queries.AddDocumentClean(ctx, &repository.AddDocumentCleanParams{ Documentid: documentID, Bucket: &bucket, Key: &key, Mimetype: repository.NullCleanmimetype{ Valid: true, Cleanmimetype: repository.CleanmimetypeApplicationPdf, }, }) assert.NoError(t, err) err = queries.AddDocumentCleanEntry(ctx, &repository.AddDocumentCleanEntryParams{ Cleanid: cleanid, Version: 1, }) assert.NoError(t, err) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentID) assert.NoError(t, err) assert.Len(t, qs, 0) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentTwoID) assert.NoError(t, err) assert.Len(t, qs, 0) cleanentry, err := queries.GetDocumentCleanEntry(ctx, documentID) assert.NoError(t, err) err = queries.AddDocumentTextEntry(ctx, &repository.AddDocumentTextEntryParams{ Version: 1, Bucket: "hi", Key: "hello", Cleanentryid: cleanentry.ID, }) assert.NoError(t, err) textentry, err := queries.GetDocumentTextEntry(ctx, documentID) assert.NoError(t, err) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentID) assert.NoError(t, err) assert.Len(t, qs, 1) assert.ElementsMatch(t, []pgtype.UUID{contextQueryID}, qs) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentTwoID) assert.NoError(t, err) assert.Len(t, qs, 0) _, err = queries.AddResult(ctx, &repository.AddResultParams{ Queryid: contextQueryID, Value: "context_value", Textentryid: textentry.ID, Queryversion: 1, }) assert.NoError(t, err) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentID) assert.NoError(t, err) assert.Len(t, qs, 1) assert.ElementsMatch(t, []pgtype.UUID{jsonQueryID}, qs) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentTwoID) assert.NoError(t, err) assert.Len(t, qs, 0) _, err = queries.AddResult(ctx, &repository.AddResultParams{ Queryid: jsonQueryID, Value: "context_value", Textentryid: textentry.ID, Queryversion: 1, }) assert.NoError(t, err) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentID) assert.NoError(t, err) assert.Len(t, qs, 0) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentTwoID) assert.NoError(t, err) assert.Len(t, qs, 0) cleantwoid, err := queries.AddDocumentClean(ctx, &repository.AddDocumentCleanParams{ Documentid: documentTwoID, Bucket: &bucket, Key: &key, Mimetype: repository.NullCleanmimetype{ Valid: true, Cleanmimetype: repository.CleanmimetypeApplicationPdf, }, }) assert.NoError(t, err) err = queries.AddDocumentCleanEntry(ctx, &repository.AddDocumentCleanEntryParams{ Cleanid: cleantwoid, Version: 1, }) assert.NoError(t, err) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentID) assert.NoError(t, err) assert.Len(t, qs, 0) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentTwoID) assert.NoError(t, err) assert.Len(t, qs, 0) cleantwoentry, err := queries.GetDocumentCleanEntry(ctx, documentTwoID) assert.NoError(t, err) err = queries.AddDocumentTextEntry(ctx, &repository.AddDocumentTextEntryParams{ Version: 1, Bucket: "hi", Key: "hello", Cleanentryid: cleantwoentry.ID, }) assert.NoError(t, err) texttwoentry, err := queries.GetDocumentTextEntry(ctx, documentTwoID) assert.NoError(t, err) _, err = queries.AddResult(ctx, &repository.AddResultParams{ Queryid: contextQueryID, Value: "context_value", Textentryid: texttwoentry.ID, Queryversion: 1, }) assert.NoError(t, err) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentID) assert.NoError(t, err) assert.Len(t, qs, 0) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentTwoID) assert.NoError(t, err) assert.Len(t, qs, 1) assert.ElementsMatch(t, []pgtype.UUID{jsonQueryID}, qs) _, err = queries.AddResult(ctx, &repository.AddResultParams{ Queryid: jsonQueryID, Value: "context_value", Textentryid: texttwoentry.ID, Queryversion: 1, }) assert.NoError(t, err) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentID) assert.NoError(t, err) assert.Len(t, qs, 0) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentTwoID) assert.NoError(t, err) assert.Len(t, qs, 0) _, err = queries.AddLatestQueryVersion(ctx, jsonQueryID) assert.NoError(t, err) err = queries.AddActiveQueryVersion(ctx, &repository.AddActiveQueryVersionParams{ Queryid: jsonQueryID, Versionid: 2, }) assert.NoError(t, err) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentID) assert.NoError(t, err) assert.Len(t, qs, 1) assert.ElementsMatch(t, []pgtype.UUID{jsonQueryID}, qs) qs, err = queries.ListUnsyncedNoDepsQueriesByDocId(ctx, documentTwoID) assert.NoError(t, err) assert.Len(t, qs, 1) assert.ElementsMatch(t, []pgtype.UUID{jsonQueryID}, qs) }