diff --git a/api/queryAPI/query_test.go b/api/queryAPI/query_test.go index c2acf7c6..16365dec 100644 --- a/api/queryAPI/query_test.go +++ b/api/queryAPI/query_test.go @@ -152,18 +152,27 @@ func TestUpdateQuery(t *testing.T) { assert.Empty(t, rec.Body.String()) } +type QueryUpdateConfig struct { + serviceconfig.BaseConfig + queryversionsync.QueryVersionSyncConfig +} + func TestTestQuery(t *testing.T) { t.Parallel() - cfg := &serviceconfig.BaseConfig{} + cfg := &QueryUpdateConfig{} net := test.GetNetwork(t) test.CreateDB(t, cfg, net, &test.CreateDatabaseConfig{}) docsvc := document.New(cfg) col := collector.New(cfg) que := query.New(cfg) + queup := queryupdate.New(cfg, &queryupdate.Services{ + Query: que, + }) cons := queryapi.NewControllers(&queryapi.Services{ - Collector: col, - Query: que, + Collector: col, + Query: que, + QueryUpdate: queup, QueryTest: querytest.New(cfg, &querytest.Services{ Document: docsvc, Collector: col, @@ -239,6 +248,12 @@ func TestTestQuery(t *testing.T) { }, }) require.NoError(t, err) + c = `{"path": "mykey"}` + err = queup.Update(t.Context(), &resultprocessor.Update{ + ID: queryId, + Config: &c, + }) + require.NoError(t, err) body := queryapi.QueryTestRequest{ DocumentId: docId, @@ -252,4 +267,17 @@ func TestTestQuery(t *testing.T) { assertBody(t, rec, queryapi.QueryTestResponse{ Value: "old_value", }) + + body = queryapi.QueryTestRequest{ + DocumentId: docId, + QueryVersion: 2, + } + ctx, rec = createContextWithBody(t, body) + + err = cons.TestQuery(ctx, queryId) + require.NoError(t, err) + assert.Equal(t, http.StatusOK, rec.Code) + assertBody(t, rec, queryapi.QueryTestResponse{ + Value: "example_value", + }) } diff --git a/api/queryRunner/runner_test.go b/api/queryRunner/runner_test.go index 758b1de6..0a8ee5a7 100644 --- a/api/queryRunner/runner_test.go +++ b/api/queryRunner/runner_test.go @@ -91,10 +91,6 @@ func TestQueryRunner(t *testing.T) { pgxmock.NewRows([]string{"id", "queryId", "type", "value"}). AddRow(&requiredResultId, (*query.RequiredQueryIDs)[0], repository.QuerytypeContextFull, &strVal), ) - pool.ExpectQuery("name: GetActiveQueryConfig :one").WithArgs(query.ID).WillReturnRows( - pgxmock.NewRows([]string{"config"}). - AddRow([]byte(qcfg)), - ) pool.ExpectBegin() resultId := uuid.New() pool.ExpectQuery("name: AddResult :one").WithArgs(query.ID, pgxmock.AnyArg(), textEntryId, query.Version). diff --git a/bitbucket-pipelines.yml b/bitbucket-pipelines.yml index 281a05d0..cb1edd69 100644 --- a/bitbucket-pipelines.yml +++ b/bitbucket-pipelines.yml @@ -34,7 +34,6 @@ definitions: - touch .env - devbox install - - devbox run -- task build - devbox run -- task fullsuite pipelines: diff --git a/internal/client/create.go b/internal/client/create.go index 69b26cad..88b647e8 100644 --- a/internal/client/create.go +++ b/internal/client/create.go @@ -46,6 +46,8 @@ func (s *Service) normalizeCreate(params *CreateParams) error { return nil } +// Make sure the char ~ never makes way in as a valid client id character +// Reference bucket key filename const CLIENT_ID_REGEX = `[a-zA-Z0-9\_#-]+` func normalizeID(id *string) error { diff --git a/internal/query/get_test.go b/internal/query/get_test.go index c16894d6..58e33506 100644 --- a/internal/query/get_test.go +++ b/internal/query/get_test.go @@ -3,13 +3,16 @@ package query_test import ( "context" "testing" + "time" "queryorchestration/internal/database/repository" "queryorchestration/internal/query" resultprocessor "queryorchestration/internal/query/result/processor" "queryorchestration/internal/serviceconfig" + "queryorchestration/internal/test" "github.com/google/uuid" + "github.com/jackc/pgx/v5/pgtype" "github.com/pashagolub/pgxmock/v3" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -51,38 +54,131 @@ func TestGet(t *testing.T) { } func TestGetWithVersion(t *testing.T) { + t.Parallel() + cfg := &serviceconfig.BaseConfig{} + net := test.GetNetwork(t) + test.CreateDB(t, cfg, net, &test.CreateDatabaseConfig{}) + + err := cfg.GetDBQueries().CreateClient(t.Context(), &repository.CreateClientParams{ + Clientid: "client_id", + Name: "client_name", + }) + require.NoError(t, err) + docId, err := cfg.GetDBQueries().CreateDocument(t.Context(), &repository.CreateDocumentParams{ + Clientid: "client_id", + Hash: "hash", + }) + require.NoError(t, err) + fill := "fill" + cleanId, err := cfg.GetDBQueries().AddDocumentClean(t.Context(), &repository.AddDocumentCleanParams{ + Documentid: docId, + Bucket: &fill, + Key: &fill, + Hash: &fill, + Mimetype: repository.NullCleanmimetype{ + Valid: true, + Cleanmimetype: repository.CleanmimetypeApplicationPdf, + }, + }) + require.NoError(t, err) + err = cfg.GetDBQueries().AddDocumentCleanEntry(t.Context(), &repository.AddDocumentCleanEntryParams{ + Cleanid: cleanId, + Version: 1, + }) + require.NoError(t, err) + textId, err := cfg.GetDBQueries().AddDocumentText(t.Context(), &repository.AddDocumentTextParams{ + Cleanid: cleanId, + Bucket: fill, + Key: fill, + Hash: fill, + Createdat: pgtype.Timestamp{ + Time: time.Now(), + Valid: true, + }, + }) + require.NoError(t, err) + err = cfg.GetDBQueries().AddDocumentTextEntry(t.Context(), &repository.AddDocumentTextEntryParams{ + Textid: textId, + Version: 1, + }) + require.NoError(t, err) + contextQueryId, err := cfg.GetDBQueries().CreateQuery(t.Context(), repository.QuerytypeContextFull) + require.NoError(t, err) + contextVersion, err := cfg.GetDBQueries().AddLatestQueryVersion(t.Context(), contextQueryId) + require.NoError(t, err) + err = cfg.GetDBQueries().AddActiveQueryVersion(t.Context(), &repository.AddActiveQueryVersionParams{ + Queryid: contextQueryId, + Versionid: contextVersion, + }) + require.NoError(t, err) + queryId, err := cfg.GetDBQueries().CreateQuery(t.Context(), repository.QuerytypeJsonExtractor) + require.NoError(t, err) + latestVersion, err := cfg.GetDBQueries().AddLatestQueryVersion(t.Context(), queryId) + require.NoError(t, err) + err = cfg.GetDBQueries().AddActiveQueryVersion(t.Context(), &repository.AddActiveQueryVersionParams{ + Queryid: queryId, + Versionid: latestVersion, + }) + require.NoError(t, err) + err = cfg.GetDBQueries().AddRequiredQuery(t.Context(), &repository.AddRequiredQueryParams{ + Queryid: queryId, + Requiredqueryid: contextQueryId, + Addedversion: latestVersion, + }) + require.NoError(t, err) + c := `{"path":"oldkey"}` + err = cfg.GetDBQueries().SetQueryConfig(t.Context(), &repository.SetQueryConfigParams{ + Queryid: queryId, + Config: []byte(c), + Addedversion: latestVersion, + }) + require.NoError(t, err) + strVal := `{"mykey": "example_value", "oldkey": "old_value"}` + _, err = cfg.GetDBQueries().AddResult(t.Context(), &repository.AddResultParams{ + Queryid: contextQueryId, + Value: strVal, + Textentryid: textId, + Queryversion: contextVersion, + }) + require.NoError(t, err) + latestVersion, err = cfg.GetDBQueries().AddLatestQueryVersion(t.Context(), queryId) + require.NoError(t, err) + c = `{"path":"mykey"}` + err = cfg.GetDBQueries().SetQueryConfig(t.Context(), &repository.SetQueryConfigParams{ + Queryid: queryId, + Config: []byte(c), + Addedversion: latestVersion, + }) + require.NoError(t, err) ctx := context.Background() - pool, err := pgxmock.NewPool() - require.NoError(t, err) - cfg := &serviceconfig.BaseConfig{} - cfg.DBPool = pool - cfg.DBQueries = repository.New(pool) svc := query.New(cfg) - config := "{\"path\":\"example_path\"}" - query := query.Query{ - ID: uuid.New(), + returnQuery, err := svc.GetWithVersion(ctx, queryId, 1) + require.NoError(t, err) + config := `{"path": "oldkey"}` + assert.EqualExportedValues(t, query.Query{ + ID: queryId, Type: resultprocessor.TypeJsonExtractor, - ActiveVersion: int32(1), - LatestVersion: int32(3), + ActiveVersion: 1, + LatestVersion: 2, RequiredQueryIDs: &[]uuid.UUID{ - uuid.New(), + contextQueryId, }, Config: &config, - } + }, *returnQuery) - version := int32(2) - - dbReqIDs := *query.RequiredQueryIDs - - pool.ExpectQuery("name: GetQueryWithVersion :one").WithArgs(&query.ID, &version).WillReturnRows( - pgxmock.NewRows([]string{"id", "type", "activeVersion", "latestVersion", "config", "requiredIds"}). - AddRow(query.ID, repository.QuerytypeJsonExtractor, query.ActiveVersion, query.LatestVersion, []byte(config), dbReqIDs), - ) - - returnQuery, err := svc.GetWithVersion(ctx, query.ID, version) + returnQuery, err = svc.GetWithVersion(ctx, queryId, 2) require.NoError(t, err) - - assert.EqualExportedValues(t, query, *returnQuery) + config = `{"path": "mykey"}` + assert.EqualExportedValues(t, query.Query{ + ID: queryId, + Type: resultprocessor.TypeJsonExtractor, + ActiveVersion: 1, + LatestVersion: 2, + RequiredQueryIDs: &[]uuid.UUID{ + contextQueryId, + }, + Config: &config, + }, *returnQuery) } diff --git a/internal/query/result/get_test.go b/internal/query/result/get_test.go index 9676f806..d3c83295 100644 --- a/internal/query/result/get_test.go +++ b/internal/query/result/get_test.go @@ -1,16 +1,18 @@ package result import ( - "context" "testing" + "time" "queryorchestration/internal/database/repository" resultprocessor "queryorchestration/internal/query/result/processor" jsonextractor "queryorchestration/internal/query/types/jsonExtractor" "queryorchestration/internal/serviceconfig" + "queryorchestration/internal/serviceconfig/objectstore" + "queryorchestration/internal/test" "github.com/google/uuid" - "github.com/pashagolub/pgxmock/v3" + "github.com/jackc/pgx/v5/pgtype" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -29,33 +31,211 @@ func TestGetValueByType(t *testing.T) { } func TestGetValueWithVersion(t *testing.T) { - ctx := context.Background() + t.Run("no entry", func(t *testing.T) { + t.Parallel() + cfg := &serviceconfig.BaseConfig{} + net := test.GetNetwork(t) + test.CreateDB(t, cfg, net, &test.CreateDatabaseConfig{}) - pool, err := pgxmock.NewPool() - require.NoError(t, err) - cfg := &serviceconfig.BaseConfig{} - cfg.DBPool = pool - cfg.DBQueries = repository.New(pool) + svc := New(cfg, &Services{}) - svc := New(cfg, &Services{}) + params := &GetValueWithVersionParams{ + Type: resultprocessor.TypeJsonExtractor, + QueryID: uuid.New(), + DocumentID: uuid.New(), + QueryVersion: 1, + } - params := &GetValueWithVersionParams{ - Type: resultprocessor.TypeJsonExtractor, - QueryID: uuid.New(), - DocumentID: uuid.New(), - QueryVersion: 1, - } + _, err := svc.GetValueWithVersion(t.Context(), params) + require.EqualError(t, err, "no rows in result set") + }) + t.Run("existing entry", func(t *testing.T) { + t.Parallel() + cfg := &serviceconfig.BaseConfig{} + net := test.GetNetwork(t) + test.CreateDB(t, cfg, net, &test.CreateDatabaseConfig{}) - value := "exaple_value" - pool.ExpectQuery("name: GetResultValueWithVersion :one").WithArgs(¶ms.QueryID, ¶ms.QueryVersion, ¶ms.DocumentID). - WillReturnRows( - pgxmock.NewRows([]string{"id", "value"}). - AddRow(&uuid.UUID{}, &value), - ) + svc := New(cfg, &Services{}) - val, err := svc.GetValueWithVersion(ctx, params) - require.NoError(t, err) - v := jsonextractor.NewResult(value) - assert.Equal(t, v, val) - assert.Equal(t, value, v.GetStoreValue()) + err := cfg.GetDBQueries().CreateClient(t.Context(), &repository.CreateClientParams{ + Clientid: "client_id", + Name: "client_name", + }) + require.NoError(t, err) + docId, err := cfg.GetDBQueries().CreateDocument(t.Context(), &repository.CreateDocumentParams{ + Clientid: "client_id", + Hash: "hash", + }) + require.NoError(t, err) + filetype := "pdf" + part := uint16(1) + key := objectstore.BucketKey{ + CreatedAt: time.Now().UTC(), + ClientID: "clientid", + EntityID: uuid.New(), + Location: objectstore.Import, + Part: &part, + FileType: &filetype, + } + err = cfg.GetDBQueries().AddDocumentEntry(t.Context(), &repository.AddDocumentEntryParams{ + Documentid: docId, + Bucket: "bucket", + Key: key.String(), + }) + require.NoError(t, err) + bucket := "bucket" + hash := "hash" + keyStr := key.String() + cleanId, err := cfg.GetDBQueries().AddDocumentClean(t.Context(), &repository.AddDocumentCleanParams{ + Documentid: docId, + Bucket: &bucket, + Hash: &hash, + Key: &keyStr, + Mimetype: repository.NullCleanmimetype{ + Valid: true, + Cleanmimetype: repository.CleanmimetypeApplicationPdf, + }, + }) + require.NoError(t, err) + err = cfg.GetDBQueries().AddDocumentCleanEntry(t.Context(), &repository.AddDocumentCleanEntryParams{ + Cleanid: cleanId, + Version: 1, + }) + require.NoError(t, err) + textId, err := cfg.GetDBQueries().AddDocumentText(t.Context(), &repository.AddDocumentTextParams{ + Cleanid: cleanId, + Bucket: bucket, + Hash: hash, + Key: keyStr, + Part: part, + Createdat: pgtype.Timestamp{ + Valid: true, + Time: time.Now(), + }, + }) + require.NoError(t, err) + err = cfg.GetDBQueries().AddDocumentTextEntry(t.Context(), &repository.AddDocumentTextEntryParams{ + Textid: textId, + Version: 1, + }) + require.NoError(t, err) + queryId, err := cfg.GetDBQueries().CreateQuery(t.Context(), repository.QuerytypeJsonExtractor) + require.NoError(t, err) + queryVersion, err := cfg.GetDBQueries().AddLatestQueryVersion(t.Context(), queryId) + require.NoError(t, err) + value := "exaple_value" + _, err = cfg.GetDBQueries().AddResult(t.Context(), &repository.AddResultParams{ + Queryid: queryId, + Value: value, + Textentryid: textId, + Queryversion: queryVersion, + }) + require.NoError(t, err) + + params := &GetValueWithVersionParams{ + Type: resultprocessor.TypeJsonExtractor, + QueryID: queryId, + DocumentID: docId, + QueryVersion: 1, + } + + val, err := svc.GetValueWithVersion(t.Context(), params) + require.NoError(t, err) + v := jsonextractor.NewResult(value) + assert.Equal(t, v, val) + assert.Equal(t, value, v.GetStoreValue()) + }) + t.Run("not existing version", func(t *testing.T) { + t.Parallel() + cfg := &serviceconfig.BaseConfig{} + net := test.GetNetwork(t) + test.CreateDB(t, cfg, net, &test.CreateDatabaseConfig{}) + + svc := New(cfg, &Services{}) + + err := cfg.GetDBQueries().CreateClient(t.Context(), &repository.CreateClientParams{ + Clientid: "client_id", + Name: "client_name", + }) + require.NoError(t, err) + docId, err := cfg.GetDBQueries().CreateDocument(t.Context(), &repository.CreateDocumentParams{ + Clientid: "client_id", + Hash: "hash", + }) + require.NoError(t, err) + filetype := "pdf" + part := uint16(1) + key := objectstore.BucketKey{ + CreatedAt: time.Now().UTC(), + ClientID: "clientid", + EntityID: uuid.New(), + Location: objectstore.Import, + Part: &part, + FileType: &filetype, + } + err = cfg.GetDBQueries().AddDocumentEntry(t.Context(), &repository.AddDocumentEntryParams{ + Documentid: docId, + Bucket: "bucket", + Key: key.String(), + }) + require.NoError(t, err) + bucket := "bucket" + hash := "hash" + keyStr := key.String() + cleanId, err := cfg.GetDBQueries().AddDocumentClean(t.Context(), &repository.AddDocumentCleanParams{ + Documentid: docId, + Bucket: &bucket, + Hash: &hash, + Key: &keyStr, + Mimetype: repository.NullCleanmimetype{ + Valid: true, + Cleanmimetype: repository.CleanmimetypeApplicationPdf, + }, + }) + require.NoError(t, err) + err = cfg.GetDBQueries().AddDocumentCleanEntry(t.Context(), &repository.AddDocumentCleanEntryParams{ + Cleanid: cleanId, + Version: 1, + }) + require.NoError(t, err) + textId, err := cfg.GetDBQueries().AddDocumentText(t.Context(), &repository.AddDocumentTextParams{ + Cleanid: cleanId, + Bucket: bucket, + Hash: hash, + Key: keyStr, + Part: part, + Createdat: pgtype.Timestamp{ + Valid: true, + Time: time.Now(), + }, + }) + require.NoError(t, err) + err = cfg.GetDBQueries().AddDocumentTextEntry(t.Context(), &repository.AddDocumentTextEntryParams{ + Textid: textId, + Version: 1, + }) + require.NoError(t, err) + queryId, err := cfg.GetDBQueries().CreateQuery(t.Context(), repository.QuerytypeJsonExtractor) + require.NoError(t, err) + queryVersion, err := cfg.GetDBQueries().AddLatestQueryVersion(t.Context(), queryId) + require.NoError(t, err) + value := "exaple_value" + _, err = cfg.GetDBQueries().AddResult(t.Context(), &repository.AddResultParams{ + Queryid: queryId, + Value: value, + Textentryid: textId, + Queryversion: queryVersion, + }) + require.NoError(t, err) + + params := &GetValueWithVersionParams{ + Type: resultprocessor.TypeJsonExtractor, + QueryID: queryId, + DocumentID: docId, + QueryVersion: 2, + } + + _, err = svc.GetValueWithVersion(t.Context(), params) + require.EqualError(t, err, "no value found") + }) } diff --git a/internal/query/result/process.go b/internal/query/result/process.go index 9728036b..35c82570 100644 --- a/internal/query/result/process.go +++ b/internal/query/result/process.go @@ -47,7 +47,7 @@ func (s *Service) Process(ctx context.Context, p *Process) (resultprocessor.Valu if processQuery.RequiredQueryIDs != nil { elength = len(*processQuery.RequiredQueryIDs) } - slog.Debug("requirements", "length", len(values), "expected_length", elength) + slog.Info("requirements", "length", len(values), "expected_length", elength) } processor, err := s.getProcessor(query.Type) diff --git a/internal/query/result/process_test.go b/internal/query/result/process_test.go index 0cdc232f..c3b7e736 100644 --- a/internal/query/result/process_test.go +++ b/internal/query/result/process_test.go @@ -3,64 +3,138 @@ package result import ( "context" "testing" + "time" "queryorchestration/internal/database/repository" "queryorchestration/internal/query" resultprocessor "queryorchestration/internal/query/result/processor" jsonextractor "queryorchestration/internal/query/types/jsonExtractor" "queryorchestration/internal/serviceconfig" + "queryorchestration/internal/test" "github.com/google/uuid" + "github.com/jackc/pgx/v5/pgtype" "github.com/pashagolub/pgxmock/v3" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestProcess(t *testing.T) { - ctx := context.Background() - - pool, err := pgxmock.NewPool() - require.NoError(t, err) + t.Parallel() cfg := &serviceconfig.BaseConfig{} - cfg.DBPool = pool - cfg.DBQueries = repository.New(pool) + net := test.GetNetwork(t) + test.CreateDB(t, cfg, net, &test.CreateDatabaseConfig{}) - svc := Service{ - cfg: cfg, - svc: &Services{ - Query: query.New(cfg), + err := cfg.GetDBQueries().CreateClient(t.Context(), &repository.CreateClientParams{ + Clientid: "client_id", + Name: "client_name", + }) + require.NoError(t, err) + docId, err := cfg.GetDBQueries().CreateDocument(t.Context(), &repository.CreateDocumentParams{ + Clientid: "client_id", + Hash: "hash", + }) + require.NoError(t, err) + fill := "fill" + cleanId, err := cfg.GetDBQueries().AddDocumentClean(t.Context(), &repository.AddDocumentCleanParams{ + Documentid: docId, + Bucket: &fill, + Key: &fill, + Hash: &fill, + Mimetype: repository.NullCleanmimetype{ + Valid: true, + Cleanmimetype: repository.CleanmimetypeApplicationPdf, }, - } + }) + require.NoError(t, err) + err = cfg.GetDBQueries().AddDocumentCleanEntry(t.Context(), &repository.AddDocumentCleanEntryParams{ + Cleanid: cleanId, + Version: 1, + }) + require.NoError(t, err) + textId, err := cfg.GetDBQueries().AddDocumentText(t.Context(), &repository.AddDocumentTextParams{ + Cleanid: cleanId, + Bucket: fill, + Key: fill, + Hash: fill, + Createdat: pgtype.Timestamp{ + Time: time.Now(), + Valid: true, + }, + }) + require.NoError(t, err) + err = cfg.GetDBQueries().AddDocumentTextEntry(t.Context(), &repository.AddDocumentTextEntryParams{ + Textid: textId, + Version: 1, + }) + require.NoError(t, err) + contextQueryId, err := cfg.GetDBQueries().CreateQuery(t.Context(), repository.QuerytypeContextFull) + require.NoError(t, err) + contextVersion, err := cfg.GetDBQueries().AddLatestQueryVersion(t.Context(), contextQueryId) + require.NoError(t, err) + err = cfg.GetDBQueries().AddActiveQueryVersion(t.Context(), &repository.AddActiveQueryVersionParams{ + Queryid: contextQueryId, + Versionid: contextVersion, + }) + require.NoError(t, err) + queryId, err := cfg.GetDBQueries().CreateQuery(t.Context(), repository.QuerytypeJsonExtractor) + require.NoError(t, err) + latestVersion, err := cfg.GetDBQueries().AddLatestQueryVersion(t.Context(), queryId) + require.NoError(t, err) + err = cfg.GetDBQueries().AddActiveQueryVersion(t.Context(), &repository.AddActiveQueryVersionParams{ + Queryid: queryId, + Versionid: latestVersion, + }) + require.NoError(t, err) + err = cfg.GetDBQueries().AddRequiredQuery(t.Context(), &repository.AddRequiredQueryParams{ + Queryid: queryId, + Requiredqueryid: contextQueryId, + Addedversion: latestVersion, + }) + require.NoError(t, err) + c := `{"path":"oldkey"}` + err = cfg.GetDBQueries().SetQueryConfig(t.Context(), &repository.SetQueryConfigParams{ + Queryid: queryId, + Config: []byte(c), + Addedversion: latestVersion, + }) + require.NoError(t, err) + strVal := `{"mykey": "example_value", "oldkey": "old_value"}` + _, err = cfg.GetDBQueries().AddResult(t.Context(), &repository.AddResultParams{ + Queryid: contextQueryId, + Value: strVal, + Textentryid: textId, + Queryversion: contextVersion, + }) + require.NoError(t, err) + latestVersion, err = cfg.GetDBQueries().AddLatestQueryVersion(t.Context(), queryId) + require.NoError(t, err) + c = `{"path": "mykey"}` + err = cfg.GetDBQueries().SetQueryConfig(t.Context(), &repository.SetQueryConfigParams{ + Queryid: queryId, + Config: []byte(c), + Addedversion: latestVersion, + }) + require.NoError(t, err) - qcfg := "{\"path\":\"examplekey\"}" - query := &resultprocessor.Query{ - ID: uuid.New(), - Version: 2, - RequiredQueryIDs: &[]uuid.UUID{uuid.New()}, - Config: &qcfg, - } - params := Process{ - DocumentID: uuid.New(), - QueryID: query.ID, - QueryVersion: query.Version, - } + svc := New(cfg, &Services{ + Query: query.New(cfg), + }) - pool.ExpectQuery("name: GetQueryWithVersion :one").WithArgs(&query.ID, &query.Version).WillReturnRows( - pgxmock.NewRows([]string{"id", "type", "activeVersion", "latestVersion", "config", "requiredIds"}). - AddRow(query.ID, repository.QuerytypeJsonExtractor, query.Version, query.Version, []byte(*query.Config), *query.RequiredQueryIDs), - ) - strVal := `{"examplekey":"example_value"}` - pool.ExpectQuery("name: ListQueryRequirementValues :many").WithArgs(&query.ID, &query.Version, ¶ms.DocumentID). - WillReturnRows( - pgxmock.NewRows([]string{"id", "queryId", "type", "value"}). - AddRow(&uuid.UUID{}, query.ID, repository.QuerytypeContextFull, &strVal), - ) - pool.ExpectQuery("name: GetActiveQueryConfig :one").WithArgs(query.ID).WillReturnRows( - pgxmock.NewRows([]string{"config"}). - AddRow([]byte(qcfg)), - ) + val, err := svc.Process(t.Context(), &Process{ + DocumentID: docId, + QueryID: queryId, + QueryVersion: 1, + }) + require.NoError(t, err) + assert.NotNil(t, val) + assert.Equal(t, "old_value", val.GetStoreValue()) - val, err := svc.Process(ctx, ¶ms) + val, err = svc.Process(t.Context(), &Process{ + DocumentID: docId, + QueryID: queryId, + QueryVersion: 2, + }) require.NoError(t, err) assert.NotNil(t, val) assert.Equal(t, "example_value", val.GetStoreValue()) diff --git a/internal/query/result/set/set_test.go b/internal/query/result/set/set_test.go index feeeea29..d7cc958c 100644 --- a/internal/query/result/set/set_test.go +++ b/internal/query/result/set/set_test.go @@ -85,10 +85,6 @@ func TestSet(t *testing.T) { pgxmock.NewRows([]string{"id", "queryId", "type", "value"}). AddRow(&requiredResultId, (*query.RequiredQueryIDs)[0], repository.QuerytypeContextFull, &strVal), ) - pool.ExpectQuery("name: GetActiveQueryConfig :one").WithArgs(query.ID).WillReturnRows( - pgxmock.NewRows([]string{"config"}). - AddRow([]byte(qcfg)), - ) pool.ExpectBegin() resultId := uuid.New() pool.ExpectQuery("name: AddResult :one").WithArgs(query.ID, pgxmock.AnyArg(), textEntryId, query.Version). diff --git a/internal/query/types/jsonExtractor/process_test.go b/internal/query/types/jsonExtractor/process_test.go index 70dec59a..b2b03fd4 100644 --- a/internal/query/types/jsonExtractor/process_test.go +++ b/internal/query/types/jsonExtractor/process_test.go @@ -29,10 +29,12 @@ func TestJSONProcess(t *testing.T) { extractor := jsonextractor.NewExtractor(cfg) + config := "{\"path\":\"key\"}" query := &resultprocessor.Query{ ID: uuid.New(), Type: resultprocessor.TypeJsonExtractor, Version: int32(1), + Config: &config, } entryValue := "value" @@ -41,14 +43,6 @@ func TestJSONProcess(t *testing.T) { contextfull.NewResult(jsonString), } - config := "{\"path\":\"key\"}" - - pool.ExpectQuery("name: GetActiveQueryConfig :one").WithArgs(query.ID). - WillReturnRows( - pgxmock.NewRows([]string{"config"}). - AddRow([]byte(config)), - ) - value, err := extractor.Process(ctx, query, values) require.NoError(t, err) assert.Equal(t, entryValue, value) @@ -87,11 +81,7 @@ func TestJSONProcess(t *testing.T) { func TestJSONProcessJSON(t *testing.T) { ctx := context.Background() - pool, err := pgxmock.NewPool() - require.NoError(t, err) cfg := &serviceconfig.BaseConfig{} - cfg.DBPool = pool - cfg.DBQueries = repository.New(pool) extractor := jsonextractor.NewExtractor(cfg) @@ -107,62 +97,34 @@ func TestJSONProcessJSON(t *testing.T) { contextfull.NewResult(jsonString), } - config := "{\"path\":\"invalid_key\"}" - - pool.ExpectQuery("name: GetActiveQueryConfig :one").WithArgs(query.ID). - WillReturnRows( - pgxmock.NewRows([]string{"config"}). - AddRow([]byte(config)), - ) - value, err := extractor.Process(ctx, query, values) + assert.EqualError(t, err, "config required") + assert.Empty(t, value) + + config := "{\"path\":\"invalid_key\"}" + query.Config = &config + + value, err = extractor.Process(ctx, query, values) assert.EqualError(t, err, "JSON path does not exist: invalid_key") assert.Empty(t, value) config = "" - pool.ExpectQuery("name: GetActiveQueryConfig :one").WithArgs(query.ID). - WillReturnRows( - pgxmock.NewRows([]string{"config"}). - AddRow([]byte(config)), - ) - value, err = extractor.Process(ctx, query, values) assert.EqualError(t, err, "unexpected end of JSON input") assert.Empty(t, value) config = "{\"path\":\"\"}" - pool.ExpectQuery("name: GetActiveQueryConfig :one").WithArgs(query.ID). - WillReturnRows( - pgxmock.NewRows([]string{"config"}). - AddRow([]byte(config)), - ) - value, err = extractor.Process(ctx, query, values) assert.EqualError(t, err, "JSON path does not exist: ") assert.Empty(t, value) config = "{\"path\":}" - pool.ExpectQuery("name: GetActiveQueryConfig :one").WithArgs(query.ID). - WillReturnRows( - pgxmock.NewRows([]string{"config"}). - AddRow([]byte(config)), - ) - value, err = extractor.Process(ctx, query, values) assert.EqualError(t, err, "invalid character '}' looking for beginning of value") assert.Empty(t, value) - - pool.ExpectQuery("name: GetActiveQueryConfig :one").WithArgs(query.ID). - WillReturnRows( - pgxmock.NewRows([]string{"config"}), - ) - - value, err = extractor.Process(ctx, query, values) - assert.EqualError(t, err, "no rows in result set") - assert.Empty(t, value) } func TestJSONProcessResults(t *testing.T) { diff --git a/internal/query/types/jsonExtractor/service.go b/internal/query/types/jsonExtractor/service.go index 840174e7..6145ef4c 100644 --- a/internal/query/types/jsonExtractor/service.go +++ b/internal/query/types/jsonExtractor/service.go @@ -26,6 +26,8 @@ func NewExtractor(cfg serviceconfig.ConfigProvider) *Extractor { func (e *Extractor) Process(ctx context.Context, query *resultprocessor.Query, values []resultprocessor.Value) (string, error) { if len(values) != 1 { return "", fmt.Errorf("JSON Extraction requires 1 result") + } else if query.Config == nil { + return "", fmt.Errorf("config required") } value, err := values[0].GetValue(ctx) @@ -33,13 +35,8 @@ func (e *Extractor) Process(ctx context.Context, query *resultprocessor.Query, v return "", err } - byteConfig, err := e.cfg.GetDBQueries().GetActiveQueryConfig(ctx, query.ID) - if err != nil { - return "", err - } - var config Config - err = json.Unmarshal(byteConfig, &config) + err = json.Unmarshal([]byte(*query.Config), &config) if err != nil { return "", err } diff --git a/internal/test/api.go b/internal/test/api.go index 7795e27d..33d9c855 100644 --- a/internal/test/api.go +++ b/internal/test/api.go @@ -7,7 +7,6 @@ import ( "net/http" "testing" - queryapi "queryorchestration/api/queryAPI" "queryorchestration/internal/serviceconfig" "github.com/docker/go-connections/nat" @@ -18,7 +17,7 @@ import ( type APIName string const ( - QueryAPIName APIName = queryapi.Name + QueryAPIName APIName = "queryAPI" ) type API struct { diff --git a/internal/test/runner.go b/internal/test/runner.go index 24a3962c..310f0246 100644 --- a/internal/test/runner.go +++ b/internal/test/runner.go @@ -4,16 +4,6 @@ import ( "context" "testing" - clientsyncrunner "queryorchestration/api/clientSyncRunner" - doccleanrunner "queryorchestration/api/docCleanRunner" - docinitrunner "queryorchestration/api/docInitRunner" - docsyncrunner "queryorchestration/api/docSyncRunner" - doctextrunner "queryorchestration/api/docTextRunner" - queryrunner "queryorchestration/api/queryRunner" - querysyncrunner "queryorchestration/api/querySyncRunner" - queryversionsyncrunner "queryorchestration/api/queryVersionSyncRunner" - storeeventrunner "queryorchestration/api/storeEventRunner" - "queryorchestration/internal/serviceconfig" "queryorchestration/internal/serviceconfig/queue/clientsync" "queryorchestration/internal/serviceconfig/queue/documentclean" @@ -29,15 +19,15 @@ import ( type RunnerName string const ( - StoreEventRunnerName RunnerName = storeeventrunner.Name - DocInitRunnerName RunnerName = docinitrunner.Name - DocSyncRunnerName RunnerName = docsyncrunner.Name - DocCleanRunnerName RunnerName = doccleanrunner.Name - DocTextRunnerName RunnerName = doctextrunner.Name - QuerySyncRunnerName RunnerName = querysyncrunner.Name - QueryRunnerName RunnerName = queryrunner.Name - ClientSyncRunnerName RunnerName = clientsyncrunner.Name - QueryVersionSyncRunnerName RunnerName = queryversionsyncrunner.Name + StoreEventRunnerName RunnerName = "storeEventRunner" + DocInitRunnerName RunnerName = "docInitRunner" + DocSyncRunnerName RunnerName = "docSyncRunner" + DocCleanRunnerName RunnerName = "docCleanRunner" + DocTextRunnerName RunnerName = "docTextRunner" + QuerySyncRunnerName RunnerName = "querySyncRunner" + QueryRunnerName RunnerName = "queryRunner" + ClientSyncRunnerName RunnerName = "clientSyncRunner" + QueryVersionSyncRunnerName RunnerName = "queryVersionSyncRunner" ) type RunnerEnv string diff --git a/scripts/Taskfile.yml b/scripts/Taskfile.yml index 3ce7a202..65ce5c7a 100644 --- a/scripts/Taskfile.yml +++ b/scripts/Taskfile.yml @@ -26,6 +26,7 @@ includes: tasks: fullsuite: - task: build:deps + - task: docker:build - task: fullsuite:test fullsuite:test: internal: true diff --git a/scripts/tests.yml b/scripts/tests.yml index 505c49b5..48ead936 100644 --- a/scripts/tests.yml +++ b/scripts/tests.yml @@ -40,20 +40,20 @@ tasks: cmds: - mkdir -p {{.OUT_DIR}} - | - GOMAXPROCS={{.TEST_PARALLEL}} go test -count=1 -parallel {{.CPU_COUNT}} \ + GOMAXPROCS={{.TEST_PARALLEL}} go test -parallel {{.CPU_COUNT}} \ -coverpkg={{.INTERNAL}},{{.API}},{{.PKG}} \ -coverprofile={{.COVERAGE_FILE}} \ ./... - task: coverage race: cmds: - - GOMAXPROCS={{.TEST_PARALLEL}} go test -count=1 -parallel {{.CPU_COUNT}} -race ./... + - GOMAXPROCS={{.TEST_PARALLEL}} go test -parallel {{.CPU_COUNT}} -race ./... perf: vars: NUM_RESULTS: 5 cmds: - | - GOMAXPROCS={{.TEST_PARALLEL}} go test -count=1 -parallel {{.CPU_COUNT}} -json ./... \ + GOMAXPROCS={{.TEST_PARALLEL}} go test -parallel {{.CPU_COUNT}} -count=1 -json ./... \ > {{.TEST_FILE}} - | echo -e "🐢 TOP {{.NUM_RESULTS}} SLOWEST INDIVIDUAL PACKAGE RUNS:" diff --git a/test/process_test.go b/test/process_test.go index 968b5388..50a1ce2b 100644 --- a/test/process_test.go +++ b/test/process_test.go @@ -25,133 +25,284 @@ type Config struct { } func TestProcess(t *testing.T) { - cfg := &Config{} + t.Run("basic upload", func(t *testing.T) { + t.Parallel() + cfg := &Config{} - net, clean := test.CreateFullNetwork(t, t.Context(), cfg) - defer clean() + net, clean := test.CreateFullNetwork(t, t.Context(), cfg) + defer clean() - var wg sync.WaitGroup - var clientId queryapi.ClientID - var jsonId queryapi.QueryID - var textractExpectation test.MockExpectation - textractBody := "Hello World" - wg.Add(3) - go func(t testing.TB) { - _, jsonId = queryapitest.CreateDependentQueries(t, net.Client) - wg.Done() - }(t) - go func(t testing.TB) { - clientId = queryapitest.CreateClientWithSync(t, net.Client) - wg.Done() - }(t) - go func(t testing.TB) { - textractExpectation = test.CreateDetectDocumentTextExpectation( - t, - net.Dependencies.MockServer, - textractBody, - ) - wg.Done() - }(t) + var wg sync.WaitGroup + var clientId queryapi.ClientID + var jsonId queryapi.QueryID + var textractExpectation test.MockExpectation + textractBody := "Hello World" + wg.Add(3) + go func(t testing.TB) { + _, jsonId = queryapitest.CreateDependentQueries(t, net.Client) + wg.Done() + }(t) + go func(t testing.TB) { + clientId = queryapitest.CreateClientWithSync(t, net.Client) + wg.Done() + }(t) + go func(t testing.TB) { + textractExpectation = test.CreateDetectDocumentTextExpectation( + t, + net.Dependencies.MockServer, + textractBody, + ) + wg.Done() + }(t) - wg.Wait() + wg.Wait() - queryapitest.SetQueryForClient(t, net.Client, clientId, jsonId) + queryapitest.SetQueryForClient(t, net.Client, clientId, jsonId) - part := uint16(0) - importKey := objectstore.BucketKey{ - ClientID: clientId, - EntityID: uuid.New(), - Location: objectstore.Import, - CreatedAt: time.Now().UTC(), - Part: &part, - } - inputFile := strings.NewReader(pdfHelloWorld) - test.PutObject(t, t.Context(), cfg, test.PutObjectParams{ - File: inputFile, - Key: importKey, + part := uint16(0) + importKey := objectstore.BucketKey{ + ClientID: clientId, + EntityID: uuid.New(), + Location: objectstore.Import, + CreatedAt: time.Now().UTC(), + Part: &part, + } + inputFile := strings.NewReader(pdfHelloWorld) + test.PutObject(t, t.Context(), cfg, test.PutObjectParams{ + File: inputFile, + Key: importKey, + }) + + test.WaitForMockEndpoint(t, net.Dependencies.MockServer, textractExpectation.Request) + textKey := objectstore.BucketKey{ + ClientID: clientId, + EntityID: uuid.New(), + Location: objectstore.Text, + CreatedAt: time.Now().UTC(), + Part: &part, + } + inputFile = strings.NewReader(textractBody) + test.PutObject(t, t.Context(), cfg, test.PutObjectParams{ + File: inputFile, + Key: textKey, + }) + + queryapitest.WaitForClientStatus(t, t.Context(), net.Client, clientId, queryapi.INSYNC) + + docs, err := net.Client.ListDocumentsByClientIdWithResponse(t.Context(), clientId) + require.NoError(t, err) + assert.Len(t, *docs.JSON200, 1) + doc := (*docs.JSON200)[0] + + expectedDoc := queryapi.Document{ + Id: doc.Id, + Hash: doc.Hash, + ClientId: clientId, + Fields: map[string]any{ + "JSON_QUERY": "valueone", + }, + } + + docRes, err := net.Client.GetDocumentWithResponse(t.Context(), doc.Id) + require.NoError(t, err) + require.NotNil(t, docRes) + require.NotNil(t, docRes.JSON200) + fullDoc := *docRes.JSON200 + assert.EqualExportedValues(t, expectedDoc, fullDoc) }) + t.Run("update config", func(t *testing.T) { + t.Parallel() + cfg := &Config{} - test.WaitForMockEndpoint(t, net.Dependencies.MockServer, textractExpectation.Request) - textKey := objectstore.BucketKey{ - ClientID: clientId, - EntityID: uuid.New(), - Location: objectstore.Text, - CreatedAt: time.Now().UTC(), - Part: &part, - } - inputFile = strings.NewReader(textractBody) - test.PutObject(t, t.Context(), cfg, test.PutObjectParams{ - File: inputFile, - Key: textKey, - }) + net, clean := test.CreateFullNetwork(t, t.Context(), cfg) + defer clean() - queryapitest.WaitForClientStatus(t, t.Context(), net.Client, clientId, queryapi.INSYNC) + var wg sync.WaitGroup + var clientId queryapi.ClientID + var jsonId queryapi.QueryID + var textractExpectation test.MockExpectation + textractBody := "Hello World" + wg.Add(3) + go func(t testing.TB) { + _, jsonId = queryapitest.CreateDependentQueries(t, net.Client) + wg.Done() + }(t) + go func(t testing.TB) { + clientId = queryapitest.CreateClientWithSync(t, net.Client) + wg.Done() + }(t) + go func(t testing.TB) { + textractExpectation = test.CreateDetectDocumentTextExpectation( + t, + net.Dependencies.MockServer, + textractBody, + ) + wg.Done() + }(t) - docs, err := net.Client.ListDocumentsByClientIdWithResponse(t.Context(), clientId) - require.NoError(t, err) - assert.Len(t, *docs.JSON200, 1) - doc := (*docs.JSON200)[0] + wg.Wait() - expectedDoc := queryapi.Document{ - Id: doc.Id, - Hash: doc.Hash, - ClientId: clientId, - Fields: map[string]any{ - "JSON_QUERY": "valueone", - }, - } + queryapitest.SetQueryForClient(t, net.Client, clientId, jsonId) - docRes, err := net.Client.GetDocumentWithResponse(t.Context(), doc.Id) - require.NoError(t, err) - require.NotNil(t, docRes) - require.NotNil(t, docRes.JSON200) - fullDoc := *docRes.JSON200 - assert.EqualExportedValues(t, expectedDoc, fullDoc) + part := uint16(0) + importKey := objectstore.BucketKey{ + ClientID: clientId, + EntityID: uuid.New(), + Location: objectstore.Import, + CreatedAt: time.Now().UTC(), + Part: &part, + } + inputFile := strings.NewReader(pdfHelloWorld) + test.PutObject(t, t.Context(), cfg, test.PutObjectParams{ + File: inputFile, + Key: importKey, + }) - jcfg := `{"path":"keytwo"}` - av := int32(2) - _, err = net.Client.UpdateQueryWithResponse(t.Context(), jsonId, queryapi.QueryUpdate{ - ActiveVersion: &av, - Config: &jcfg, - }) - require.NoError(t, err) - expectedDoc.Fields = map[string]any{ - "JSON_QUERY": "valuetwo", - } + test.WaitForMockEndpoint(t, net.Dependencies.MockServer, textractExpectation.Request) + textKey := objectstore.BucketKey{ + ClientID: clientId, + EntityID: uuid.New(), + Location: objectstore.Text, + CreatedAt: time.Now().UTC(), + Part: &part, + } + inputFile = strings.NewReader(textractBody) + test.PutObject(t, t.Context(), cfg, test.PutObjectParams{ + File: inputFile, + Key: textKey, + }) - queryapitest.WaitForClientStatus(t, t.Context(), net.Client, clientId, queryapi.INSYNC) + queryapitest.WaitForClientStatus(t, t.Context(), net.Client, clientId, queryapi.INSYNC) - wg.Add(3) - go func(t testing.TB) { - docRes, err = net.Client.GetDocumentWithResponse(t.Context(), doc.Id) + jcfg := `{"path":"keytwo"}` + av := int32(2) + _, err := net.Client.UpdateQueryWithResponse(t.Context(), jsonId, queryapi.QueryUpdate{ + ActiveVersion: &av, + Config: &jcfg, + }) + require.NoError(t, err) + + queryapitest.WaitForClientStatus(t, t.Context(), net.Client, clientId, queryapi.INSYNC) + + docs, err := net.Client.ListDocumentsByClientIdWithResponse(t.Context(), clientId) + require.NoError(t, err) + assert.Len(t, *docs.JSON200, 1) + doc := (*docs.JSON200)[0] + + expectedDoc := queryapi.Document{ + Id: doc.Id, + Hash: doc.Hash, + ClientId: clientId, + Fields: map[string]any{ + "JSON_QUERY": "valuetwo", + }, + } + + docRes, err := net.Client.GetDocumentWithResponse(t.Context(), doc.Id) require.NoError(t, err) require.NotNil(t, docRes) require.NotNil(t, docRes.JSON200) assert.EqualExportedValues(t, expectedDoc, *docRes.JSON200) - wg.Done() - }(t) + }) + t.Run("test multiple versions", func(t *testing.T) { + t.Parallel() + cfg := &Config{} - go func(t testing.TB) { - testRes, err := net.Client.TestQueryWithResponse(t.Context(), jsonId, queryapi.QueryTestRequest{ - QueryVersion: 1, - DocumentId: doc.Id, + net, clean := test.CreateFullNetwork(t, t.Context(), cfg) + defer clean() + + var wg sync.WaitGroup + var clientId queryapi.ClientID + var jsonId queryapi.QueryID + var textractExpectation test.MockExpectation + textractBody := "Hello World" + wg.Add(3) + go func(t testing.TB) { + _, jsonId = queryapitest.CreateDependentQueries(t, net.Client) + + jcfg := `{"path":"keytwo"}` + _, err := net.Client.UpdateQueryWithResponse(t.Context(), jsonId, queryapi.QueryUpdate{ + Config: &jcfg, + }) + require.NoError(t, err) + + wg.Done() + }(t) + go func(t testing.TB) { + clientId = queryapitest.CreateClientWithSync(t, net.Client) + wg.Done() + }(t) + go func(t testing.TB) { + textractExpectation = test.CreateDetectDocumentTextExpectation( + t, + net.Dependencies.MockServer, + textractBody, + ) + wg.Done() + }(t) + + wg.Wait() + + queryapitest.SetQueryForClient(t, net.Client, clientId, jsonId) + + part := uint16(0) + importKey := objectstore.BucketKey{ + ClientID: clientId, + EntityID: uuid.New(), + Location: objectstore.Import, + CreatedAt: time.Now().UTC(), + Part: &part, + } + inputFile := strings.NewReader(pdfHelloWorld) + test.PutObject(t, t.Context(), cfg, test.PutObjectParams{ + File: inputFile, + Key: importKey, }) - require.NoError(t, err) - assert.Equal(t, "valueone", testRes.JSON200.Value) - wg.Done() - }(t) - go func(t testing.TB) { - testRes, err := net.Client.TestQueryWithResponse(t.Context(), jsonId, queryapi.QueryTestRequest{ - QueryVersion: 2, - DocumentId: doc.Id, + test.WaitForMockEndpoint(t, net.Dependencies.MockServer, textractExpectation.Request) + textKey := objectstore.BucketKey{ + ClientID: clientId, + EntityID: uuid.New(), + Location: objectstore.Text, + CreatedAt: time.Now().UTC(), + Part: &part, + } + inputFile = strings.NewReader(textractBody) + test.PutObject(t, t.Context(), cfg, test.PutObjectParams{ + File: inputFile, + Key: textKey, }) - require.NoError(t, err) - assert.Equal(t, "valuetwo", testRes.JSON200.Value) - wg.Done() - }(t) - wg.Wait() + queryapitest.WaitForClientStatus(t, t.Context(), net.Client, clientId, queryapi.INSYNC) + + docs, err := net.Client.ListDocumentsByClientIdWithResponse(t.Context(), clientId) + require.NoError(t, err) + assert.Len(t, *docs.JSON200, 1) + doc := (*docs.JSON200)[0] + + wg.Add(2) + go func(t testing.TB) { + testRes, err := net.Client.TestQueryWithResponse(t.Context(), jsonId, queryapi.QueryTestRequest{ + QueryVersion: 1, + DocumentId: doc.Id, + }) + require.NoError(t, err) + assert.Equal(t, "valueone", testRes.JSON200.Value) + wg.Done() + }(t) + + go func(t testing.TB) { + testRes, err := net.Client.TestQueryWithResponse(t.Context(), jsonId, queryapi.QueryTestRequest{ + QueryVersion: 2, + DocumentId: doc.Id, + }) + require.NoError(t, err) + assert.Equal(t, "valuetwo", testRes.JSON200.Value) + wg.Done() + }(t) + + wg.Wait() + }) } const pdfHelloWorld = `%PDF-1.4