From d626997c51ac11bcffa8fb9187824e04240c0a90 Mon Sep 17 00:00:00 2001 From: Oliver Eyton-Williams Date: Sun, 21 Jul 2024 18:41:32 +0200 Subject: [PATCH] feat(tools): allow seed script to set user flags (#55534) --- e2e/academic-honesty.spec.ts | 2 +- e2e/cert-username-case-navigation.spec.ts | 2 +- e2e/challenge-reset-modal.spec.ts | 2 +- e2e/codeally.spec.ts | 4 +-- e2e/delete-modal.spec.ts | 2 +- e2e/donate-page-donor.spec.ts | 4 +-- e2e/donation-modal.spec.ts | 8 +++-- e2e/email-settings.spec.ts | 2 +- e2e/exam-survey.spec.ts | 2 +- e2e/failed-updates.spec.ts | 2 +- e2e/global-setup.ts | 2 +- e2e/header.spec.ts | 2 +- e2e/multifile-cert-projects.spec.ts | 2 +- e2e/portfolio.spec.ts | 2 +- e2e/progress-reset-modal.spec.ts | 2 +- e2e/projects.spec.ts | 2 +- e2e/quincy-email-sign-up.spec.ts | 2 +- e2e/show-cert-from-superblock.spec.ts | 2 +- e2e/user-token.spec.ts | 2 +- package.json | 2 +- tools/scripts/seed/seed-demo-user.js | 42 ++++++++++------------- 21 files changed, 44 insertions(+), 48 deletions(-) diff --git a/e2e/academic-honesty.spec.ts b/e2e/academic-honesty.spec.ts index 88a3f23a428..e9395e3515b 100644 --- a/e2e/academic-honesty.spec.ts +++ b/e2e/academic-honesty.spec.ts @@ -69,6 +69,6 @@ test.describe('When the user has not accepted the Academic Honesty Policy', () = }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); }); diff --git a/e2e/cert-username-case-navigation.spec.ts b/e2e/cert-username-case-navigation.spec.ts index 75d6f24c297..4a9c6ef4a8b 100644 --- a/e2e/cert-username-case-navigation.spec.ts +++ b/e2e/cert-username-case-navigation.spec.ts @@ -45,6 +45,6 @@ test.describe('Public profile certifications', () => { }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); }); diff --git a/e2e/challenge-reset-modal.spec.ts b/e2e/challenge-reset-modal.spec.ts index 8fa7ad0698a..6da2d66fc0d 100644 --- a/e2e/challenge-reset-modal.spec.ts +++ b/e2e/challenge-reset-modal.spec.ts @@ -211,7 +211,7 @@ test.describe('Signed in user', () => { }); test.afterEach(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); test('User can reset on a multi-file project after reloading and saving', async ({ diff --git a/e2e/codeally.spec.ts b/e2e/codeally.spec.ts index ce83838f4cf..12f9c9aac7b 100644 --- a/e2e/codeally.spec.ts +++ b/e2e/codeally.spec.ts @@ -5,7 +5,7 @@ test.describe('Before completing the project', () => { test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeEach(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --donor'); + execSync('node ./tools/scripts/seed/seed-demo-user --set-true isDonating'); }); test('should not allow you to submit a URL', async ({ page }) => { @@ -26,7 +26,7 @@ test.describe('After completing the project', () => { test.use({ storageState: 'playwright/.auth/certified-user.json' }); test.beforeAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); test('should allow you to submit a URL', async ({ page }) => { diff --git a/e2e/delete-modal.spec.ts b/e2e/delete-modal.spec.ts index bfd8f92234c..9edc60d1c21 100644 --- a/e2e/delete-modal.spec.ts +++ b/e2e/delete-modal.spec.ts @@ -17,7 +17,7 @@ test.beforeEach(async ({ page }) => { test.afterAll( async () => await Promise.all([ - await execP('node ./tools/scripts/seed/seed-demo-user certified-user'), + await execP('node ./tools/scripts/seed/seed-demo-user --certified-user'), await execP('node ./tools/scripts/seed/seed-surveys'), await execP('node ./tools/scripts/seed/seed-ms-username') ]) diff --git a/e2e/donate-page-donor.spec.ts b/e2e/donate-page-donor.spec.ts index 1382bcf7d5a..32d3f8cc5e5 100644 --- a/e2e/donate-page-donor.spec.ts +++ b/e2e/donate-page-donor.spec.ts @@ -5,12 +5,12 @@ test.describe('Donate page', () => { test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeEach(async ({ page }) => { - execSync('node ./tools/scripts/seed/seed-demo-user --donor'); + execSync('node ./tools/scripts/seed/seed-demo-user --set-true isDonating'); await page.goto('/donate'); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); test('should render the donate page correctly', async ({ page }) => { diff --git a/e2e/donation-modal.spec.ts b/e2e/donation-modal.spec.ts index b4b85405d43..4cd48c5ac52 100644 --- a/e2e/donation-modal.spec.ts +++ b/e2e/donation-modal.spec.ts @@ -247,7 +247,7 @@ test.describe('Donation modal appearance logic - New user', () => { }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); test('should not appear if the user has less than 10 completed challenges in total and has just completed 3 challenges', async ({ @@ -373,11 +373,13 @@ test.describe('Donation modal appearance logic - Donor user', () => { test.use({ storageState: 'playwright/.auth/certified-user.json' }); test.beforeAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user --donor'); + execSync( + 'node ./tools/scripts/seed/seed-demo-user --certified-user --set-true isDonating' + ); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); test('should not appear', async ({ diff --git a/e2e/email-settings.spec.ts b/e2e/email-settings.spec.ts index cfe26fe22c2..ffc182e957e 100644 --- a/e2e/email-settings.spec.ts +++ b/e2e/email-settings.spec.ts @@ -18,7 +18,7 @@ const newEmail = 'foo-update@bar.com'; test.use({ storageState: 'playwright/.auth/certified-user.json' }); test.beforeEach(async ({ page }) => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); await page.goto('/settings'); }); diff --git a/e2e/exam-survey.spec.ts b/e2e/exam-survey.spec.ts index da010610fdd..28260d002fd 100644 --- a/e2e/exam-survey.spec.ts +++ b/e2e/exam-survey.spec.ts @@ -5,7 +5,7 @@ const url = test.describe('Exam Survey', () => { test.use({ storageState: 'playwright/.auth/certified-user.json' }); test.beforeAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); execSync('node tools/scripts/seed/seed-surveys.js delete-only'); }); diff --git a/e2e/failed-updates.spec.ts b/e2e/failed-updates.spec.ts index 15dd87a30d9..94bd8e1bf64 100644 --- a/e2e/failed-updates.spec.ts +++ b/e2e/failed-updates.spec.ts @@ -26,7 +26,7 @@ test.beforeAll(() => { }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); test.describe('failed update flushing', () => { diff --git a/e2e/global-setup.ts b/e2e/global-setup.ts index 92143d7cf7f..5cdf17539c0 100644 --- a/e2e/global-setup.ts +++ b/e2e/global-setup.ts @@ -19,7 +19,7 @@ setup.describe('developmentuser', () => { }); setup.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); setup('can sign in', async ({ request }) => { diff --git a/e2e/header.spec.ts b/e2e/header.spec.ts index 3bc8493d51c..1ac19e49759 100644 --- a/e2e/header.spec.ts +++ b/e2e/header.spec.ts @@ -33,7 +33,7 @@ test.describe('Header', () => { }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); test('Has link for skip content', async ({ page }) => { diff --git a/e2e/multifile-cert-projects.spec.ts b/e2e/multifile-cert-projects.spec.ts index fb5dfcf26af..9f1e10fd52d 100644 --- a/e2e/multifile-cert-projects.spec.ts +++ b/e2e/multifile-cert-projects.spec.ts @@ -4,7 +4,7 @@ import { clearEditor, focusEditor } from './utils/editor'; test.use({ storageState: 'playwright/.auth/certified-user.json' }); test.describe('multifileCertProjects', () => { test.beforeEach(async ({ page }) => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); await page.goto( 'learn/2022/responsive-web-design/build-a-tribute-page-project/build-a-tribute-page' ); diff --git a/e2e/portfolio.spec.ts b/e2e/portfolio.spec.ts index f0c102f100f..51629def38b 100644 --- a/e2e/portfolio.spec.ts +++ b/e2e/portfolio.spec.ts @@ -9,7 +9,7 @@ test.beforeAll(() => { }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); test.describe('Add Portfolio Item', () => { diff --git a/e2e/progress-reset-modal.spec.ts b/e2e/progress-reset-modal.spec.ts index a0603ed8265..d7ca65b84a3 100644 --- a/e2e/progress-reset-modal.spec.ts +++ b/e2e/progress-reset-modal.spec.ts @@ -11,7 +11,7 @@ test.beforeEach(async ({ page }) => { }); test.afterEach(async () => { - await execP('node ./tools/scripts/seed/seed-demo-user certified-user'); + await execP('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); test.describe('Progress reset modal', () => { diff --git a/e2e/projects.spec.ts b/e2e/projects.spec.ts index d187a9db887..8f10ec1aa0f 100644 --- a/e2e/projects.spec.ts +++ b/e2e/projects.spec.ts @@ -78,7 +78,7 @@ test.beforeAll(() => { }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); test.describe('Projects', () => { diff --git a/e2e/quincy-email-sign-up.spec.ts b/e2e/quincy-email-sign-up.spec.ts index a38899b20e4..bb3607f0d90 100644 --- a/e2e/quincy-email-sign-up.spec.ts +++ b/e2e/quincy-email-sign-up.spec.ts @@ -99,7 +99,7 @@ test.describe('Email sign-up page when user is signed in', () => { // terms, otherwise the user will be redirected away from the email sign-up // page. execSync( - 'node ./tools/scripts/seed/seed-demo-user certified-user --unset-privacy-terms' + 'node ./tools/scripts/seed/seed-demo-user --certified-user --set-false acceptedPrivacyTerms' ); await page.goto('/email-sign-up'); diff --git a/e2e/show-cert-from-superblock.spec.ts b/e2e/show-cert-from-superblock.spec.ts index 48f092b081b..69209ccea6a 100644 --- a/e2e/show-cert-from-superblock.spec.ts +++ b/e2e/show-cert-from-superblock.spec.ts @@ -27,7 +27,7 @@ test.describe('When the user HAS NOT claimed their cert', () => { }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); }); diff --git a/e2e/user-token.spec.ts b/e2e/user-token.spec.ts index 2246d079906..88cf267cd0a 100644 --- a/e2e/user-token.spec.ts +++ b/e2e/user-token.spec.ts @@ -11,7 +11,7 @@ test.beforeEach(() => { }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user certified-user'); + execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); }); test.describe('Initially', () => { diff --git a/package.json b/package.json index ad380e855a0..f09aa72819b 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "playwright:install-build-tools": "npx playwright install --with-deps", "rename-challenges": "ts-node tools/challenge-helper-scripts/rename-challenge-files.ts", "seed": "pnpm seed:surveys && pnpm seed:exams && DEBUG=fcc:* node ./tools/scripts/seed/seed-demo-user", - "seed:certified-user": "pnpm seed:surveys && pnpm seed:exams && pnpm seed:ms-username && DEBUG=fcc:* node ./tools/scripts/seed/seed-demo-user certified-user", + "seed:certified-user": "pnpm seed:surveys && pnpm seed:exams && pnpm seed:ms-username && DEBUG=fcc:* node ./tools/scripts/seed/seed-demo-user --certified-user", "seed:exams": "DEBUG=fcc:* node tools/scripts/seed-exams/create-exams", "seed:surveys": "DEBUG=fcc:* node ./tools/scripts/seed/seed-surveys", "seed:ms-username": "DEBUG=fcc:* node ./tools/scripts/seed/seed-ms-username", diff --git a/tools/scripts/seed/seed-demo-user.js b/tools/scripts/seed/seed-demo-user.js index 75a82a70b83..c8b8b7ad29d 100644 --- a/tools/scripts/seed/seed-demo-user.js +++ b/tools/scripts/seed/seed-demo-user.js @@ -1,3 +1,5 @@ +const { parseArgs } = require('node:util'); + const path = require('path'); const debug = require('debug'); const { MongoClient } = require('mongodb'); @@ -11,23 +13,15 @@ const { userIds } = require('./user-data'); -const args = process.argv.slice(2); +const options = { + 'set-true': { type: 'string', multiple: true }, + 'top-contributor': { type: 'boolean' }, + 'set-false': { type: 'string', multiple: true }, + 'seed-trophy-challenges': { type: 'boolean' }, + 'certified-user': { type: 'boolean' } +}; -const allowedArgs = [ - '--donor', - '--top-contributor', - '--unset-privacy-terms', - '--seed-trophy-challenges', - 'certified-user' -]; - -// Check for invalid arguments -args.forEach(arg => { - if (!allowedArgs.includes(arg)) - throw new Error( - `Invalid argument ${arg}. Allowed arguments are ${allowedArgs.join(', ')}` - ); -}); +const { values: argValues } = parseArgs({ options }); const log = debug('fcc:tools:seedLocalAuthUser'); const { MONGOHQ_URL } = process.env; @@ -87,16 +81,16 @@ const trophyChallenges = [ ]; [demoUser, blankUser, fullyCertifiedUser].forEach(user => { - if (args.includes('--donor')) { - user.isDonating = true; - } - if (args.includes('--top-contributor')) { + if (argValues['top-contributor']) { user.yearsTopContributor = ['2017', '2018', '2019']; } - if (args.includes('--unset-privacy-terms')) { - user.acceptedPrivacyTerms = false; + for (const key of argValues['set-false'] || []) { + user[key] = false; } - if (args.includes('--seed-trophy-challenges')) { + for (const key of argValues['set-true'] || []) { + user[key] = true; + } + if (argValues['--seed-trophy-challenges']) { user.completedChallenges = trophyChallenges; } }); @@ -128,7 +122,7 @@ const run = async () => { await dropUserTokens(); await dropUsers(); - if (args.includes('certified-user')) { + if (argValues['certified-user']) { await user.insertOne(fullyCertifiedUser); await user.insertOne(blankUser); await user.insertOne(publicUser);