Skip to content
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

feat(website): remove hardcoded accessions from e2e #1126

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion website/.nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v20
v21
25 changes: 1 addition & 24 deletions website/tests/e2e.fixture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import { SequencePage } from './pages/sequences/sequences.page';
import { SubmitPage } from './pages/submit/submit.page';
import { GroupPage } from './pages/user/group/group.page.ts';
import { UserSequencePage } from './pages/user/userSequencePage/userSequencePage.ts';
import { AccessionTransformer } from './util/accessionTransformer.ts';
import { createGroup } from './util/backendCalls.ts';
import { ACCESS_TOKEN_COOKIE, clientMetadata, realmPath, REFRESH_TOKEN_COOKIE } from '../src/middleware/authMiddleware';
import { BackendClient } from '../src/services/backendClient';
Expand Down Expand Up @@ -56,35 +55,13 @@ export const e2eLogger = winston.createLogger({
transports: [new winston.transports.Console()],
});

export const accessionPrefix = 'LOC_';
export const accessionTransformer = new AccessionTransformer(accessionPrefix);

export const backendClient = BackendClient.create(backendUrl, e2eLogger);
export const groupManagementClient = GroupManagementClient.create(backendUrl, e2eLogger);

export const testSequenceEntry = {
name: `${accessionTransformer.generateCustomId(1)}.1`,
accession: accessionTransformer.generateCustomId(1),
version: 1,
export const testSequenceEntryData = {
unaligned: 'A'.repeat(123),
orf1a: 'QRFEINSA',
};
export const revokedSequenceEntry = {
accession: accessionTransformer.generateCustomId(11),
version: 1,
};
export const revocationSequenceEntry = {
accession: accessionTransformer.generateCustomId(11),
version: 2,
};
export const deprecatedSequenceEntry = {
accession: accessionTransformer.generateCustomId(21),
version: 1,
};
export const revisedSequenceEntry = {
accession: accessionTransformer.generateCustomId(21),
version: 2,
};

export const testUser = 'testuser';
export const testUserPassword = 'testuser';
Expand Down
22 changes: 16 additions & 6 deletions website/tests/pages/search/index.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { DateTime } from 'luxon';

import { routes } from '../../../src/routes.ts';
import { baseUrl, dummyOrganism, expect, test, testSequenceEntry } from '../../e2e.fixture';
import { baseUrl, dummyOrganism, expect, test } from '../../e2e.fixture';
import { getAccessionVersionString } from '../../../src/utils/extractAccessionVersion.ts';
import { getTestSequences } from '../../util/testSequenceProvider.ts';

test.describe('The search page', () => {
test('should show the search form with button and a table', async ({ searchPage }) => {
Expand All @@ -20,16 +22,22 @@ test.describe('The search page', () => {
});

test('should search for existing sequence entries', async ({ searchPage }) => {
const testAccessionVersion = getAccessionVersionString(getTestSequences().testSequenceEntry);

await searchPage.goto();
await searchPage.getEmptyAccessionVersionField().fill(testSequenceEntry.name);
await searchPage.getEmptyAccessionVersionField().fill(testAccessionVersion);
await searchPage.clickSearchButton();

await searchPage.page.waitForURL(
`${baseUrl}${routes.searchPage(dummyOrganism.key, [
{ name: 'accessionVersion', type: 'string', filterValue: testSequenceEntry.name },
{
name: 'accessionVersion',
type: 'string',
filterValue: testAccessionVersion,
},
])}`,
);
await expect(searchPage.page.getByText(testSequenceEntry.name, { exact: true })).toBeVisible();
await expect(searchPage.page.getByText(testAccessionVersion, { exact: true })).toBeVisible();
await expect(searchPage.page.getByText('2002-12-15')).toBeVisible();
await expect(searchPage.page.getByText('B.1.1.7')).toBeVisible();
});
Expand All @@ -45,9 +53,11 @@ test.describe('The search page', () => {

test('should reset the search', async ({ searchPage }) => {
await searchPage.goto();
await searchPage.getEmptyAccessionVersionField().fill(testSequenceEntry.name);

await expect(searchPage.getFilledAccessionVersionField()).toHaveValue(testSequenceEntry.name);
const testAccessionVersion = getAccessionVersionString(getTestSequences().testSequenceEntry);
await searchPage.getEmptyAccessionVersionField().fill(testAccessionVersion);

await expect(searchPage.getFilledAccessionVersionField()).toHaveValue(testAccessionVersion);

await searchPage.clickResetButton();

Expand Down
18 changes: 13 additions & 5 deletions website/tests/pages/sequences/accession.fa.spec.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,29 @@
import { routes } from '../../../src/routes.ts';
import { baseUrl, dummyOrganism, expect, test, testSequenceEntry } from '../../e2e.fixture';
import { baseUrl, dummyOrganism, expect, test, testSequenceEntryData } from '../../e2e.fixture';
import { getAccessionVersionString } from '../../../src/utils/extractAccessionVersion.ts';
import { getTestSequences } from '../../util/testSequenceProvider.ts';

test.describe('The sequence.fa page', () => {
test('can load and show fasta file', async () => {
const url = `${baseUrl}${routes.sequencesFastaPage(dummyOrganism.key, testSequenceEntry)}`;
const testSequences = getTestSequences();

const url = `${baseUrl}${routes.sequencesFastaPage(dummyOrganism.key, testSequences.testSequenceEntry)}`;
const response = await fetch(url);
const content = await response.text();
expect(content).toBe(`>${testSequenceEntry.name}\n${testSequenceEntry.unaligned}\n`);
expect(content).toBe(
`>${getAccessionVersionString(testSequences.testSequenceEntry)}\n${testSequenceEntryData.unaligned}\n`,
);
});

test('can download fasta file', async () => {
const downloadUrl = `${baseUrl}${routes.sequencesFastaPage(dummyOrganism.key, testSequenceEntry, true)}`;
const testSequences = getTestSequences();

const downloadUrl = `${baseUrl}${routes.sequencesFastaPage(dummyOrganism.key, testSequences.testSequenceEntry, true)}`;
const response = await fetch(downloadUrl);
const contentDisposition = response.headers.get('Content-Disposition');

expect(contentDisposition).not.toBeNull();
expect(contentDisposition).toContain('attachment');
expect(contentDisposition).toContain(testSequenceEntry.name);
expect(contentDisposition).toContain(getAccessionVersionString(testSequences.testSequenceEntry));
});
});
39 changes: 18 additions & 21 deletions website/tests/pages/sequences/accession.spec.ts
Original file line number Diff line number Diff line change
@@ -1,55 +1,52 @@
import { routes } from '../../../src/routes.ts';
import { getAccessionVersionString } from '../../../src/utils/extractAccessionVersion.ts';
import {
baseUrl,
deprecatedSequenceEntry,
dummyOrganism,
expect,
revisedSequenceEntry,
revocationSequenceEntry,
revokedSequenceEntry,
test,
testSequenceEntry,
} from '../../e2e.fixture';
import { baseUrl, dummyOrganism, expect, test, testSequenceEntryData } from '../../e2e.fixture';
import { getTestSequences } from '../../util/testSequenceProvider.ts';

test.describe('The detailed sequence page', () => {
test('can load and show sequence data', async ({ sequencePage }) => {
await sequencePage.goto();
await expect(sequencePage.page.getByText(testSequenceEntry.orf1a)).not.toBeVisible();
const testSequenceEntry = getTestSequences().testSequenceEntry;

await sequencePage.goto(testSequenceEntry);
await expect(sequencePage.page.getByText(testSequenceEntryData.orf1a)).not.toBeVisible();

await sequencePage.loadSequences();
await sequencePage.clickORF1aButton();

await expect(sequencePage.page.getByText(testSequenceEntry.orf1a, { exact: false })).toBeVisible();
await expect(sequencePage.page.getByText(testSequenceEntryData.orf1a, { exact: false })).toBeVisible();
});

test('check initial sequences and verify that banners are shown when revoked or revised', async ({
sequencePage,
}) => {
await sequencePage.goto(revokedSequenceEntry);
const testSequences = getTestSequences();

await sequencePage.goto(testSequences.revokedSequenceEntry);
await expect(sequencePage.page.getByText(`This sequence entry has been revoked!`)).toBeVisible();
await expect(sequencePage.notLatestVersionBanner).toBeVisible();

await sequencePage.goto(revocationSequenceEntry);
await sequencePage.goto(testSequences.revocationSequenceEntry);
await expect(sequencePage.revocationVersionBanner).toBeVisible();

await sequencePage.goto(deprecatedSequenceEntry);
await sequencePage.goto(testSequences.deprecatedSequenceEntry);
await expect(sequencePage.notLatestVersionBanner).toBeVisible();

await sequencePage.goto(revisedSequenceEntry);
await sequencePage.goto(testSequences.revisedSequenceEntry);
await expect(sequencePage.notLatestVersionBanner).not.toBeVisible();
});

test('can navigate to the versions page and click the link to the deprecated version', async ({ sequencePage }) => {
await sequencePage.goto(revisedSequenceEntry);
const testSequences = getTestSequences();

await sequencePage.goto(testSequences.revisedSequenceEntry);
await sequencePage.gotoAllVersions();
await expect(
sequencePage.page.getByText(`Versions for accession ${revisedSequenceEntry.accession}`),
sequencePage.page.getByText(`Versions for accession ${testSequences.revisedSequenceEntry.accession}`),
).toBeVisible();
await expect(sequencePage.page.getByText(`Latest version`)).toBeVisible();
await expect(sequencePage.page.getByText(`Revised`)).toBeVisible();

const deprecatedVersionString = getAccessionVersionString(deprecatedSequenceEntry);
const deprecatedVersionString = getAccessionVersionString(testSequences.deprecatedSequenceEntry);
const linkToDeprecatedVersion = sequencePage.page.getByRole('link', {
name: `${deprecatedVersionString}`,
});
Expand Down
9 changes: 5 additions & 4 deletions website/tests/pages/sequences/sequences.page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@ import { expect, type Locator, type Page } from '@playwright/test';
import { routes } from '../../../src/routes.ts';
import type { AccessionVersion } from '../../../src/types/backend.ts';
import { getAccessionVersionString } from '../../../src/utils/extractAccessionVersion.ts';
import { baseUrl, dummyOrganism, testSequenceEntry } from '../../e2e.fixture';
import { baseUrl, dummyOrganism } from '../../e2e.fixture';

export class SequencePage {
public readonly notLatestVersionBanner: Locator;
public readonly revocationVersionBanner: Locator;

private readonly loadButton: Locator;
private readonly allVersions: Locator;
private readonly orf1aButton: Locator;
readonly notLatestVersionBanner: Locator;
readonly revocationVersionBanner: Locator;

constructor(public readonly page: Page) {
this.loadButton = this.page.getByRole('button', { name: 'Load sequences' });
Expand All @@ -22,7 +23,7 @@ export class SequencePage {
this.revocationVersionBanner = this.page.getByText('This is a revocation version.');
}

public async goto(accessionVersion: AccessionVersion = testSequenceEntry) {
public async goto(accessionVersion: AccessionVersion) {
await this.page.goto(`${baseUrl}${routes.sequencesDetailsPage(dummyOrganism.key, accessionVersion)}`, {
waitUntil: 'networkidle',
});
Expand Down
2 changes: 0 additions & 2 deletions website/tests/pages/submit/submit.page.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import type { Locator, Page } from '@playwright/test';

import { routes } from '../../../src/routes.ts';
import { restrictedDataUseTermsType } from '../../../src/types/backend.ts';
import {
baseUrl,
compressedMetadataTestFile,
Expand All @@ -10,7 +9,6 @@ import {
metadataTestFile,
sequencesTestFile,
} from '../../e2e.fixture';
import { expect } from '../../e2e.fixture.ts';

export class SubmitPage {
public readonly submitButton: Locator;
Expand Down
Loading
Loading