-
Notifications
You must be signed in to change notification settings - Fork 24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Zarr streaming e2e test #8137
Zarr streaming e2e test #8137
Changes from 14 commits
c276a20
26dafe7
8fb12a1
0968608
2d6065a
b6ee187
9323568
4a09bf6
01f4c60
6309c9b
88f9feb
ee0b7c3
459ff77
152acca
1d72230
8034308
595701e
6b6eaaf
30ed5b1
e871f00
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,5 +1,11 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import _ from "lodash"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { tokenUserA, setCurrToken, resetDatabase, writeTypeCheckingFile } from "test/e2e-setup"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tokenUserA, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setCurrToken, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
resetDatabase, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
writeTypeCheckingFile, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
replaceVolatileValues, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} from "test/e2e-setup"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import type { APIDataset } from "types/api_flow_types"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import * as api from "admin/admin_rest_api"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import test from "ava"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -15,6 +21,7 @@ async function getFirstDataset(): Promise<APIDataset> { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
test.before("Reset database and change token", async () => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
resetDatabase(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setCurrToken(tokenUserA); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
await api.triggerDatasetCheck("http://localhost:9000"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
test.serial("getDatasets", async (t) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let datasets = await api.getDatasets(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -29,27 +36,27 @@ test.serial("getDatasets", async (t) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
writeTypeCheckingFile(datasets, "dataset", "APIDatasetCompact", { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
isArray: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t.snapshot(datasets); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t.snapshot(replaceVolatileValues(datasets)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
test("getActiveDatasets", async (t) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let datasets = await api.getActiveDatasetsOfMyOrganization(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
datasets = _.sortBy(datasets, (d) => d.name); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t.snapshot(datasets); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t.snapshot(replaceVolatileValues(datasets)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
test("getDatasetAccessList", async (t) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const dataset = await getFirstDataset(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const accessList = _.sortBy(await api.getDatasetAccessList(dataset), (user) => user.id); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t.snapshot(accessList); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t.snapshot(replaceVolatileValues(accessList)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
test("updateDatasetTeams", async (t) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const [dataset, newTeams] = await Promise.all([getFirstDataset(), api.getEditableTeams()]); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const updatedDataset = await api.updateDatasetTeams( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dataset, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
newTeams.map((team) => team.id), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t.snapshot(updatedDataset); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t.snapshot(replaceVolatileValues(updatedDataset)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// undo the Change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
await api.updateDatasetTeams( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dataset, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -62,3 +69,42 @@ test("updateDatasetTeams", async (t) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// await api.revokeDatasetSharingToken(dataset.name); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// t.pass(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// }); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
test("Zarr streaming", async (t) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const zattrsResp = await fetch("/data/zarr/Organization_X/test-dataset/segmentation/.zattrs", { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
headers: new Headers(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const zattrs = await zattrsResp.text(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t.snapshot(zattrs); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const rawDataResponse = await fetch( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"/data/zarr/Organization_X/test-dataset/segmentation/1/0.1.1.0", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
headers: new Headers(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const bytes = await rawDataResponse.arrayBuffer(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const base64 = btoa(String.fromCharCode(...new Uint8Array(bytes))); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t.snapshot(base64); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add error handling for fetch requests While the test implementation is good, it should handle potential network failures or invalid responses. Consider adding error handling: test("Zarr streaming", async (t) => {
const zattrsResp = await fetch("/data/zarr/Organization_X/test-dataset/segmentation/.zattrs", {
headers: new Headers(),
});
+ t.true(zattrsResp.ok, `Failed to fetch .zattrs: ${zattrsResp.statusText}`);
const zattrs = await zattrsResp.text();
t.snapshot(zattrs);
const rawDataResponse = await fetch(
"/data/zarr/Organization_X/test-dataset/segmentation/1/0.1.1.0",
{
headers: new Headers(),
},
);
+ t.true(rawDataResponse.ok, `Failed to fetch raw data: ${rawDataResponse.statusText}`);
const bytes = await rawDataResponse.arrayBuffer();
const base64 = btoa(String.fromCharCode(...new Uint8Array(bytes)));
t.snapshot(base64);
}); 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
test("Zarr 3 streaming", async (t) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const zarrJsonResp = await fetch( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"/data/zarr3_experimental/Organization_X/test-dataset/segmentation/zarr.json", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
headers: new Headers(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const zarrJson = await zarrJsonResp.text(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t.snapshot(zarrJson); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const rawDataResponse = await fetch( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"/data/zarr3_experimental/Organization_X/test-dataset/segmentation/1/0.1.1.0", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
headers: new Headers(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const bytes = await rawDataResponse.arrayBuffer(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const base64 = btoa(String.fromCharCode(...new Uint8Array(bytes))); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t.snapshot(base64); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -39,6 +39,7 @@ const volatileKeys: Array<string | number | symbol> = [ | |
"lastActivity", | ||
"tracingTime", | ||
"tracingId", | ||
"sortingKey", | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification Snapshots need to be updated due to "sortingKey" changes The codebase contains snapshot files that reference "sortingKey", specifically in
🔗 Analysis chainVerify snapshot recomputation after adding "sortingKey". The addition of "sortingKey" to volatileKeys is appropriate. As per the comment above the array, snapshots need to be recomputed when this array is modified. Run the following script to check if there are any snapshot files that need updating: Let me check the content of these snapshot files to see if they contain any instances of "sortingKey" that might be affected. 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Description: Check for snapshot files that might need updating
# Look for snapshot files in the test directory
fd -e snap -e snapshot . frontend/javascripts/test
Length of output: 1460 Script: #!/bin/bash
# Search for "sortingKey" in snapshot files to understand the impact
rg "sortingKey" frontend/javascripts/test/snapshots/
Length of output: 193 |
||
]; | ||
export function replaceVolatileValues(obj: ArbitraryObject | null | undefined) { | ||
if (obj == null) return obj; | ||
|
@@ -130,7 +131,7 @@ export async function writeTypeCheckingFile( | |
const fullTypeAnnotation = options.isArray ? `Array<${typeString}>` : typeString; | ||
fs.writeFileSync( | ||
`frontend/javascripts/test/snapshots/type-check/test-type-checking-${name}.ts`, | ||
` | ||
` | ||
import type { ${typeString} } from "types/api_flow_types"; | ||
const a: ${fullTypeAnnotation} = ${JSON.stringify(object)}`, | ||
); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Add error handling for dataset check trigger
While triggering the dataset check is good for test setup, it should handle potential failures gracefully.
Consider adding error handling: