diff --git a/.github/workflows/frontend-ci.yml b/.github/workflows/frontend-ci.yml index 36b8bf6b7..e7e132baf 100644 --- a/.github/workflows/frontend-ci.yml +++ b/.github/workflows/frontend-ci.yml @@ -31,7 +31,7 @@ jobs: - name: Build Vue app run: yarn run build - test-e2e: + test-e2e-puppeteer: runs-on: ubuntu-latest services: postgres: @@ -122,23 +122,132 @@ jobs: - name: Install E2E tests run: yarn install --frozen-lockfile - working-directory: e2e + working-directory: e2e/puppeteer - name: Lint E2E tests run: yarn run lint --no-fix --max-warnings=0 - working-directory: e2e + working-directory: e2e/puppeteer - name: Run E2E tests run: | # start vue dev server and wait for it to start - yarn --cwd ../web/ run dev 2> /dev/null & + yarn --cwd ../../web/ run dev 2> /dev/null & while ! nc -z localhost 8085; do sleep 3 done # start the dandi-api server - python ../manage.py runserver & + python ../../manage.py runserver & # run the E2E tests yarn run test - working-directory: e2e + working-directory: e2e/puppeteer + + test-e2e-playwright: + runs-on: ubuntu-latest + services: + postgres: + image: postgres:latest + env: + POSTGRES_DB: django + POSTGRES_PASSWORD: postgres + ports: + - 5432:5432 + rabbitmq: + image: rabbitmq:management + ports: + - 5672:5672 + minio: + # This image does not require any command arguments (which GitHub Actions don't support) + image: bitnami/minio:latest + env: + MINIO_ROOT_USER: minioAccessKey + MINIO_ROOT_PASSWORD: minioSecretKey + ports: + - 9000:9000 + env: + # API server env vars + DJANGO_DATABASE_URL: postgres://postgres:postgres@localhost:5432/django + DJANGO_MINIO_STORAGE_ENDPOINT: localhost:9000 + DJANGO_MINIO_STORAGE_ACCESS_KEY: minioAccessKey + DJANGO_MINIO_STORAGE_SECRET_KEY: minioSecretKey + DJANGO_STORAGE_BUCKET_NAME: dandi-bucket + DJANGO_DANDI_DANDISETS_BUCKET_NAME: dandi-bucket + DJANGO_DANDI_DANDISETS_LOG_BUCKET_NAME: dandiapi-dandisets-logs + DJANGO_DANDI_DANDISETS_EMBARGO_BUCKET_NAME: dandi-embargo-dandisets + DJANGO_DANDI_DANDISETS_EMBARGO_LOG_BUCKET_NAME: dandiapi-embargo-dandisets-logs + DJANGO_DANDI_WEB_APP_URL: http://localhost:8085 + DJANGO_DANDI_API_URL: http://localhost:8000 + DJANGO_DANDI_JUPYTERHUB_URL: https://hub.dandiarchive.org/ + DANDI_ALLOW_LOCALHOST_URLS: 1 + + # Web client env vars + VITE_APP_DANDI_API_ROOT: http://localhost:8000/api/ + VITE_APP_OAUTH_API_ROOT: http://localhost:8000/oauth/ + VITE_APP_OAUTH_CLIENT_ID: Dk0zosgt1GAAKfN8LT4STJmLJXwMDPbYWYzfNtAl + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install web app + run: yarn install --frozen-lockfile + working-directory: web + + - name: Install latest version of pip + run: pip install --upgrade pip + + - uses: actions/cache@v4 + id: pip-cache + with: + path: ${{ env.pythonLocation}}/lib/python3.11/site-packages/* + key: ${{ env.pythonLocation }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('setup.py') }} + + - name: Install dandi-api dependencies + run: pip install --upgrade --upgrade-strategy eager -e .[dev] + + - name: Apply migrations to API server + run: python manage.py migrate + + - name: Create any cache tables + run: python manage.py createcachetable + + - name: Install test data + run: python manage.py loaddata playwright + + - name: Install dependencies + run: yarn install --frozen-lockfile + working-directory: e2e/playwright + + - name: Install Playwright Browsers + run: npx playwright install --with-deps + working-directory: e2e/playwright + + - name: Run Playwright tests + run: | + # start vue dev server + yarn --cwd ../../web/ run dev 2> /dev/null & + while ! nc -z localhost 8085; do + sleep 3 + done + + # start the dandi-api server + python ../../manage.py runserver & + + # run the tests + npx playwright test + working-directory: e2e/playwright + + - uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report + path: e2e/playwright/playwright-report/ + retention-days: 30 diff --git a/dandiapi/api/fixtures/playwright.json.xz b/dandiapi/api/fixtures/playwright.json.xz new file mode 100644 index 000000000..345080fb6 Binary files /dev/null and b/dandiapi/api/fixtures/playwright.json.xz differ diff --git a/e2e/playwright/.gitignore b/e2e/playwright/.gitignore new file mode 100644 index 000000000..68c5d18f0 --- /dev/null +++ b/e2e/playwright/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/e2e/playwright/package.json b/e2e/playwright/package.json new file mode 100644 index 000000000..f3ef6b5c5 --- /dev/null +++ b/e2e/playwright/package.json @@ -0,0 +1,10 @@ +{ + "name": "dandi-playwright-test", + "scripts": {}, + "devDependencies": { + "@playwright/test": "^1.41.2", + "@types/node": "^20.11.19", + "axios": "^1.6.7", + "lodash": "^4.17.21" + } +} diff --git a/e2e/playwright/playwright.config.ts b/e2e/playwright/playwright.config.ts new file mode 100644 index 000000000..0b509f824 --- /dev/null +++ b/e2e/playwright/playwright.config.ts @@ -0,0 +1,47 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './.', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + workers: 4, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + + screenshot: 'only-on-failure', + }, + + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // url: 'http://127.0.0.1:3000', + // reuseExistingServer: !process.env.CI, + // }, +}); diff --git a/e2e/playwright/tests/meditor.spec.ts b/e2e/playwright/tests/meditor.spec.ts new file mode 100644 index 000000000..5db95faef --- /dev/null +++ b/e2e/playwright/tests/meditor.spec.ts @@ -0,0 +1,506 @@ +import { test, expect, type Page } from "@playwright/test"; + +const clientUrl = "http://localhost:8085"; + +const noLicenseSelector = async (page: Page) => { + await page.getByRole("tab", { name: "General Badge" }).click(); + await expect(page.getByText("LicenseNo less than 1 items")).toBeVisible(); +}; +const noContributorSelector = async (page: Page) => { + await expect( + page.getByRole("tab", { name: "Dandiset contributors Badge" }) + ).toBeVisible(); +}; +const invalidLicenseSelector = async (page: Page) => { + await page.getByRole("tab", { name: "General Badge" }).click(); + await expect( + page.getByRole("button", { name: "License spdx:CC-BY-NC-" }) + ).toBeVisible(); +}; +const titleTooLongSelector = async (page: Page) => { + await page.getByRole("tab", { name: "General Badge" }).click(); + await expect( + page.getByText("Dandiset title150 characters maximum") + ).toBeVisible(); +}; + +const allDandisets = [ + "000003", + "000004", + "000005", + "000006", + "000007", + "000008", + "000009", + "000010", + "000011", + "000012", + "000013", + "000015", + "000016", + "000017", + "000018", + "000019", + "000020", + "000021", + "000022", + "000023", + "000024", + "000025", + "000026", + "000027", + "000028", + "000029", + "000030", + "000031", + "000032", + "000033", + "000034", + "000035", + "000036", + "000037", + "000038", + "000039", + "000040", + "000041", + "000042", + "000043", + "000044", + "000045", + "000046", + "000047", + "000048", + "000049", + "000050", + "000051", + "000052", + "000053", + "000054", + "000055", + "000056", + "000058", + "000059", + "000060", + "000061", + "000063", + "000064", + "000065", + "000066", + "000067", + "000068", + "000070", + "000071", + "000072", + "000105", + "000106", + "000107", + "000108", + "000109", + "000111", + "000112", + "000113", + "000114", + "000115", + "000116", + "000117", + "000118", + "000120", + "000121", + "000122", + "000123", + "000124", + "000125", + "000126", + "000127", + "000128", + "000129", + "000130", + "000131", + "000132", + "000133", + "000134", + "000135", + "000136", + "000137", + "000138", + "000139", + "000140", + "000141", + "000142", + "000143", + "000144", + "000145", + "000146", + "000147", + "000148", + "000149", + "000150", + "000151", + "000153", + "000154", + "000155", + "000156", + "000157", + "000158", + "000159", + "000160", + "000161", + "000162", + "000163", + "000164", + "000165", + "000166", + "000167", + "000168", + "000169", + "000170", + "000171", + "000172", + "000173", + "000206", + "000207", + "000208", + "000209", + "000210", + "000211", + "000212", + "000213", + "000214", + "000215", + "000216", + "000217", + "000218", + "000219", + "000220", + "000221", + "000222", + "000223", + "000225", + "000226", + "000227", + "000228", + "000229", + "000230", + "000231", + "000232", + "000233", + "000235", + "000236", + "000237", + "000238", + "000239", + "000241", + "000243", + "000244", + "000245", + "000246", + "000247", + "000248", + "000249", + "000250", + "000251", + "000252", + "000253", + "000255", + "000288", + "000290", + "000292", + "000293", + "000294", + "000295", + "000296", + "000297", + "000298", + "000299", + "000301", + "000302", + "000335", + "000337", + "000338", + "000339", + "000340", + "000341", + "000343", + "000346", + "000347", + "000348", + "000349", + "000350", + "000351", + "000359", + "000362", + "000363", + "000364", + "000397", + "000398", + "000399", + "000400", + "000401", + "000402", + "000404", + "000405", + "000406", + "000409", + "000410", + "000411", + "000444", + "000445", + "000447", + "000448", + "000449", + "000451", + "000452", + "000454", + "000456", + "000457", + "000458", + "000461", + "000462", + "000463", + "000465", + "000466", + "000467", + "000468", + "000469", + "000470", + "000472", + "000473", + "000474", + "000476", + "000478", + "000479", + "000480", + "000481", + "000482", + "000483", + "000487", + "000488", + "000489", + "000490", + "000491", + "000492", + "000529", + "000530", + "000532", + "000534", + "000535", + "000536", + "000537", + "000538", + "000539", + "000540", + "000541", + "000542", + "000543", + "000544", + "000545", + "000546", + "000547", + "000548", + "000549", + "000550", + "000552", + "000554", + "000555", + "000556", + "000557", + "000558", + "000559", + "000560", + "000564", + "000565", + "000566", + "000567", + "000568", + "000569", + "000570", + "000571", + "000572", + "000574", + "000575", + "000576", + "000577", + "000579", + "000582", + "000615", + "000618", + "000619", + "000623", + "000624", + "000625", + "000626", + "000628", + "000629", + "000630", + "000631", + "000632", + "000633", + "000634", + "000635", + "000636", + "000637", + "000638", + "000640", + "000673", + "000674", + "000676", + "000677", + "000678", + "000679", + "000680", + "000682", + "000683", + "000686", + "000687", + "000688", + "000689", + "000691", + "000692", + "000693", + "000694", + "000695", + "000696", + "000710", + "000711", + "000712", + "000713", + "000714", + "000715", + "000717", + "000718", + "000719", + "000722", + "000723", + "000724", + "000726", + "000727", + "000728", + "000730", + "000732", + "000733", + "000766", + "000768", + "000769", + "000776", + "000784", + "000871", + "000872", + "000875", + "000876", + "000877", + "000878", + "000880", + "000881", + "000886", + "000887", + "000891", + "000893", +]; + +const invalidDandisets = { + "000018": [noLicenseSelector], + "000021": [noLicenseSelector], + "000022": [noLicenseSelector], + "000024": [noContributorSelector, noLicenseSelector], + "000028": [noContributorSelector, noLicenseSelector], + "000030": [noContributorSelector, noLicenseSelector], + "000031": [noContributorSelector, noLicenseSelector], + "000033": [noContributorSelector, noLicenseSelector], + "000038": [noContributorSelector, noLicenseSelector], + "000042": [noContributorSelector, noLicenseSelector], + "000046": [noContributorSelector, noLicenseSelector], + "000047": [noContributorSelector, noLicenseSelector], + "000050": [noContributorSelector, noLicenseSelector], + "000051": [noContributorSelector, noLicenseSelector], + "000052": [noContributorSelector, noLicenseSelector], + "000060": [noLicenseSelector], + "000063": [noContributorSelector, noLicenseSelector], + "000068": [noContributorSelector, noLicenseSelector], + "000071": [noContributorSelector], + "000072": [noContributorSelector, noLicenseSelector], + "000106": [invalidLicenseSelector], + "000107": [invalidLicenseSelector, noContributorSelector], + "000112": [noContributorSelector, noLicenseSelector], + "000113": [noContributorSelector, noLicenseSelector], + "000116": [noLicenseSelector], + "000120": [noLicenseSelector], + "000124": [noLicenseSelector], + "000131": [noLicenseSelector], + "000132": [noLicenseSelector], + "000133": [noLicenseSelector], + "000134": [noLicenseSelector], + "000135": [noLicenseSelector], + "000136": [noLicenseSelector], + "000137": [noLicenseSelector], + "000141": [invalidLicenseSelector], + "000144": [noLicenseSelector], + "000145": [noLicenseSelector], + "000146": [noLicenseSelector], + "000150": [noLicenseSelector], + "000151": [noLicenseSelector], + "000155": [noLicenseSelector], + "000157": [noLicenseSelector], + "000158": [noLicenseSelector], + "000160": [noLicenseSelector], + "000162": [noLicenseSelector], + "000164": [noLicenseSelector], + "000170": [noLicenseSelector], + "000171": [noLicenseSelector], + "000208": [noLicenseSelector], + "000210": [noLicenseSelector], + "000214": [noLicenseSelector], + "000216": [noLicenseSelector], + "000225": [noLicenseSelector], + "000227": [noLicenseSelector], + "000229": [noLicenseSelector], + "000255": [noLicenseSelector], + "000290": [noLicenseSelector], + "000362": [titleTooLongSelector], + "000449": [noLicenseSelector], + "000534": [noContributorSelector], +}; + +test.describe("Test meditor validation errors", async () => { + test.beforeEach(async ({ page }) => { + await page.goto(clientUrl); + await page.getByRole("button", { name: "Log In with GitHub" }).click(); + await page.getByPlaceholder("Email address").click(); + await page.getByPlaceholder("Email address").fill("admin@kitware.com"); + await page.getByPlaceholder("Password").click(); + await page.getByPlaceholder("Password").fill("password"); + await page.getByRole("button", { name: "Sign In " }).click(); + await page.waitForLoadState("networkidle"); + }); + + for (const dandisetId of allDandisets) { + test(`Test dandiset ${dandisetId}`, async ({ page }) => { + await page.goto(`${clientUrl}/#/dandiset/${dandisetId}/draft/`); + await page.getByRole("button", { name: "Metadata" }).click(); + + await page.getByLabel("Dandiset title").click(); + await page.keyboard.press("End"); + await page.keyboard.press("Space"); + await page.keyboard.press("Tab"); + await page.getByLabel("Dandiset title").click(); + await page.keyboard.press("End"); + await page.keyboard.press("Backspace"); + await page.keyboard.press("Tab"); + await page.locator(".v-card__actions > button").first().click(); + await page.waitForTimeout(3000); + await page.waitForLoadState("networkidle"); + + const validIcon = await page.locator(".v-card__actions > i"); + const iconClass = await validIcon.getAttribute("class"); + + if (Object.keys(invalidDandisets).includes(dandisetId)) { + expect(iconClass).toContain("mdi-alert-circle"); + const tests = invalidDandisets[dandisetId]; + for (const test of tests) { + await test(page); + } + } else { + expect(iconClass).toContain("mdi-checkbox-marked-circle"); + } + }); + } +}); diff --git a/e2e/playwright/yarn.lock b/e2e/playwright/yarn.lock new file mode 100644 index 000000000..7cafa7c12 --- /dev/null +++ b/e2e/playwright/yarn.lock @@ -0,0 +1,103 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@playwright/test@^1.41.2": + version "1.41.2" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.41.2.tgz#bd9db40177f8fd442e16e14e0389d23751cdfc54" + integrity sha512-qQB9h7KbibJzrDpkXkYvsmiDJK14FULCCZgEcoe2AvFAS64oCirWTwzTlAYEbKaRxWs5TFesE1Na6izMv3HfGg== + dependencies: + playwright "1.41.2" + +"@types/node@^20.11.19": + version "20.11.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.19.tgz#b466de054e9cb5b3831bee38938de64ac7f81195" + integrity sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ== + dependencies: + undici-types "~5.26.4" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.6.7: + version "1.6.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" + integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== + dependencies: + follow-redirects "^1.15.4" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +follow-redirects@^1.15.4: + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fsevents@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +playwright-core@1.41.2: + version "1.41.2" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.41.2.tgz#db22372c708926c697acc261f0ef8406606802d9" + integrity sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA== + +playwright@1.41.2: + version "1.41.2" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.41.2.tgz#4e760b1c79f33d9129a8c65cc27953be6dd35042" + integrity sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A== + dependencies: + playwright-core "1.41.2" + optionalDependencies: + fsevents "2.3.2" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== diff --git a/e2e/.gitignore b/e2e/puppeteer/.gitignore similarity index 100% rename from e2e/.gitignore rename to e2e/puppeteer/.gitignore diff --git a/e2e/README.md b/e2e/puppeteer/README.md similarity index 100% rename from e2e/README.md rename to e2e/puppeteer/README.md diff --git a/e2e/babel.config.js b/e2e/puppeteer/babel.config.js similarity index 100% rename from e2e/babel.config.js rename to e2e/puppeteer/babel.config.js diff --git a/e2e/jest-puppeteer.config.js b/e2e/puppeteer/jest-puppeteer.config.js similarity index 100% rename from e2e/jest-puppeteer.config.js rename to e2e/puppeteer/jest-puppeteer.config.js diff --git a/e2e/jest.config.js b/e2e/puppeteer/jest.config.js similarity index 100% rename from e2e/jest.config.js rename to e2e/puppeteer/jest.config.js diff --git a/e2e/jest.setup.js b/e2e/puppeteer/jest.setup.js similarity index 100% rename from e2e/jest.setup.js rename to e2e/puppeteer/jest.setup.js diff --git a/e2e/package.json b/e2e/puppeteer/package.json similarity index 100% rename from e2e/package.json rename to e2e/puppeteer/package.json diff --git a/e2e/src/pages/homePage.js b/e2e/puppeteer/src/pages/homePage.js similarity index 100% rename from e2e/src/pages/homePage.js rename to e2e/puppeteer/src/pages/homePage.js diff --git a/e2e/src/pages/searchPage.js b/e2e/puppeteer/src/pages/searchPage.js similarity index 100% rename from e2e/src/pages/searchPage.js rename to e2e/puppeteer/src/pages/searchPage.js diff --git a/e2e/src/tests/account.test.js b/e2e/puppeteer/src/tests/account.test.js similarity index 100% rename from e2e/src/tests/account.test.js rename to e2e/puppeteer/src/tests/account.test.js diff --git a/e2e/src/tests/cookies.test.js b/e2e/puppeteer/src/tests/cookies.test.js similarity index 100% rename from e2e/src/tests/cookies.test.js rename to e2e/puppeteer/src/tests/cookies.test.js diff --git a/e2e/src/tests/dandisetLandingPage.test.js b/e2e/puppeteer/src/tests/dandisetLandingPage.test.js similarity index 100% rename from e2e/src/tests/dandisetLandingPage.test.js rename to e2e/puppeteer/src/tests/dandisetLandingPage.test.js diff --git a/e2e/src/tests/dandisetsPage.test.js b/e2e/puppeteer/src/tests/dandisetsPage.test.js similarity index 100% rename from e2e/src/tests/dandisetsPage.test.js rename to e2e/puppeteer/src/tests/dandisetsPage.test.js diff --git a/e2e/src/tests/fileBrowserPage.test.js b/e2e/puppeteer/src/tests/fileBrowserPage.test.js similarity index 100% rename from e2e/src/tests/fileBrowserPage.test.js rename to e2e/puppeteer/src/tests/fileBrowserPage.test.js diff --git a/e2e/src/tests/homePage.test.js b/e2e/puppeteer/src/tests/homePage.test.js similarity index 100% rename from e2e/src/tests/homePage.test.js rename to e2e/puppeteer/src/tests/homePage.test.js diff --git a/e2e/src/tests/registerDandiset.test.js b/e2e/puppeteer/src/tests/registerDandiset.test.js similarity index 100% rename from e2e/src/tests/registerDandiset.test.js rename to e2e/puppeteer/src/tests/registerDandiset.test.js diff --git a/e2e/src/util.js b/e2e/puppeteer/src/util.js similarity index 100% rename from e2e/src/util.js rename to e2e/puppeteer/src/util.js diff --git a/e2e/yarn.lock b/e2e/puppeteer/yarn.lock similarity index 100% rename from e2e/yarn.lock rename to e2e/puppeteer/yarn.lock