Skip to content

Commit edbb7cc

Browse files
committed
Added tests
1 parent 27ee3bf commit edbb7cc

File tree

4 files changed

+144
-32
lines changed

4 files changed

+144
-32
lines changed

__tests__/job_utilities.test.js

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import { it, expect } from 'vitest';
2-
import { extractJobErrorParts, extractRelevantJobError } from '$lib/common/job_utilities.js';
2+
import {
3+
extractJobErrorParts,
4+
extractRelevantJobError,
5+
generateNewUniqueDatasetName
6+
} from '$lib/common/job_utilities.js';
37

48
const completeTracebackError = `TASK ERROR:Task id: 15 (Create OME-Zarr structure), e.workflow_task_order=0
59
TRACEBACK:
@@ -223,3 +227,21 @@ it('handles null or undefined inputs', () => {
223227
expect(extractRelevantJobError(null)).eq('');
224228
expect(extractRelevantJobError()).eq('');
225229
});
230+
231+
it('generates new unique dataset name', () => {
232+
expect(generateNewUniqueDatasetName(getMockedDatasets(['a', 'b']), 'a')).toEqual('a_1');
233+
expect(generateNewUniqueDatasetName(getMockedDatasets(['a', 'a_1', 'b']), 'a')).toEqual('a_2');
234+
expect(generateNewUniqueDatasetName(getMockedDatasets(['a', 'a_1', 'b']), 'a_1')).toEqual('a_2');
235+
expect(generateNewUniqueDatasetName(getMockedDatasets(['a', 'a_1', 'a_2', 'b']), 'a_1')).toEqual(
236+
'a_3'
237+
);
238+
});
239+
240+
/**
241+
* @param {string[]} names
242+
*/
243+
function getMockedDatasets(names) {
244+
return names.map((name, index) => {
245+
return { id: index + 1, name };
246+
});
247+
}

tests/v2/dataset_utils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export async function createDataset(page, projectId) {
1717

1818
const randomDatasetName = Math.random().toString(36).substring(7);
1919
await page.getByRole('textbox', { name: 'Dataset Name' }).fill(randomDatasetName);
20-
await page.getByRole('textbox', { name: 'Zarr dir' }).fill(`/tmp/playwight/datasets/${randomDatasetName}`);
20+
await page.getByRole('textbox', { name: 'Zarr dir' }).fill(`/tmp/playwright/datasets/${randomDatasetName}`);
2121
const saveBtn = page.getByRole('button', { name: 'Save' });
2222
await saveBtn.click();
2323
await waitModalClosed(page);

tests/v2/run_mock_tasks.spec.js

Lines changed: 113 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,20 @@ test('Collect and run mock tasks [v2]', async ({ page, workflow, request }) => {
1313
await waitPageLoading(page);
1414

1515
/** @type {string} */
16-
let successDatasetName;
16+
let datasetName1;
1717
/** @type {number} */
18-
let successDatasetId;
19-
await test.step('Create test dataset for success task', async () => {
18+
let datasetId1;
19+
await test.step('Create first test dataset', async () => {
2020
const { name, id } = await createDataset(page, workflow.projectId);
21-
successDatasetName = name;
22-
successDatasetId = id;
21+
datasetName1 = name;
22+
datasetId1 = id;
2323
});
2424

2525
/** @type {string} */
26-
let errorDatasetName;
27-
await test.step('Create test dataset for error task', async () => {
26+
let datasetName2;
27+
await test.step('Create second test dataset', async () => {
2828
const { name } = await createDataset(page, workflow.projectId);
29-
errorDatasetName = name;
29+
datasetName2 = name;
3030
});
3131

3232
await test.step('Go to tasks page', async () => {
@@ -115,13 +115,20 @@ test('Collect and run mock tasks [v2]', async ({ page, workflow, request }) => {
115115
await waitPageLoading(page);
116116
});
117117

118+
await test.step('Select the first dataset', async () => {
119+
await page
120+
.getByRole('combobox', { name: 'Dataset', exact: true })
121+
.first()
122+
.selectOption(datasetName1);
123+
});
124+
118125
await test.step('Add and select create_ome_zarr_compound', async () => {
119126
await workflow.addCollectedTask('create_ome_zarr_compound');
120127
await workflow.selectTask('create_ome_zarr_compound');
121128
});
122129

123-
await test.step('Fill arguments', async () => {
124-
await page.getByRole('textbox', { name: 'Image Dir' }).fill('/tmp/test1');
130+
await test.step('Fill create_ome_zarr_compound arguments', async () => {
131+
await page.getByRole('textbox', { name: 'Image Dir' }).fill('/tmp/playwright/test1');
125132
await page.getByRole('button', { name: 'Save changes' }).click();
126133
await page.getByText('Arguments changes saved successfully').waitFor();
127134
});
@@ -130,9 +137,9 @@ test('Collect and run mock tasks [v2]', async ({ page, workflow, request }) => {
130137
await page.getByRole('button', { name: 'Run workflow' }).click();
131138
const modal = page.locator('.modal.show');
132139
await modal.waitFor();
133-
await modal
134-
.getByRole('combobox', { name: 'Dataset', exact: true })
135-
.selectOption(successDatasetName);
140+
await expect(modal.getByRole('combobox', { name: 'Dataset', exact: true })).toHaveValue(
141+
datasetId1.toString()
142+
);
136143
await page.getByRole('button', { name: 'Run', exact: true }).click();
137144
await page.getByRole('button', { name: 'Confirm' }).click();
138145
await waitModalClosed(page);
@@ -148,16 +155,16 @@ test('Collect and run mock tasks [v2]', async ({ page, workflow, request }) => {
148155
await page.locator('.job-status-icon.bi-check').waitFor();
149156
});
150157

151-
await test.step('Open run workflow modal again', async () => {
152-
await page.getByRole('button', { name: 'Run workflow' }).click();
158+
await test.step('Open "Continue workflow" modal', async () => {
159+
await page.getByRole('button', { name: 'Continue workflow' }).click();
153160
const modal = page.locator('.modal.show');
154161
await modal.waitFor();
155162
// Check that confirm mode has been reset
156163
expect(await page.getByRole('button', { name: 'Run', exact: true }).isVisible()).toEqual(true);
157164
});
158165

159166
await test.step('Verify that the dataset contains some images', async () => {
160-
await page.goto(`/v2/projects/${workflow.projectId}/datasets/${successDatasetId}`);
167+
await page.goto(`/v2/projects/${workflow.projectId}/datasets/${datasetId1}`);
161168
await waitPageLoading(page);
162169
await expect(page.getByRole('table').getByRole('row')).toHaveCount(4);
163170
});
@@ -167,44 +174,124 @@ test('Collect and run mock tasks [v2]', async ({ page, workflow, request }) => {
167174
await waitPageLoading(page);
168175
});
169176

170-
await test.step('Remove create_ome_zarr_compound task', async () => {
171-
await workflow.selectTask('create_ome_zarr_compound');
172-
await workflow.removeCurrentTask();
177+
await test.step('Select the second dataset', async () => {
178+
await page
179+
.getByRole('combobox', { name: 'Dataset', exact: true })
180+
.first()
181+
.selectOption(datasetName2);
173182
});
174183

175184
await test.step('Add and select generic_task', async () => {
176185
await workflow.addCollectedTask('generic_task');
177186
await workflow.selectTask('generic_task');
178187
});
179188

180-
await test.step('Fill arguments', async () => {
189+
await test.step('Fill generic_task arguments, set "Raise Error" to true', async () => {
181190
await page.getByRole('switch').check();
182191
await page.getByRole('button', { name: 'Save changes' }).click();
183192
await page.getByText('Arguments changes saved successfully').waitFor();
184193
});
185194

186-
await test.step('Start the job', async () => {
195+
await test.step('Start the new job', async () => {
187196
await page.getByRole('button', { name: 'Run workflow' }).click();
188197
const modal = page.locator('.modal.show');
189198
await modal.waitFor();
190-
await modal
191-
.getByRole('combobox', { name: 'Dataset', exact: true })
192-
.selectOption(errorDatasetName);
193199
await page.getByRole('button', { name: 'Run', exact: true }).click();
194200
await page.getByRole('button', { name: 'Confirm' }).click();
195201
await waitModalClosed(page);
196202
});
197203

198204
await test.step('Wait tasks submitted', async () => {
199205
const spinners = page.locator('.job-status-submitted.spinner-border');
200-
await spinners.waitFor();
201-
expect(await spinners.count()).toEqual(1);
206+
await expect(spinners).toHaveCount(2);
202207
});
203208

204209
await test.step('Wait job failure', async () => {
205210
await page.locator('.job-status-icon.bi-x').waitFor();
206211
await page.getByText('The last job failed with the following error').waitFor();
207212
});
213+
214+
await test.step('Fill generic_task arguments, set "Raise Error" to false', async () => {
215+
await page.getByRole('switch').uncheck();
216+
await page.getByRole('button', { name: 'Save changes' }).click();
217+
await page.getByText('Arguments changes saved successfully').waitFor();
218+
});
219+
220+
await test.step('Continue the workflow from failed task', async () => {
221+
await page.getByRole('button', { name: 'Continue workflow' }).click();
222+
const modal = page.locator('.modal.show');
223+
await modal.waitFor();
224+
await page
225+
.getByRole('combobox', { name: 'First task (Optional)' })
226+
.selectOption('generic_task');
227+
await page.getByRole('button', { name: 'Run', exact: true }).click();
228+
await page.getByRole('button', { name: 'Confirm' }).click();
229+
await waitModalClosed(page);
230+
});
231+
232+
await test.step('Wait tasks submitted', async () => {
233+
const spinners = page.locator('.job-status-submitted.spinner-border');
234+
await spinners.waitFor();
235+
expect(await spinners.count()).toEqual(1);
236+
});
237+
238+
await test.step('Wait tasks success', async () => {
239+
await expect(page.locator('.job-status-icon.bi-check')).toHaveCount(2);
240+
});
241+
242+
await test.step('Cleanup zarr_dir', async () => {
243+
fs.rmSync(`/tmp/playwright/datasets/${datasetName2}`, { recursive: true });
244+
});
245+
246+
await test.step('Restart the workflow replacing dataset', async () => {
247+
await page.getByRole('button', { name: 'Restart workflow' }).click();
248+
const modal = page.locator('.modal.show');
249+
await modal.waitFor();
250+
await page.getByRole('button', { name: 'Run', exact: true }).click();
251+
await page.getByRole('button', { name: 'Confirm' }).click();
252+
await waitModalClosed(page);
253+
});
254+
255+
await test.step('Wait tasks submitted', async () => {
256+
const spinners = page.locator('.job-status-submitted.spinner-border');
257+
await expect(spinners).toHaveCount(2);
258+
});
259+
260+
await test.step('Wait tasks success', async () => {
261+
await expect(page.locator('.job-status-icon.bi-check')).toHaveCount(2);
262+
});
263+
264+
await test.step('Cleanup zarr_dir', async () => {
265+
fs.rmSync(`/tmp/playwright/datasets/${datasetName2}`, { recursive: true });
266+
});
267+
268+
await test.step('Restart the workflow creating a new dataset', async () => {
269+
await page.getByRole('button', { name: 'Restart workflow' }).click();
270+
const modal = page.locator('.modal.show');
271+
await modal.waitFor();
272+
await modal.getByRole('checkbox', { name: 'Replace existing dataset' }).uncheck();
273+
await modal.getByRole('button', { name: 'Run', exact: true }).click();
274+
await modal.getByRole('button', { name: 'Confirm' }).click();
275+
await waitModalClosed(page);
276+
});
277+
278+
await test.step('Check the new dataset name', async () => {
279+
await expect(
280+
page
281+
.getByRole('combobox', { name: 'Dataset', exact: true })
282+
.first()
283+
.getByRole('option', { selected: true })
284+
).toHaveText(`${datasetName2}_1`);
285+
});
286+
287+
await test.step('Wait tasks submitted', async () => {
288+
const spinners = page.locator('.job-status-submitted.spinner-border');
289+
await expect(spinners).toHaveCount(2);
290+
});
291+
292+
await test.step('Wait tasks success', async () => {
293+
await expect(page.locator('.job-status-icon.bi-check')).toHaveCount(2);
294+
});
208295
});
209296

210297
/**

tests/v2/workflow_task_input_filters.spec.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ test('Workflow task input filters [v2]', async ({ page, workflow }) => {
2828
await modal.waitFor();
2929
await modal
3030
.getByRole('textbox', { name: 'Zarr URL' })
31-
.fill(`/tmp/playwight/datasets/${datasetName}/img1`);
31+
.fill(`/tmp/playwright/datasets/${datasetName}/img1`);
3232
await modal.getByRole('button', { name: 'Add attribute' }).click();
3333
await modal.getByPlaceholder('Key').fill('k1');
3434
await modal.getByPlaceholder('Value').fill('value1');
@@ -50,7 +50,7 @@ test('Workflow task input filters [v2]', async ({ page, workflow }) => {
5050
await modal.waitFor();
5151
await modal
5252
.getByRole('textbox', { name: 'Zarr URL' })
53-
.fill(`/tmp/playwight/datasets/${datasetName}/img2`);
53+
.fill(`/tmp/playwright/datasets/${datasetName}/img2`);
5454
await modal.getByRole('button', { name: 'Add attribute' }).click();
5555
await modal.getByPlaceholder('Key').fill('k1');
5656
await modal.getByPlaceholder('Value').fill('value2');
@@ -111,6 +111,10 @@ test('Workflow task input filters [v2]', async ({ page, workflow }) => {
111111
await expect(page.getByPlaceholder('Value').first()).toHaveValue('value1-mod');
112112
});
113113

114+
await test.step('Select dataset', async () => {
115+
await page.getByRole('combobox', { name: 'Dataset', exact: true }).selectOption(datasetName);
116+
});
117+
114118
await test.step('Trigger pending changes modal from clicking to "Run workflow" button', async () => {
115119
await page.getByRole('button', { name: 'Run workflow' }).click();
116120
const modal = page.locator('.modal.show');
@@ -166,8 +170,7 @@ test('Workflow task input filters [v2]', async ({ page, workflow }) => {
166170
await expect(page.getByPlaceholder('Value').first()).toHaveValue('value1-mod');
167171
});
168172

169-
await test.step('Select dataset and task2', async () => {
170-
await page.getByRole('combobox', { name: 'Dataset', exact: true }).selectOption(datasetName);
173+
await test.step('Select task2', async () => {
171174
await workflow.selectTask(taskName2);
172175
});
173176

0 commit comments

Comments
 (0)