diff --git a/README.md b/README.md index 6ab2e34da..0d155c731 100644 --- a/README.md +++ b/README.md @@ -159,3 +159,8 @@ npx playwright test ``` from `app/client-v2/`. To close all components once ready, run `./scripts/stop_test` from root. + +### Adding new species + +1. Add new database to [mrcdata](https://mrcdata.dide.ic.ac.uk/beebop). +2. Add new species to `args.json` in *beebop_py* diff --git a/app/client-v2/e2e/home.spec.ts b/app/client-v2/e2e/home.spec.ts index 64db51aee..a0505462c 100644 --- a/app/client-v2/e2e/home.spec.ts +++ b/app/client-v2/e2e/home.spec.ts @@ -1,17 +1,12 @@ import { test, expect, Page } from "@playwright/test"; -import { randomProjectName } from "./utils.js"; +import { createProject, randomProjectName } from "./utils.js"; test.beforeEach(async ({ page }) => { await page.goto(""); }); const addProjectNavigateHome = async (page: Page, name: string) => { - await page.getByLabel("Create project").click(); - await page.getByLabel("Create", { exact: true }).click(); - await page.getByLabel("Select a Species").click(); - await page.getByLabel("Streptococcus pneumoniae").click(); - await page.getByLabel("Name").fill(name); - await page.getByLabel("Create", { exact: true }).click(); + await createProject(page, name) await expect(page.getByText(name)).toBeVisible(); diff --git a/app/client-v2/e2e/projectPostRun.spec.ts b/app/client-v2/e2e/projectPostRun.spec.ts index ce4850c30..374c0dc3f 100644 --- a/app/client-v2/e2e/projectPostRun.spec.ts +++ b/app/client-v2/e2e/projectPostRun.spec.ts @@ -1,12 +1,11 @@ import { expect, test } from "@playwright/test"; -import { randomProjectName, uploadFiles } from "./utils.js"; +import { createProject, randomProjectName, uploadFiles } from "./utils.js"; let projectName: string; test.beforeEach(async ({ page }) => { await page.goto(""); projectName = randomProjectName(); - await page.getByPlaceholder("Create new Project").fill(projectName); - await page.getByPlaceholder("Create new Project").press("Enter"); + await createProject(page, projectName); }); test("can run project and view results", async ({ page }) => { @@ -89,12 +88,3 @@ test("can run project multiple times", async ({ page }) => { await expect(page.getByText("GPSC7")).toBeVisible(); await expect(page.getByText("GPSC4")).toBeVisible(); }); - -test("can export project data as csv", async ({ page }) => { - uploadFiles(page); - - const downloadPromise = page.waitForEvent("download"); - await page.getByLabel("Export").click(); - const download = await downloadPromise; - expect(download.suggestedFilename()).toBe(`${projectName}.csv`); -}); diff --git a/app/client-v2/e2e/projectPreRun.spec.ts b/app/client-v2/e2e/projectPreRun.spec.ts index 833f9c07d..4d3bc076c 100644 --- a/app/client-v2/e2e/projectPreRun.spec.ts +++ b/app/client-v2/e2e/projectPreRun.spec.ts @@ -1,10 +1,11 @@ import { expect, test } from "@playwright/test"; -import { randomProjectName, uploadFiles } from "./utils.js"; +import { createProject, randomProjectName, uploadFiles } from "./utils.js"; +let projectName: string; test.beforeEach(async ({ page }) => { await page.goto(""); - await page.getByPlaceholder("Create new Project").fill(randomProjectName()); - await page.getByPlaceholder("Create new Project").press("Enter"); + projectName = randomProjectName(); + await createProject(page, projectName); }); test("upload multiple files and display amr information", async ({ page }) => { @@ -36,3 +37,12 @@ test("shows progress bar whilst uploading files & gone after full uploaded", asy await expect(page.getByRole("progressbar")).not.toBeVisible(); }); + +test("can export project data as csv", async ({ page }) => { + uploadFiles(page); + + const downloadPromise = page.waitForEvent("download"); + await page.getByLabel("Export").click(); + const download = await downloadPromise; + expect(download.suggestedFilename()).toBe(`${projectName}.csv`); +}); diff --git a/app/client-v2/e2e/utils.ts b/app/client-v2/e2e/utils.ts index 57b52abe5..dcceb77be 100644 --- a/app/client-v2/e2e/utils.ts +++ b/app/client-v2/e2e/utils.ts @@ -8,3 +8,12 @@ export const uploadFiles = async (page: Page, files = ["e2e/fastaFiles/good_1.fa const fileChooser = await fileChooserPromise; await fileChooser.setFiles(files); }; + +export const createProject = async (page: Page, name: string, species = "Streptococcus pneumoniae") => { + await page.getByLabel("Create project").click(); + await page.getByLabel("Create", { exact: true }).click(); + await page.getByLabel("Select a Species").click(); + await page.getByLabel(species).click(); + await page.getByLabel("Name").fill(name); + await page.getByLabel("Create", { exact: true }).click(); +}; diff --git a/app/client-v2/public/worker.js b/app/client-v2/public/worker.js index a0c69f100..49868ce31 100644 --- a/app/client-v2/public/worker.js +++ b/app/client-v2/public/worker.js @@ -13,7 +13,10 @@ function createFS(module, f) { module.FS.mount(module.FS.filesystems.WORKERFS, { files: [f] }, workdir); } -async function computeSample(hash, file, filename) { +async function computeSample(fileObject, sketchKmerArguments) { + const { file, hash, filename } = fileObject; + const { kmerMin, kmerMax, kmerStep } = sketchKmerArguments; + const amrModule = await AMRprediction(); const sketchModule = await WebSketch(); //create working directory and mount file @@ -21,18 +24,19 @@ async function computeSample(hash, file, filename) { createFS(sketchModule, file); const amr = amrModule.make_prediction_json(workdir + "/" + filename); - // sketch() takes the followings arguments: filepath, kmer_min, kmer_max, kmer_step, - // bbits, sketchsize64, codon_phased (boolean), use_rc (boolean) - const sketch = sketchModule.sketch(workdir + "/" + filename, 14, 29, 3, 14, 156, false, true); + // sketch() takes the followings arguments: + // filepath, kmer_min, kmer_max, kmer_step, bbits, sketchsize64, codon_phased (boolean), use_rc (boolean) + const sketch = sketchModule.sketch(workdir + "/" + filename, kmerMin, kmerMax, kmerStep, 14, 156, false, true); return { hash, amr, sketch }; } onmessage = async function (message) { - const hashedFiles = message.data; + const { hashedFiles, sketchKmerArguments } = message.data; + const samples = []; for (const fileObject of hashedFiles) { - const { hash, amr, sketch } = await computeSample(fileObject.hash, fileObject.file, fileObject.filename); + const { hash, amr, sketch } = await computeSample(fileObject, sketchKmerArguments); samples.push({ hash, amr: JSON.parse(amr), sketch: JSON.parse(sketch), filename: fileObject.filename }); } postMessage(samples); diff --git a/app/client-v2/src/App.vue b/app/client-v2/src/App.vue index 8bc384918..b247f7a8b 100644 --- a/app/client-v2/src/App.vue +++ b/app/client-v2/src/App.vue @@ -1,9 +1,12 @@