Skip to content

Commit e3efbee

Browse files
committed
Add integration tests for inherited DB dataset parameters
- Added new test cases to validate runner creation with inherited dataset parameters. - Extended tests to handle solution modifications between parent and child runner creation. - Updated database initialization script to include schema creation and role-based permissions. - Adjusted authentication-related configurations in test resources.
1 parent 6d7bafd commit e3efbee

File tree

5 files changed

+225
-6
lines changed

5 files changed

+225
-6
lines changed

runner/src/integrationTest/kotlin/com/cosmotech/runner/service/RunnerServiceIntegrationTest.kt

Lines changed: 207 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.cosmotech.dataset.domain.DatasetCreateRequest
2828
import com.cosmotech.dataset.domain.DatasetPart
2929
import com.cosmotech.dataset.domain.DatasetPartCreateRequest
3030
import com.cosmotech.dataset.domain.DatasetPartTypeEnum
31+
import com.cosmotech.dataset.domain.DatasetPartUpdateRequest
3132
import com.cosmotech.organization.OrganizationApiServiceInterface
3233
import com.cosmotech.organization.domain.Organization
3334
import com.cosmotech.organization.domain.OrganizationAccessControl
@@ -89,6 +90,7 @@ class RunnerServiceIntegrationTest : CsmTestBase() {
8990
val CONNECTED_READER_USER = "[email protected]"
9091
val TEST_USER_MAIL = "[email protected]"
9192
val CUSTOMERS_FILE_NAME = "customers.csv"
93+
val CUSTOMERS_5_LINES_FILE_NAME = "customers_5_lines.csv"
9294

9395
private val logger = LoggerFactory.getLogger(RunnerServiceIntegrationTest::class.java)
9496
private val defaultName = "[email protected]"
@@ -1007,7 +1009,7 @@ class RunnerServiceIntegrationTest : CsmTestBase() {
10071009
}
10081010

10091011
@Test
1010-
fun `test empty inherited parameters values`() {
1012+
fun `test empty inherited parameters values from parent`() {
10111013
val parentRunnerWithEmptyParams = makeRunnerCreateRequest(name = "parent")
10121014
val parentRunnerSaved =
10131015
runnerApiService.createRunner(
@@ -1040,6 +1042,210 @@ class RunnerServiceIntegrationTest : CsmTestBase() {
10401042
mutableListOf(runTemplateParameterValue1), childRunnerWithEmptyParamsSaved.parametersValues)
10411043
}
10421044

1045+
@Test
1046+
fun `test create runner with inherited DB dataset parameter from workspace solution`() {
1047+
1048+
solutionSaved =
1049+
solutionApiService.createSolution(
1050+
organizationSaved.id,
1051+
SolutionCreateRequest(
1052+
key = UUID.randomUUID().toString(),
1053+
name = "Solution with 1 default datasetPart parameter",
1054+
parameterGroups =
1055+
mutableListOf(
1056+
RunTemplateParameterGroupCreateRequest(
1057+
id = "defaultDatasetPartParameterGroup",
1058+
parameters = mutableListOf("datasetPartParam"))),
1059+
parameters =
1060+
mutableListOf(
1061+
RunTemplateParameterCreateRequest(
1062+
id = "datasetPartParam",
1063+
defaultValue = "this_value_is_ignored",
1064+
varType = DATASET_PART_VARTYPE_DB)),
1065+
runTemplates =
1066+
mutableListOf(
1067+
RunTemplateCreateRequest(
1068+
id = "runTemplateWithOneDatasetPartByDefault",
1069+
parameterGroups = mutableListOf("defaultDatasetPartParameterGroup"))),
1070+
repository = "repository",
1071+
version = "1.0.0"))
1072+
workspace =
1073+
WorkspaceCreateRequest(
1074+
key = "key",
1075+
name = "workspace",
1076+
solution = WorkspaceSolution(solutionSaved.id),
1077+
datasetCopy = false)
1078+
workspaceSaved = workspaceApiService.createWorkspace(organizationSaved.id, workspace)
1079+
1080+
val customersFile = resourceLoader.getResource("classpath:/$CUSTOMERS_FILE_NAME").file
1081+
val customersInputStream = FileInputStream(customersFile)
1082+
val customersMultipartFile =
1083+
MockMultipartFile(
1084+
"file", CUSTOMERS_FILE_NAME, "text/csv", IOUtils.toByteArray(customersInputStream))
1085+
val workspaceDataset =
1086+
datasetApiService.createDataset(
1087+
organizationSaved.id,
1088+
workspaceSaved.id,
1089+
DatasetCreateRequest(
1090+
name = "runnerDataset",
1091+
parts =
1092+
mutableListOf(
1093+
DatasetPartCreateRequest(
1094+
name = "datasetPart1",
1095+
sourceName = CUSTOMERS_FILE_NAME,
1096+
type = DatasetPartTypeEnum.DB))),
1097+
arrayOf(customersMultipartFile))
1098+
workspaceSaved =
1099+
workspaceApiService.updateWorkspace(
1100+
organizationSaved.id,
1101+
workspaceSaved.id,
1102+
WorkspaceUpdateRequest(
1103+
solution =
1104+
WorkspaceSolution(
1105+
solutionId = solutionSaved.id,
1106+
datasetId = workspaceDataset.id,
1107+
defaultParameterValues =
1108+
mutableMapOf("datasetPartParam" to workspaceDataset.parts[0].id))))
1109+
1110+
val runner =
1111+
runnerApiService.createRunner(
1112+
organizationSaved.id,
1113+
workspaceSaved.id,
1114+
makeRunnerCreateRequest(runTemplateId = "runTemplateWithOneDatasetPartByDefault"))
1115+
1116+
val runnerDatasetId = runner.datasets.parameter
1117+
val runnerDataset =
1118+
datasetApiService.getDataset(organizationSaved.id, workspaceSaved.id, runnerDatasetId)
1119+
val inheritedRunnerDatasetPartContent =
1120+
datasetApiService.downloadDatasetPart(
1121+
organizationSaved.id, workspaceSaved.id, runnerDataset.id, runnerDataset.parts[0].id)
1122+
val expectedText = FileInputStream(customersFile).bufferedReader().use { it.readText() }
1123+
val retrievedText =
1124+
InputStreamResource(inheritedRunnerDatasetPartContent).inputStream.bufferedReader().use {
1125+
it.readText()
1126+
}
1127+
assertEquals(expectedText, retrievedText)
1128+
}
1129+
1130+
@Test
1131+
fun `test create runner with inherited DB dataset parameter from parent`() {
1132+
1133+
solutionSaved =
1134+
solutionApiService.createSolution(
1135+
organizationSaved.id,
1136+
SolutionCreateRequest(
1137+
key = UUID.randomUUID().toString(),
1138+
name = "Solution with 1 default datasetPart parameter",
1139+
parameterGroups =
1140+
mutableListOf(
1141+
RunTemplateParameterGroupCreateRequest(
1142+
id = "defaultDatasetPartParameterGroup",
1143+
parameters = mutableListOf("datasetPartParam"))),
1144+
parameters =
1145+
mutableListOf(
1146+
RunTemplateParameterCreateRequest(
1147+
id = "datasetPartParam",
1148+
defaultValue = "this_value_is_ignored",
1149+
varType = DATASET_PART_VARTYPE_DB)),
1150+
runTemplates =
1151+
mutableListOf(
1152+
RunTemplateCreateRequest(
1153+
id = "runTemplateWithOneDatasetPartByDefault",
1154+
parameterGroups = mutableListOf("defaultDatasetPartParameterGroup"))),
1155+
repository = "repository",
1156+
version = "1.0.0"))
1157+
workspace =
1158+
WorkspaceCreateRequest(
1159+
key = "key",
1160+
name = "workspace",
1161+
solution = WorkspaceSolution(solutionSaved.id),
1162+
datasetCopy = false)
1163+
workspaceSaved = workspaceApiService.createWorkspace(organizationSaved.id, workspace)
1164+
1165+
val customersFile = resourceLoader.getResource("classpath:/$CUSTOMERS_FILE_NAME").file
1166+
val customersInputStream = FileInputStream(customersFile)
1167+
val customersMultipartFile =
1168+
MockMultipartFile(
1169+
"file", CUSTOMERS_FILE_NAME, "text/csv", IOUtils.toByteArray(customersInputStream))
1170+
val workspaceDataset =
1171+
datasetApiService.createDataset(
1172+
organizationSaved.id,
1173+
workspaceSaved.id,
1174+
DatasetCreateRequest(
1175+
name = "runnerDataset",
1176+
parts =
1177+
mutableListOf(
1178+
DatasetPartCreateRequest(
1179+
name = "datasetPart1",
1180+
sourceName = CUSTOMERS_FILE_NAME,
1181+
type = DatasetPartTypeEnum.DB))),
1182+
arrayOf(customersMultipartFile))
1183+
workspaceSaved =
1184+
workspaceApiService.updateWorkspace(
1185+
organizationSaved.id,
1186+
workspaceSaved.id,
1187+
WorkspaceUpdateRequest(
1188+
solution =
1189+
WorkspaceSolution(
1190+
solutionId = solutionSaved.id,
1191+
datasetId = workspaceDataset.id,
1192+
defaultParameterValues =
1193+
mutableMapOf("datasetPartParam" to workspaceDataset.parts[0].id))))
1194+
1195+
val runner =
1196+
runnerApiService.createRunner(
1197+
organizationSaved.id,
1198+
workspaceSaved.id,
1199+
makeRunnerCreateRequest(runTemplateId = "runTemplateWithOneDatasetPartByDefault"))
1200+
1201+
val runnerDatasetId = runner.datasets.parameter
1202+
val runnerDataset =
1203+
datasetApiService.getDataset(organizationSaved.id, workspaceSaved.id, runnerDatasetId)
1204+
1205+
val customers5File = resourceLoader.getResource("classpath:/$CUSTOMERS_5_LINES_FILE_NAME").file
1206+
val customers5InputStream = FileInputStream(customers5File)
1207+
val customers5MultipartFile =
1208+
MockMultipartFile(
1209+
"file",
1210+
CUSTOMERS_5_LINES_FILE_NAME,
1211+
"text/csv",
1212+
IOUtils.toByteArray(customers5InputStream))
1213+
1214+
val runnerDatasetPartId = runnerDataset.parts[0].id
1215+
1216+
datasetApiService.replaceDatasetPart(
1217+
organizationSaved.id,
1218+
workspaceSaved.id,
1219+
runnerDataset.id,
1220+
runnerDatasetPartId,
1221+
customers5MultipartFile,
1222+
DatasetPartUpdateRequest(sourceName = CUSTOMERS_5_LINES_FILE_NAME))
1223+
1224+
val childRunner =
1225+
runnerApiService.createRunner(
1226+
organizationSaved.id,
1227+
workspaceSaved.id,
1228+
makeRunnerCreateRequest(
1229+
runTemplateId = "runTemplateWithOneDatasetPartByDefault", parentId = runner.id))
1230+
1231+
val childRunnerDatasetId = childRunner.datasets.parameter
1232+
val childRunnerDataset =
1233+
datasetApiService.getDataset(organizationSaved.id, workspaceSaved.id, childRunnerDatasetId)
1234+
1235+
val childRunnerDatasetPartContent =
1236+
datasetApiService.downloadDatasetPart(
1237+
organizationSaved.id,
1238+
workspaceSaved.id,
1239+
childRunnerDataset.id,
1240+
childRunnerDataset.parts[0].id)
1241+
val expectedText = FileInputStream(customers5File).bufferedReader().use { it.readText() }
1242+
val retrievedText =
1243+
InputStreamResource(childRunnerDatasetPartContent).inputStream.bufferedReader().use {
1244+
it.readText()
1245+
}
1246+
assertEquals(expectedText, retrievedText)
1247+
}
1248+
10431249
@Test
10441250
fun `startRun send event`() {
10451251
val expectedRunId = "run-genid12345"

runner/src/integrationTest/resources/application-runner-test.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,12 @@ csm:
115115
host: "localhost"
116116
port: 5432
117117
reader:
118-
password: "password"
118+
password: "cosmotech_api_reader_pass"
119119
username: cosmotech_api_reader
120120
writer:
121-
password: "password"
121+
password: "cosmotech_api_writer_pass"
122122
username: cosmotech_api_writer
123+
database: "test"
123124
rbac:
124125
enabled: true
125126
s3:

runner/src/integrationTest/resources/customers.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ CUST006,FastFix Auto,Isabelle Dubois,Service Manager,42 Garage Loop,Montréal,QC
88
CUST007,Garden Glow Ltd,Ellie Tan,Product Specialist,180 Daisy St,Burnside,NSW,2135,Australia,02-8000-1122
99
CUST008,Evergreen Crafts,Jasper Lee,Owner,96 Willow Way,Lakeside,BC,V2V 4W1,Canada,604-800-9988
1010
CUST009,Peak Fitness Inc,Monica Anders,Marketing Lead,311 Summit Ave,Cascade,WA,98101,USA,206-777-5544
11-
CUST010,Silverline Media,Nikhil Ajay,Account Executive,845 Market Plaza,Redhill,ENG,RH1 6JT,UK,020-7123-4098
11+
CUST010,Silverline Media,Nikhil Ajay,Account Executive,845 Market Plaza,Redhill,ENG,RH1 6JT,UK,020-7123-4098
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
customerID,companyName,contactName,contactTitle,address,city,region,postalCode,country,phone
2+
CUST001,Blueberry Tech,Alex Greenwood,CTO,1412 Pine St,Oakridge,CA,93561,USA,555-123-4560
3+
CUST002,Riverbend Logistics,Taylor Morris,Operations Lead,89 North Ave,Greendale,NY,11105,USA,555-987-6521
4+
CUST003,Sunrise Foods,Jordan Liu,Procurement Manager,220 Cherry Road,Springdale,TX,75010,USA,555-210-7895
5+
CUST004,Skyline Textiles,Maria Petrova,Sales Director,501 Textile Lane,Newpark,FL,33012,USA,555-313-9240
6+
CUST005,Crimson Solutions,Samuel Evans,CEO,77 Baker Blvd,Woodport,GA,30310,USA,555-825-2555
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,8 @@
1-
CREATE USER readusertest WITH PASSWORD 'readusertest';
2-
CREATE USER writeusertest WITH PASSWORD 'writeusertest';
1+
CREATE ROLE cosmotech_api_reader WITH LOGIN PASSWORD 'cosmotech_api_reader_pass';
2+
CREATE ROLE cosmotech_api_writer WITH LOGIN PASSWORD 'cosmotech_api_writer_pass';
3+
CREATE ROLE cosmotech_api_admin WITH LOGIN PASSWORD 'cosmotech_api_admin_pass';
4+
5+
CREATE SCHEMA inputs AUTHORIZATION cosmotech_api_writer;
6+
CREATE SCHEMA outputs AUTHORIZATION cosmotech_api_writer;
7+
GRANT USAGE ON SCHEMA inputs TO cosmotech_api_reader;
8+
GRANT USAGE ON SCHEMA outputs TO cosmotech_api_reader;

0 commit comments

Comments
 (0)