diff --git a/runner/src/integrationTest/kotlin/com/cosmotech/runner/service/RunnerServiceIntegrationTest.kt b/runner/src/integrationTest/kotlin/com/cosmotech/runner/service/RunnerServiceIntegrationTest.kt index 77896c860..1f4be777e 100644 --- a/runner/src/integrationTest/kotlin/com/cosmotech/runner/service/RunnerServiceIntegrationTest.kt +++ b/runner/src/integrationTest/kotlin/com/cosmotech/runner/service/RunnerServiceIntegrationTest.kt @@ -28,6 +28,7 @@ import com.cosmotech.dataset.domain.DatasetCreateRequest import com.cosmotech.dataset.domain.DatasetPart import com.cosmotech.dataset.domain.DatasetPartCreateRequest import com.cosmotech.dataset.domain.DatasetPartTypeEnum +import com.cosmotech.dataset.domain.DatasetPartUpdateRequest import com.cosmotech.organization.OrganizationApiServiceInterface import com.cosmotech.organization.domain.Organization import com.cosmotech.organization.domain.OrganizationAccessControl @@ -89,6 +90,7 @@ class RunnerServiceIntegrationTest : CsmTestBase() { val CONNECTED_READER_USER = "test.reader@cosmotech.com" val TEST_USER_MAIL = "fake@mail.fr" val CUSTOMERS_FILE_NAME = "customers.csv" + val CUSTOMERS_5_LINES_FILE_NAME = "customers_5_lines.csv" private val logger = LoggerFactory.getLogger(RunnerServiceIntegrationTest::class.java) private val defaultName = "my.account-tester@cosmotech.com" @@ -1007,7 +1009,7 @@ class RunnerServiceIntegrationTest : CsmTestBase() { } @Test - fun `test empty inherited parameters values`() { + fun `test empty inherited parameters values from parent`() { val parentRunnerWithEmptyParams = makeRunnerCreateRequest(name = "parent") val parentRunnerSaved = runnerApiService.createRunner( @@ -1040,6 +1042,210 @@ class RunnerServiceIntegrationTest : CsmTestBase() { mutableListOf(runTemplateParameterValue1), childRunnerWithEmptyParamsSaved.parametersValues) } + @Test + fun `test create runner with inherited DB dataset parameter from workspace solution`() { + + solutionSaved = + solutionApiService.createSolution( + organizationSaved.id, + SolutionCreateRequest( + key = UUID.randomUUID().toString(), + name = "Solution with 1 default datasetPart parameter", + parameterGroups = + mutableListOf( + RunTemplateParameterGroupCreateRequest( + id = "defaultDatasetPartParameterGroup", + parameters = mutableListOf("datasetPartParam"))), + parameters = + mutableListOf( + RunTemplateParameterCreateRequest( + id = "datasetPartParam", + defaultValue = "this_value_is_ignored", + varType = DATASET_PART_VARTYPE_DB)), + runTemplates = + mutableListOf( + RunTemplateCreateRequest( + id = "runTemplateWithOneDatasetPartByDefault", + parameterGroups = mutableListOf("defaultDatasetPartParameterGroup"))), + repository = "repository", + version = "1.0.0")) + workspace = + WorkspaceCreateRequest( + key = "key", + name = "workspace", + solution = WorkspaceSolution(solutionSaved.id), + datasetCopy = false) + workspaceSaved = workspaceApiService.createWorkspace(organizationSaved.id, workspace) + + val customersFile = resourceLoader.getResource("classpath:/$CUSTOMERS_FILE_NAME").file + val customersInputStream = FileInputStream(customersFile) + val customersMultipartFile = + MockMultipartFile( + "file", CUSTOMERS_FILE_NAME, "text/csv", IOUtils.toByteArray(customersInputStream)) + val workspaceDataset = + datasetApiService.createDataset( + organizationSaved.id, + workspaceSaved.id, + DatasetCreateRequest( + name = "runnerDataset", + parts = + mutableListOf( + DatasetPartCreateRequest( + name = "datasetPart1", + sourceName = CUSTOMERS_FILE_NAME, + type = DatasetPartTypeEnum.DB))), + arrayOf(customersMultipartFile)) + workspaceSaved = + workspaceApiService.updateWorkspace( + organizationSaved.id, + workspaceSaved.id, + WorkspaceUpdateRequest( + solution = + WorkspaceSolution( + solutionId = solutionSaved.id, + datasetId = workspaceDataset.id, + defaultParameterValues = + mutableMapOf("datasetPartParam" to workspaceDataset.parts[0].id)))) + + val runner = + runnerApiService.createRunner( + organizationSaved.id, + workspaceSaved.id, + makeRunnerCreateRequest(runTemplateId = "runTemplateWithOneDatasetPartByDefault")) + + val runnerDatasetId = runner.datasets.parameter + val runnerDataset = + datasetApiService.getDataset(organizationSaved.id, workspaceSaved.id, runnerDatasetId) + val inheritedRunnerDatasetPartContent = + datasetApiService.downloadDatasetPart( + organizationSaved.id, workspaceSaved.id, runnerDataset.id, runnerDataset.parts[0].id) + val expectedText = FileInputStream(customersFile).bufferedReader().use { it.readText() } + val retrievedText = + InputStreamResource(inheritedRunnerDatasetPartContent).inputStream.bufferedReader().use { + it.readText() + } + assertEquals(expectedText, retrievedText) + } + + @Test + fun `test create runner with inherited DB dataset parameter from parent`() { + + solutionSaved = + solutionApiService.createSolution( + organizationSaved.id, + SolutionCreateRequest( + key = UUID.randomUUID().toString(), + name = "Solution with 1 default datasetPart parameter", + parameterGroups = + mutableListOf( + RunTemplateParameterGroupCreateRequest( + id = "defaultDatasetPartParameterGroup", + parameters = mutableListOf("datasetPartParam"))), + parameters = + mutableListOf( + RunTemplateParameterCreateRequest( + id = "datasetPartParam", + defaultValue = "this_value_is_ignored", + varType = DATASET_PART_VARTYPE_DB)), + runTemplates = + mutableListOf( + RunTemplateCreateRequest( + id = "runTemplateWithOneDatasetPartByDefault", + parameterGroups = mutableListOf("defaultDatasetPartParameterGroup"))), + repository = "repository", + version = "1.0.0")) + workspace = + WorkspaceCreateRequest( + key = "key", + name = "workspace", + solution = WorkspaceSolution(solutionSaved.id), + datasetCopy = false) + workspaceSaved = workspaceApiService.createWorkspace(organizationSaved.id, workspace) + + val customersFile = resourceLoader.getResource("classpath:/$CUSTOMERS_FILE_NAME").file + val customersInputStream = FileInputStream(customersFile) + val customersMultipartFile = + MockMultipartFile( + "file", CUSTOMERS_FILE_NAME, "text/csv", IOUtils.toByteArray(customersInputStream)) + val workspaceDataset = + datasetApiService.createDataset( + organizationSaved.id, + workspaceSaved.id, + DatasetCreateRequest( + name = "runnerDataset", + parts = + mutableListOf( + DatasetPartCreateRequest( + name = "datasetPart1", + sourceName = CUSTOMERS_FILE_NAME, + type = DatasetPartTypeEnum.DB))), + arrayOf(customersMultipartFile)) + workspaceSaved = + workspaceApiService.updateWorkspace( + organizationSaved.id, + workspaceSaved.id, + WorkspaceUpdateRequest( + solution = + WorkspaceSolution( + solutionId = solutionSaved.id, + datasetId = workspaceDataset.id, + defaultParameterValues = + mutableMapOf("datasetPartParam" to workspaceDataset.parts[0].id)))) + + val runner = + runnerApiService.createRunner( + organizationSaved.id, + workspaceSaved.id, + makeRunnerCreateRequest(runTemplateId = "runTemplateWithOneDatasetPartByDefault")) + + val runnerDatasetId = runner.datasets.parameter + val runnerDataset = + datasetApiService.getDataset(organizationSaved.id, workspaceSaved.id, runnerDatasetId) + + val customers5File = resourceLoader.getResource("classpath:/$CUSTOMERS_5_LINES_FILE_NAME").file + val customers5InputStream = FileInputStream(customers5File) + val customers5MultipartFile = + MockMultipartFile( + "file", + CUSTOMERS_5_LINES_FILE_NAME, + "text/csv", + IOUtils.toByteArray(customers5InputStream)) + + val runnerDatasetPartId = runnerDataset.parts[0].id + + datasetApiService.replaceDatasetPart( + organizationSaved.id, + workspaceSaved.id, + runnerDataset.id, + runnerDatasetPartId, + customers5MultipartFile, + DatasetPartUpdateRequest(sourceName = CUSTOMERS_5_LINES_FILE_NAME)) + + val childRunner = + runnerApiService.createRunner( + organizationSaved.id, + workspaceSaved.id, + makeRunnerCreateRequest( + runTemplateId = "runTemplateWithOneDatasetPartByDefault", parentId = runner.id)) + + val childRunnerDatasetId = childRunner.datasets.parameter + val childRunnerDataset = + datasetApiService.getDataset(organizationSaved.id, workspaceSaved.id, childRunnerDatasetId) + + val childRunnerDatasetPartContent = + datasetApiService.downloadDatasetPart( + organizationSaved.id, + workspaceSaved.id, + childRunnerDataset.id, + childRunnerDataset.parts[0].id) + val expectedText = FileInputStream(customers5File).bufferedReader().use { it.readText() } + val retrievedText = + InputStreamResource(childRunnerDatasetPartContent).inputStream.bufferedReader().use { + it.readText() + } + assertEquals(expectedText, retrievedText) + } + @Test fun `startRun send event`() { val expectedRunId = "run-genid12345" diff --git a/runner/src/integrationTest/resources/application-runner-test.yml b/runner/src/integrationTest/resources/application-runner-test.yml index ad1951d0e..77504c795 100644 --- a/runner/src/integrationTest/resources/application-runner-test.yml +++ b/runner/src/integrationTest/resources/application-runner-test.yml @@ -115,11 +115,12 @@ csm: host: "localhost" port: 5432 reader: - password: "password" + password: "cosmotech_api_reader_pass" username: cosmotech_api_reader writer: - password: "password" + password: "cosmotech_api_writer_pass" username: cosmotech_api_writer + database: "test" rbac: enabled: true s3: diff --git a/runner/src/integrationTest/resources/customers.csv b/runner/src/integrationTest/resources/customers.csv index 864acbae2..cb2dada45 100644 --- a/runner/src/integrationTest/resources/customers.csv +++ b/runner/src/integrationTest/resources/customers.csv @@ -8,4 +8,4 @@ CUST006,FastFix Auto,Isabelle Dubois,Service Manager,42 Garage Loop,Montréal,QC CUST007,Garden Glow Ltd,Ellie Tan,Product Specialist,180 Daisy St,Burnside,NSW,2135,Australia,02-8000-1122 CUST008,Evergreen Crafts,Jasper Lee,Owner,96 Willow Way,Lakeside,BC,V2V 4W1,Canada,604-800-9988 CUST009,Peak Fitness Inc,Monica Anders,Marketing Lead,311 Summit Ave,Cascade,WA,98101,USA,206-777-5544 -CUST010,Silverline Media,Nikhil Ajay,Account Executive,845 Market Plaza,Redhill,ENG,RH1 6JT,UK,020-7123-4098 \ No newline at end of file +CUST010,Silverline Media,Nikhil Ajay,Account Executive,845 Market Plaza,Redhill,ENG,RH1 6JT,UK,020-7123-4098 diff --git a/runner/src/integrationTest/resources/customers_5_lines.csv b/runner/src/integrationTest/resources/customers_5_lines.csv new file mode 100644 index 000000000..89cde7c62 --- /dev/null +++ b/runner/src/integrationTest/resources/customers_5_lines.csv @@ -0,0 +1,6 @@ +customerID,companyName,contactName,contactTitle,address,city,region,postalCode,country,phone +CUST001,Blueberry Tech,Alex Greenwood,CTO,1412 Pine St,Oakridge,CA,93561,USA,555-123-4560 +CUST002,Riverbend Logistics,Taylor Morris,Operations Lead,89 North Ave,Greendale,NY,11105,USA,555-987-6521 +CUST003,Sunrise Foods,Jordan Liu,Procurement Manager,220 Cherry Road,Springdale,TX,75010,USA,555-210-7895 +CUST004,Skyline Textiles,Maria Petrova,Sales Director,501 Textile Lane,Newpark,FL,33012,USA,555-313-9240 +CUST005,Crimson Solutions,Samuel Evans,CEO,77 Baker Blvd,Woodport,GA,30310,USA,555-825-2555 diff --git a/runner/src/integrationTest/resources/init-db.sql b/runner/src/integrationTest/resources/init-db.sql index 783692013..960cb74cc 100644 --- a/runner/src/integrationTest/resources/init-db.sql +++ b/runner/src/integrationTest/resources/init-db.sql @@ -1,2 +1,8 @@ -CREATE USER readusertest WITH PASSWORD 'readusertest'; -CREATE USER writeusertest WITH PASSWORD 'writeusertest'; \ No newline at end of file +CREATE ROLE cosmotech_api_reader WITH LOGIN PASSWORD 'cosmotech_api_reader_pass'; +CREATE ROLE cosmotech_api_writer WITH LOGIN PASSWORD 'cosmotech_api_writer_pass'; +CREATE ROLE cosmotech_api_admin WITH LOGIN PASSWORD 'cosmotech_api_admin_pass'; + +CREATE SCHEMA inputs AUTHORIZATION cosmotech_api_writer; +CREATE SCHEMA outputs AUTHORIZATION cosmotech_api_writer; +GRANT USAGE ON SCHEMA inputs TO cosmotech_api_reader; +GRANT USAGE ON SCHEMA outputs TO cosmotech_api_reader;