From 2a57215dbeb8b01f34be48adbcdbd0131b6bc5c0 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 14 Oct 2025 09:55:46 +0200 Subject: [PATCH 1/6] msw: Update `@msw/data` to v1 and add `zod` dependency --- packages/crates-io-msw/package.json | 5 +- pnpm-lock.yaml | 108 +++++++++------------------- 2 files changed, 35 insertions(+), 78 deletions(-) diff --git a/packages/crates-io-msw/package.json b/packages/crates-io-msw/package.json index 5725297a3ca..3ebede0373c 100644 --- a/packages/crates-io-msw/package.json +++ b/packages/crates-io-msw/package.json @@ -18,9 +18,10 @@ "test": "vitest" }, "dependencies": { - "@mswjs/data": "0.16.2", + "@msw/data": "1.1.2", "msw": "2.12.3", - "semver": "7.7.3" + "semver": "7.7.3", + "zod": "4.1.13" }, "devDependencies": { "vitest": "4.0.13" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b26d0d5727..6c2aeb0536f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -324,15 +324,18 @@ importers: packages/crates-io-msw: dependencies: - '@mswjs/data': - specifier: 0.16.2 - version: 0.16.2(@types/node@24.10.1)(typescript@5.9.3) + '@msw/data': + specifier: 1.1.2 + version: 1.1.2 msw: specifier: 2.12.3 version: 2.12.3(@types/node@24.10.1)(typescript@5.9.3) semver: specifier: 7.7.3 version: 7.7.3 + zod: + specifier: 4.1.13 + version: 4.1.13 devDependencies: vitest: specifier: 4.0.13 @@ -1782,14 +1785,13 @@ packages: resolution: {integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==} engines: {node: '>=4'} + '@msw/data@1.1.2': + resolution: {integrity: sha512-beEM1cfb59FdoSV9pmWI+Vllf+QxoYtIDiVE9b1awVAWTa9eeDIZAi1qispBuSSnzZam6lIljCFPYJbXOwEbvA==} + '@mswjs/cookies@1.1.1': resolution: {integrity: sha512-W68qOHEjx1iD+4VjQudlx26CPIoxmIAtK4ZCexU0/UJBG6jYhcuyzKJx+Iw8uhBIGd9eba64XgWVgo20it1qwA==} engines: {node: '>=18'} - '@mswjs/data@0.16.2': - resolution: {integrity: sha512-/C0d/PBcJyQJokUhcjO4HiZPc67hzllKlRtD1XELygl2t991/ATAAQJVcStn4YtVALsNodruzOHT0JIvgr0hnA==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@mswjs/interceptors@0.40.0': resolution: {integrity: sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==} engines: {node: '>=18'} @@ -2150,12 +2152,6 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/lodash@4.17.20': - resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} - - '@types/md5@2.3.6': - resolution: {integrity: sha512-WD69gNXtRBnpknfZcb4TRQ0XJQbUPZcai/Qdhmka3sxUR3Et8NrXoeAoknG/LghYHTf4ve795rInVYHBTQdNVA==} - '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -2165,9 +2161,6 @@ packages: '@types/node@24.10.1': resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} - '@types/pluralize@0.0.29': - resolution: {integrity: sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA==} - '@types/q@1.5.8': resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==} @@ -2204,9 +2197,6 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -3001,9 +2991,6 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - charenc@0.0.2: - resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - charm@1.0.2: resolution: {integrity: sha512-wqW3VdPnlSWT4eRiYX+hcs+C6ViBPUWk1qTCd+37qw9kEm/a5n2qcyQDMBWvSYKN/ctqZzeXNQaeBjOetJJUkw==} @@ -3467,9 +3454,6 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crypt@0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} @@ -3748,10 +3732,6 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} @@ -4331,6 +4311,9 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es-toolkit@1.40.0: + resolution: {integrity: sha512-8o6w0KFmU0CiIl0/Q/BCEOabF2IJaELM1T2PWj6e8KqzHv1gdx+7JtFnDwOx1kJH/isJ5NwlDG1nCr1HrRF94Q==} + esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -5827,9 +5810,6 @@ packages: mathml-tag-names@2.1.3: resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} - md5@2.3.0: - resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} - mdn-data@1.1.4: resolution: {integrity: sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==} @@ -5996,6 +5976,10 @@ packages: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true + mutative@1.3.0: + resolution: {integrity: sha512-8MJj6URmOZAV70dpFe1YnSppRTKC4DsMkXQiBDFayLcDI4ljGokHxmpqaBQuDWa4iAxWaJJ1PS8vAmbntjjKmQ==} + engines: {node: '>=14.0'} + mute-stream@0.0.7: resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} @@ -6726,7 +6710,6 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. - (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qs@6.13.0: @@ -8184,6 +8167,9 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + zod@4.1.13: + resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} + snapshots: '@antfu/install-pkg@1.1.0': @@ -10118,29 +10104,15 @@ snapshots: call-me-maybe: 1.0.2 glob-to-regexp: 0.3.0 - '@mswjs/cookies@1.1.1': {} - - '@mswjs/data@0.16.2(@types/node@24.10.1)(typescript@5.9.3)': + '@msw/data@1.1.2': dependencies: - '@types/lodash': 4.17.20 - '@types/md5': 2.3.6 - '@types/pluralize': 0.0.29 - '@types/uuid': 8.3.4 - date-fns: 2.30.0 - debug: 4.4.3(supports-color@8.1.1) - graphql: 16.12.0 - lodash: 4.17.21 - md5: 2.3.0 + '@standard-schema/spec': 1.0.0 + es-toolkit: 1.40.0 + mutative: 1.3.0 outvariant: 1.4.3 - pluralize: 8.0.0 - strict-event-emitter: 0.5.1 - uuid: 8.3.2 - optionalDependencies: - msw: 2.12.3(@types/node@24.10.1)(typescript@5.9.3) - transitivePeerDependencies: - - '@types/node' - - supports-color - - typescript + rettime: 0.7.0 + + '@mswjs/cookies@1.1.1': {} '@mswjs/interceptors@0.40.0': dependencies: @@ -10658,10 +10630,6 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/lodash@4.17.20': {} - - '@types/md5@2.3.6': {} - '@types/mime@1.3.5': {} '@types/minimatch@3.0.5': {} @@ -10670,8 +10638,6 @@ snapshots: dependencies: undici-types: 7.16.0 - '@types/pluralize@0.0.29': {} - '@types/q@1.5.8': {} '@types/qs@6.14.0': {} @@ -10709,8 +10675,6 @@ snapshots: '@types/trusted-types@2.0.7': optional: true - '@types/uuid@8.3.4': {} - '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.35': @@ -11844,8 +11808,6 @@ snapshots: chardet@2.1.1: {} - charenc@0.0.2: {} - charm@1.0.2: dependencies: inherits: 2.0.4 @@ -12147,8 +12109,6 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - crypt@0.0.2: {} - crypto-random-string@2.0.0: {} cson-parser@4.0.9: @@ -12469,10 +12429,6 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - date-fns@2.30.0: - dependencies: - '@babel/runtime': 7.28.4 - date-fns@4.1.0: {} dayjs@1.11.19: {} @@ -13628,6 +13584,8 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es-toolkit@1.40.0: {} + esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -15430,12 +15388,6 @@ snapshots: mathml-tag-names@2.1.3: {} - md5@2.3.0: - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - is-buffer: 1.1.6 - mdn-data@1.1.4: {} mdn-data@2.0.14: {} @@ -15640,6 +15592,8 @@ snapshots: mustache@4.2.0: {} + mutative@1.3.0: {} + mute-stream@0.0.7: {} mute-stream@0.0.8: {} @@ -18056,3 +18010,5 @@ snapshots: yocto-queue@1.2.2: {} yoctocolors-cjs@2.1.3: {} + + zod@4.1.13: {} From 368e52d267433b71d269ad62077460bd6af30f1d Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 14 Oct 2025 11:49:52 +0200 Subject: [PATCH 2/6] msw: Migrate models to new `@msw/data` API --- packages/crates-io-msw/index.js | 32 +------ packages/crates-io-msw/models/api-token.js | 71 ++++++++------ .../crates-io-msw/models/api-token.test.js | 14 +-- packages/crates-io-msw/models/category.js | 43 +++++---- .../crates-io-msw/models/category.test.js | 12 +-- .../models/crate-owner-invitation.js | 67 +++++++------ .../models/crate-owner-invitation.test.js | 42 ++++---- .../crates-io-msw/models/crate-ownership.js | 61 +++++++----- .../models/crate-ownership.test.js | 56 ++++------- packages/crates-io-msw/models/crate.js | 73 ++++++++------ packages/crates-io-msw/models/crate.test.js | 24 ++--- packages/crates-io-msw/models/dependency.js | 70 ++++++++------ .../crates-io-msw/models/dependency.test.js | 32 ++----- packages/crates-io-msw/models/index.js | 95 +++++++++++++++++++ packages/crates-io-msw/models/keyword.js | 26 +++-- packages/crates-io-msw/models/keyword.test.js | 12 +-- packages/crates-io-msw/models/msw-session.js | 31 +++--- .../crates-io-msw/models/msw-session.test.js | 14 +-- packages/crates-io-msw/models/team.js | 43 +++++---- packages/crates-io-msw/models/team.test.js | 12 +-- .../models/trustpub/github-config.js | 50 ++++++---- .../models/trustpub/gitlab-config.js | 50 ++++++---- .../models/trustpub/gitlab-config.test.js | 20 ++-- packages/crates-io-msw/models/user.js | 61 +++++++----- packages/crates-io-msw/models/user.test.js | 12 +-- .../crates-io-msw/models/version-download.js | 39 +++++--- .../models/version-download.test.js | 20 ++-- packages/crates-io-msw/models/version.js | 91 ++++++++++-------- packages/crates-io-msw/models/version.test.js | 14 +-- packages/crates-io-msw/utils/factory.d.ts | 7 -- packages/crates-io-msw/utils/factory.js | 53 ----------- .../utils/pre-create-extension.js | 15 +++ 32 files changed, 661 insertions(+), 601 deletions(-) create mode 100644 packages/crates-io-msw/models/index.js delete mode 100644 packages/crates-io-msw/utils/factory.d.ts delete mode 100644 packages/crates-io-msw/utils/factory.js create mode 100644 packages/crates-io-msw/utils/pre-create-extension.js diff --git a/packages/crates-io-msw/index.js b/packages/crates-io-msw/index.js index 83e7b40fb43..bdfca3c0485 100644 --- a/packages/crates-io-msw/index.js +++ b/packages/crates-io-msw/index.js @@ -14,21 +14,6 @@ import teamHandlers from './handlers/teams.js'; import trustpubHandlers from './handlers/trustpub.js'; import userHandlers from './handlers/users.js'; import versionHandlers from './handlers/versions.js'; -import apiToken from './models/api-token.js'; -import category from './models/category.js'; -import crateOwnerInvitation from './models/crate-owner-invitation.js'; -import crateOwnership from './models/crate-ownership.js'; -import crate from './models/crate.js'; -import dependency from './models/dependency.js'; -import keyword from './models/keyword.js'; -import mswSession from './models/msw-session.js'; -import team from './models/team.js'; -import trustpubGithubConfig from './models/trustpub/github-config.js'; -import trustpubGitlabConfig from './models/trustpub/gitlab-config.js'; -import user from './models/user.js'; -import versionDownload from './models/version-download.js'; -import version from './models/version.js'; -import { factory } from './utils/factory.js'; export const handlers = [ ...apiTokenHandlers, @@ -49,19 +34,4 @@ export const handlers = [ ...versionHandlers, ]; -export const db = factory({ - apiToken, - category, - crateOwnerInvitation, - crateOwnership, - crate, - dependency, - keyword, - mswSession, - team, - trustpubGithubConfig, - trustpubGitlabConfig, - user, - versionDownload, - version, -}); +export { db } from './models/index.js'; diff --git a/packages/crates-io-msw/models/api-token.js b/packages/crates-io-msw/models/api-token.js index 1d3bd2b4ac5..8d2237cf9ec 100644 --- a/packages/crates-io-msw/models/api-token.js +++ b/packages/crates-io-msw/models/api-token.js @@ -1,39 +1,48 @@ -import { nullable, oneOf, primaryKey } from '@mswjs/data'; +import { Collection } from '@msw/data'; +import { z } from 'zod'; import { applyDefault } from '../utils/defaults.js'; +import { preCreateExtension } from '../utils/pre-create-extension.js'; import { seededRandom } from '../utils/random.js'; -export default { - id: primaryKey(Number), - - crateScopes: nullable(Array), - createdAt: String, - endpointScopes: nullable(Array), - expiredAt: nullable(String), - lastUsedAt: nullable(String), - name: String, - token: String, - revoked: Boolean, - - user: oneOf('user'), - - preCreate(attrs, counter) { - applyDefault(attrs, 'id', () => counter); - applyDefault(attrs, 'crateScopes', () => null); - applyDefault(attrs, 'createdAt', () => '2017-11-19T17:59:22Z'); - applyDefault(attrs, 'endpointScopes', () => null); - applyDefault(attrs, 'expiredAt', () => null); - applyDefault(attrs, 'lastUsedAt', () => null); - applyDefault(attrs, 'name', () => `API Token ${attrs.id}`); - applyDefault(attrs, 'token', () => generateToken(counter)); - applyDefault(attrs, 'revoked', () => false); - - if (!attrs.user) { - throw new Error('Missing `user` relationship on `api-token`'); - } - }, -}; +const schema = z.object({ + id: z.number(), + + crateScopes: z.array(z.any()).nullable(), + createdAt: z.string(), + endpointScopes: z.array(z.any()).nullable(), + expiredAt: z.string().nullable(), + lastUsedAt: z.string().nullable(), + name: z.string(), + token: z.string(), + revoked: z.boolean(), + + user: z.any(), +}); + +function preCreate(attrs, counter) { + applyDefault(attrs, 'id', () => counter); + applyDefault(attrs, 'crateScopes', () => null); + applyDefault(attrs, 'createdAt', () => '2017-11-19T17:59:22Z'); + applyDefault(attrs, 'endpointScopes', () => null); + applyDefault(attrs, 'expiredAt', () => null); + applyDefault(attrs, 'lastUsedAt', () => null); + applyDefault(attrs, 'name', () => `API Token ${attrs.id}`); + applyDefault(attrs, 'token', () => generateToken(counter)); + applyDefault(attrs, 'revoked', () => false); + + if (!attrs.user) { + throw new Error('Missing `user` relationship on `api-token`'); + } +} function generateToken(seed) { return seededRandom(seed).toString().slice(2); } + +const collection = new Collection({ + schema, + extensions: [preCreateExtension(preCreate)], +}); + +export default collection; diff --git a/packages/crates-io-msw/models/api-token.test.js b/packages/crates-io-msw/models/api-token.test.js index 135b78352b9..b21c5811d7d 100644 --- a/packages/crates-io-msw/models/api-token.test.js +++ b/packages/crates-io-msw/models/api-token.test.js @@ -2,15 +2,15 @@ import { test } from 'vitest'; import { db } from '../index.js'; -test('throws if `user` is not set', ({ expect }) => { - expect(() => db.apiToken.create()).toThrowErrorMatchingInlineSnapshot( +test('throws if `user` is not set', async ({ expect }) => { + await expect(() => db.apiToken.create()).rejects.toThrowErrorMatchingInlineSnapshot( `[Error: Missing \`user\` relationship on \`api-token\`]`, ); }); -test('happy path', ({ expect }) => { - let user = db.user.create(); - let session = db.apiToken.create({ user }); +test('happy path', async ({ expect }) => { + let user = await db.user.create(); + let session = await db.apiToken.create({ user }); expect(session).toMatchInlineSnapshot(` { "crateScopes": null, @@ -34,11 +34,7 @@ test('happy path', ({ expect }) => { "name": "User 1", "publishNotifications": true, "url": "https://github.com/user-1", - Symbol(type): "user", - Symbol(primaryKey): "id", }, - Symbol(type): "apiToken", - Symbol(primaryKey): "id", } `); }); diff --git a/packages/crates-io-msw/models/category.js b/packages/crates-io-msw/models/category.js index c88e9b6d23d..f50b01d7f5a 100644 --- a/packages/crates-io-msw/models/category.js +++ b/packages/crates-io-msw/models/category.js @@ -1,23 +1,32 @@ -import { nullable, primaryKey } from '@mswjs/data'; +import { Collection } from '@msw/data'; +import { z } from 'zod'; import { applyDefault } from '../utils/defaults.js'; +import { preCreateExtension } from '../utils/pre-create-extension.js'; import { dasherize } from '../utils/strings.js'; -export default { - id: primaryKey(String), +const schema = z.object({ + id: z.string(), - category: String, - slug: String, - description: String, - created_at: String, - crates_cnt: nullable(Number), + category: z.string(), + slug: z.string(), + description: z.string(), + created_at: z.string(), + crates_cnt: z.number().nullable(), +}); - preCreate(attrs, counter) { - applyDefault(attrs, 'category', () => `Category ${counter}`); - applyDefault(attrs, 'slug', () => dasherize(attrs.category)); - applyDefault(attrs, 'id', () => attrs.slug); - applyDefault(attrs, 'description', () => `This is the description for the category called "${attrs.category}"`); - applyDefault(attrs, 'created_at', () => '2010-06-16T21:30:45Z'); - applyDefault(attrs, 'crates_cnt', () => null); - }, -}; +function preCreate(attrs, counter) { + applyDefault(attrs, 'category', () => `Category ${counter}`); + applyDefault(attrs, 'slug', () => dasherize(attrs.category)); + applyDefault(attrs, 'id', () => attrs.slug); + applyDefault(attrs, 'description', () => `This is the description for the category called "${attrs.category}"`); + applyDefault(attrs, 'created_at', () => '2010-06-16T21:30:45Z'); + applyDefault(attrs, 'crates_cnt', () => null); +} + +const collection = new Collection({ + schema, + extensions: [preCreateExtension(preCreate)], +}); + +export default collection; diff --git a/packages/crates-io-msw/models/category.test.js b/packages/crates-io-msw/models/category.test.js index 92bb05d517b..65789a2c4dc 100644 --- a/packages/crates-io-msw/models/category.test.js +++ b/packages/crates-io-msw/models/category.test.js @@ -2,8 +2,8 @@ import { test } from 'vitest'; import { db } from '../index.js'; -test('default are applied', ({ expect }) => { - let category = db.category.create(); +test('default are applied', async ({ expect }) => { + let category = await db.category.create(); expect(category).toMatchInlineSnapshot(` { "category": "Category 1", @@ -12,14 +12,12 @@ test('default are applied', ({ expect }) => { "description": "This is the description for the category called "Category 1"", "id": "category-1", "slug": "category-1", - Symbol(type): "category", - Symbol(primaryKey): "id", } `); }); -test('name can be set', ({ expect }) => { - let category = db.category.create({ category: 'Network programming' }); +test('name can be set', async ({ expect }) => { + let category = await db.category.create({ category: 'Network programming' }); expect(category).toMatchInlineSnapshot(` { "category": "Network programming", @@ -28,8 +26,6 @@ test('name can be set', ({ expect }) => { "description": "This is the description for the category called "Network programming"", "id": "network-programming", "slug": "network-programming", - Symbol(type): "category", - Symbol(primaryKey): "id", } `); }); diff --git a/packages/crates-io-msw/models/crate-owner-invitation.js b/packages/crates-io-msw/models/crate-owner-invitation.js index d05ea3e2f9a..1cc0794397c 100644 --- a/packages/crates-io-msw/models/crate-owner-invitation.js +++ b/packages/crates-io-msw/models/crate-owner-invitation.js @@ -1,32 +1,41 @@ -import { oneOf, primaryKey } from '@mswjs/data'; +import { Collection } from '@msw/data'; +import { z } from 'zod'; import { applyDefault } from '../utils/defaults.js'; +import { preCreateExtension } from '../utils/pre-create-extension.js'; -export default { - id: primaryKey(Number), - - createdAt: String, - expiresAt: String, - token: String, - - crate: oneOf('crate'), - invitee: oneOf('user'), - inviter: oneOf('user'), - - preCreate(attrs, counter) { - applyDefault(attrs, 'id', () => counter); - applyDefault(attrs, 'createdAt', () => '2016-12-24T12:34:56Z'); - applyDefault(attrs, 'expiresAt', () => '2017-01-24T12:34:56Z'); - applyDefault(attrs, 'token', () => `secret-token-${attrs.id}`); - - if (!attrs.crate) { - throw new Error(`Missing \`crate\` relationship on \`crate-owner-invitation\``); - } - if (!attrs.invitee) { - throw new Error(`Missing \`invitee\` relationship on \`crate-owner-invitation\``); - } - if (!attrs.inviter) { - throw new Error(`Missing \`inviter\` relationship on \`crate-owner-invitation\``); - } - }, -}; +const schema = z.object({ + id: z.number(), + + createdAt: z.string(), + expiresAt: z.string(), + token: z.string(), + + crate: z.any(), + invitee: z.any(), + inviter: z.any(), +}); + +function preCreate(attrs, counter) { + applyDefault(attrs, 'id', () => counter); + applyDefault(attrs, 'createdAt', () => '2016-12-24T12:34:56Z'); + applyDefault(attrs, 'expiresAt', () => '2017-01-24T12:34:56Z'); + applyDefault(attrs, 'token', () => `secret-token-${attrs.id}`); + + if (!attrs.crate) { + throw new Error(`Missing \`crate\` relationship on \`crate-owner-invitation\``); + } + if (!attrs.invitee) { + throw new Error(`Missing \`invitee\` relationship on \`crate-owner-invitation\``); + } + if (!attrs.inviter) { + throw new Error(`Missing \`inviter\` relationship on \`crate-owner-invitation\``); + } +} + +const collection = new Collection({ + schema, + extensions: [preCreateExtension(preCreate)], +}); + +export default collection; diff --git a/packages/crates-io-msw/models/crate-owner-invitation.test.js b/packages/crates-io-msw/models/crate-owner-invitation.test.js index 527da2c9c24..c73cbca039b 100644 --- a/packages/crates-io-msw/models/crate-owner-invitation.test.js +++ b/packages/crates-io-msw/models/crate-owner-invitation.test.js @@ -2,35 +2,35 @@ import { test } from 'vitest'; import { db } from '../index.js'; -test('throws if `crate` is not set', ({ expect }) => { - let inviter = db.user.create(); - let invitee = db.user.create(); - expect(() => db.crateOwnerInvitation.create({ inviter, invitee })).toThrowErrorMatchingInlineSnapshot( +test('throws if `crate` is not set', async ({ expect }) => { + let inviter = await db.user.create(); + let invitee = await db.user.create(); + await expect(() => db.crateOwnerInvitation.create({ inviter, invitee })).rejects.toThrowErrorMatchingInlineSnapshot( `[Error: Missing \`crate\` relationship on \`crate-owner-invitation\`]`, ); }); -test('throws if `inviter` is not set', ({ expect }) => { - let crate = db.crate.create(); - let invitee = db.user.create(); - expect(() => db.crateOwnerInvitation.create({ crate, invitee })).toThrowErrorMatchingInlineSnapshot( +test('throws if `inviter` is not set', async ({ expect }) => { + let crate = await db.crate.create(); + let invitee = await db.user.create(); + await expect(() => db.crateOwnerInvitation.create({ crate, invitee })).rejects.toThrowErrorMatchingInlineSnapshot( `[Error: Missing \`inviter\` relationship on \`crate-owner-invitation\`]`, ); }); -test('throws if `invitee` is not set', ({ expect }) => { - let crate = db.crate.create(); - let inviter = db.user.create(); - expect(() => db.crateOwnerInvitation.create({ crate, inviter })).toThrowErrorMatchingInlineSnapshot( +test('throws if `invitee` is not set', async ({ expect }) => { + let crate = await db.crate.create(); + let inviter = await db.user.create(); + await expect(() => db.crateOwnerInvitation.create({ crate, inviter })).rejects.toThrowErrorMatchingInlineSnapshot( `[Error: Missing \`invitee\` relationship on \`crate-owner-invitation\`]`, ); }); -test('happy path', ({ expect }) => { - let crate = db.crate.create(); - let inviter = db.user.create(); - let invitee = db.user.create(); - let invite = db.crateOwnerInvitation.create({ crate, inviter, invitee }); +test('happy path', async ({ expect }) => { + let crate = await db.crate.create(); + let inviter = await db.user.create(); + let invitee = await db.user.create(); + let invite = await db.crateOwnerInvitation.create({ crate, inviter, invitee }); expect(invite).toMatchInlineSnapshot(` { "crate": { @@ -49,8 +49,6 @@ test('happy path', ({ expect }) => { "repository": null, "trustpubOnly": false, "updated_at": "2017-02-24T12:34:56Z", - Symbol(type): "crate", - Symbol(primaryKey): "id", }, "createdAt": "2016-12-24T12:34:56Z", "expiresAt": "2017-01-24T12:34:56Z", @@ -67,8 +65,6 @@ test('happy path', ({ expect }) => { "name": "User 2", "publishNotifications": true, "url": "https://github.com/user-2", - Symbol(type): "user", - Symbol(primaryKey): "id", }, "inviter": { "avatar": "https://avatars1.githubusercontent.com/u/14631425?v=4", @@ -82,12 +78,8 @@ test('happy path', ({ expect }) => { "name": "User 1", "publishNotifications": true, "url": "https://github.com/user-1", - Symbol(type): "user", - Symbol(primaryKey): "id", }, "token": "secret-token-1", - Symbol(type): "crateOwnerInvitation", - Symbol(primaryKey): "id", } `); }); diff --git a/packages/crates-io-msw/models/crate-ownership.js b/packages/crates-io-msw/models/crate-ownership.js index 47f22c7bdca..35e6189eafb 100644 --- a/packages/crates-io-msw/models/crate-ownership.js +++ b/packages/crates-io-msw/models/crate-ownership.js @@ -1,28 +1,39 @@ -import { nullable, oneOf, primaryKey } from '@mswjs/data'; +import { Collection } from '@msw/data'; +import { z } from 'zod'; import { applyDefault } from '../utils/defaults.js'; +import { preCreateExtension } from '../utils/pre-create-extension.js'; -export default { - id: primaryKey(Number), - - emailNotifications: Boolean, - - crate: oneOf('crate'), - team: nullable(oneOf('team')), - user: nullable(oneOf('user')), - - preCreate(attrs, counter) { - applyDefault(attrs, 'id', () => counter); - applyDefault(attrs, 'emailNotifications', () => true); - - if (!attrs.crate) { - throw new Error('Missing `crate` relationship on `crate-ownership`'); - } - if (!attrs.team && !attrs.user) { - throw new Error('Missing `team` or `user` relationship on `crate-ownership`'); - } - if (attrs.team && attrs.user) { - throw new Error('`team` and `user` on a `crate-ownership` are mutually exclusive'); - } - }, -}; +const schema = z.object({ + id: z.number(), + + emailNotifications: z.boolean(), + + crate: z.any(), + team: z.any().nullable(), + user: z.any().nullable(), +}); + +function preCreate(attrs, counter) { + applyDefault(attrs, 'id', () => counter); + applyDefault(attrs, 'emailNotifications', () => true); + applyDefault(attrs, 'team', () => null); + applyDefault(attrs, 'user', () => null); + + if (!attrs.crate) { + throw new Error('Missing `crate` relationship on `crate-ownership`'); + } + if (!attrs.team && !attrs.user) { + throw new Error('Missing `team` or `user` relationship on `crate-ownership`'); + } + if (attrs.team && attrs.user) { + throw new Error('`team` and `user` on a `crate-ownership` are mutually exclusive'); + } +} + +const collection = new Collection({ + schema, + extensions: [preCreateExtension(preCreate)], +}); + +export default collection; diff --git a/packages/crates-io-msw/models/crate-ownership.test.js b/packages/crates-io-msw/models/crate-ownership.test.js index 765b44f771a..f75ef875352 100644 --- a/packages/crates-io-msw/models/crate-ownership.test.js +++ b/packages/crates-io-msw/models/crate-ownership.test.js @@ -2,33 +2,27 @@ import { test } from 'vitest'; import { db } from '../index.js'; -test('throws if `crate` is not set', ({ expect }) => { - let user = db.user.create(); - expect(() => db.crateOwnership.create({ user })).toThrowErrorMatchingInlineSnapshot( - `[Error: Missing \`crate\` relationship on \`crate-ownership\`]`, - ); +test('throws if `crate` is not set', async ({ expect }) => { + let user = await db.user.create(); + await expect(() => db.crateOwnership.create({ user })).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Missing \`crate\` relationship on \`crate-ownership\`]`); }); -test('throws if `team` and `user` are not set', ({ expect }) => { - let crate = db.crate.create(); - expect(() => db.crateOwnership.create({ crate })).toThrowErrorMatchingInlineSnapshot( - `[Error: Missing \`team\` or \`user\` relationship on \`crate-ownership\`]`, - ); +test('throws if `team` and `user` are not set', async ({ expect }) => { + let crate = await db.crate.create(); + await expect(() => db.crateOwnership.create({ crate })).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Missing \`team\` or \`user\` relationship on \`crate-ownership\`]`); }); -test('throws if `team` and `user` are both set', ({ expect }) => { - let crate = db.crate.create(); - let team = db.team.create(); - let user = db.user.create(); - expect(() => db.crateOwnership.create({ crate, team, user })).toThrowErrorMatchingInlineSnapshot( - `[Error: \`team\` and \`user\` on a \`crate-ownership\` are mutually exclusive]`, - ); +test('throws if `team` and `user` are both set', async ({ expect }) => { + let crate = await db.crate.create(); + let team = await db.team.create(); + let user = await db.user.create(); + await expect(() => db.crateOwnership.create({ crate, team, user })).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: \`team\` and \`user\` on a \`crate-ownership\` are mutually exclusive]`); }); -test('can set `team`', ({ expect }) => { - let crate = db.crate.create(); - let team = db.team.create(); - let ownership = db.crateOwnership.create({ crate, team }); +test('can set `team`', async ({ expect }) => { + let crate = await db.crate.create(); + let team = await db.team.create(); + let ownership = await db.crateOwnership.create({ crate, team }); expect(ownership).toMatchInlineSnapshot(` { "crate": { @@ -47,8 +41,6 @@ test('can set `team`', ({ expect }) => { "repository": null, "trustpubOnly": false, "updated_at": "2017-02-24T12:34:56Z", - Symbol(type): "crate", - Symbol(primaryKey): "id", }, "emailNotifications": true, "id": 1, @@ -59,20 +51,16 @@ test('can set `team`', ({ expect }) => { "name": "team-1", "org": "rust-lang", "url": "https://github.com/rust-lang", - Symbol(type): "team", - Symbol(primaryKey): "id", }, "user": null, - Symbol(type): "crateOwnership", - Symbol(primaryKey): "id", } `); }); -test('can set `user`', ({ expect }) => { - let crate = db.crate.create(); - let user = db.user.create(); - let ownership = db.crateOwnership.create({ crate, user }); +test('can set `user`', async ({ expect }) => { + let crate = await db.crate.create(); + let user = await db.user.create(); + let ownership = await db.crateOwnership.create({ crate, user }); expect(ownership).toMatchInlineSnapshot(` { "crate": { @@ -91,8 +79,6 @@ test('can set `user`', ({ expect }) => { "repository": null, "trustpubOnly": false, "updated_at": "2017-02-24T12:34:56Z", - Symbol(type): "crate", - Symbol(primaryKey): "id", }, "emailNotifications": true, "id": 1, @@ -109,11 +95,7 @@ test('can set `user`', ({ expect }) => { "name": "User 1", "publishNotifications": true, "url": "https://github.com/user-1", - Symbol(type): "user", - Symbol(primaryKey): "id", }, - Symbol(type): "crateOwnership", - Symbol(primaryKey): "id", } `); }); diff --git a/packages/crates-io-msw/models/crate.js b/packages/crates-io-msw/models/crate.js index a9ba4ed1c6f..c71362917c0 100644 --- a/packages/crates-io-msw/models/crate.js +++ b/packages/crates-io-msw/models/crate.js @@ -1,37 +1,48 @@ -import { manyOf, nullable, primaryKey } from '@mswjs/data'; +import { Collection } from '@msw/data'; +import { z } from 'zod'; import { applyDefault } from '../utils/defaults.js'; +import { preCreateExtension } from '../utils/pre-create-extension.js'; -export default { - id: primaryKey(Number), +const schema = z.object({ + id: z.number(), - name: String, - description: String, - downloads: Number, - recent_downloads: Number, - documentation: nullable(String), - homepage: nullable(String), - repository: nullable(String), - created_at: String, - updated_at: String, - badges: Array, - _extra_downloads: Array, - trustpubOnly: Boolean, + name: z.string(), + description: z.string(), + downloads: z.number(), + recent_downloads: z.number(), + documentation: z.string().nullable(), + homepage: z.string().nullable(), + repository: z.string().nullable(), + created_at: z.string(), + updated_at: z.string(), + badges: z.array(z.any()), + _extra_downloads: z.array(z.any()), + trustpubOnly: z.boolean(), - categories: manyOf('category'), - keywords: manyOf('keyword'), + categories: z.array(z.any()).default(() => []), + keywords: z.array(z.any()).default(() => []), +}); - preCreate(attrs, counter) { - applyDefault(attrs, 'id', () => counter); - applyDefault(attrs, 'name', () => `crate-${attrs.id}`); - applyDefault(attrs, 'description', () => `This is the description for the crate called "${attrs.name}"`); - applyDefault(attrs, 'downloads', () => (((attrs.id + 13) * 42) % 13) * 12_345); - applyDefault(attrs, 'recent_downloads', () => (((attrs.id + 7) * 31) % 13) * 321); - applyDefault(attrs, 'documentation', () => null); - applyDefault(attrs, 'homepage', () => null); - applyDefault(attrs, 'repository', () => null); - applyDefault(attrs, 'created_at', () => '2010-06-16T21:30:45Z'); - applyDefault(attrs, 'updated_at', () => '2017-02-24T12:34:56Z'); - applyDefault(attrs, 'trustpubOnly', () => false); - }, -}; +function preCreate(attrs, counter) { + applyDefault(attrs, 'id', () => counter); + applyDefault(attrs, 'name', () => `crate-${attrs.id}`); + applyDefault(attrs, 'description', () => `This is the description for the crate called "${attrs.name}"`); + applyDefault(attrs, 'downloads', () => (((attrs.id + 13) * 42) % 13) * 12_345); + applyDefault(attrs, 'recent_downloads', () => (((attrs.id + 7) * 31) % 13) * 321); + applyDefault(attrs, 'documentation', () => null); + applyDefault(attrs, 'homepage', () => null); + applyDefault(attrs, 'repository', () => null); + applyDefault(attrs, 'created_at', () => '2010-06-16T21:30:45Z'); + applyDefault(attrs, 'updated_at', () => '2017-02-24T12:34:56Z'); + applyDefault(attrs, 'badges', () => []); + applyDefault(attrs, '_extra_downloads', () => []); + applyDefault(attrs, 'trustpubOnly', () => false); +} + +const collection = new Collection({ + schema, + extensions: [preCreateExtension(preCreate)], +}); + +export default collection; diff --git a/packages/crates-io-msw/models/crate.test.js b/packages/crates-io-msw/models/crate.test.js index 5c4a6b5ae0c..3e70ea70ed5 100644 --- a/packages/crates-io-msw/models/crate.test.js +++ b/packages/crates-io-msw/models/crate.test.js @@ -2,8 +2,8 @@ import { test } from 'vitest'; import { db } from '../index.js'; -test('default are applied', ({ expect }) => { - let crate = db.crate.create(); +test('default are applied', async ({ expect }) => { + let crate = await db.crate.create(); expect(crate).toMatchInlineSnapshot(` { "_extra_downloads": [], @@ -21,18 +21,16 @@ test('default are applied', ({ expect }) => { "repository": null, "trustpubOnly": false, "updated_at": "2017-02-24T12:34:56Z", - Symbol(type): "crate", - Symbol(primaryKey): "id", } `); }); -test('attributes can be set', ({ expect }) => { - let category = db.category.create(); - let keyword1 = db.keyword.create(); - let keyword2 = db.keyword.create(); +test('attributes can be set', async ({ expect }) => { + let category = await db.category.create(); + let keyword1 = await db.keyword.create(); + let keyword2 = await db.keyword.create(); - let crate = db.crate.create({ + let crate = await db.crate.create({ name: 'crates-io', categories: [category], keywords: [keyword1, keyword2], @@ -50,8 +48,6 @@ test('attributes can be set', ({ expect }) => { "description": "This is the description for the category called "Category 1"", "id": "category-1", "slug": "category-1", - Symbol(type): "category", - Symbol(primaryKey): "id", }, ], "created_at": "2010-06-16T21:30:45Z", @@ -64,14 +60,10 @@ test('attributes can be set', ({ expect }) => { { "id": "keyword-1", "keyword": "keyword-1", - Symbol(type): "keyword", - Symbol(primaryKey): "id", }, { "id": "keyword-2", "keyword": "keyword-2", - Symbol(type): "keyword", - Symbol(primaryKey): "id", }, ], "name": "crates-io", @@ -79,8 +71,6 @@ test('attributes can be set', ({ expect }) => { "repository": null, "trustpubOnly": false, "updated_at": "2017-02-24T12:34:56Z", - Symbol(type): "crate", - Symbol(primaryKey): "id", } `); }); diff --git a/packages/crates-io-msw/models/dependency.js b/packages/crates-io-msw/models/dependency.js index ad8da357a9b..55e7a52f851 100644 --- a/packages/crates-io-msw/models/dependency.js +++ b/packages/crates-io-msw/models/dependency.js @@ -1,35 +1,45 @@ -import { nullable, oneOf, primaryKey } from '@mswjs/data'; +import { Collection } from '@msw/data'; +import { z } from 'zod'; import { applyDefault } from '../utils/defaults.js'; +import { preCreateExtension } from '../utils/pre-create-extension.js'; const REQS = ['^0.1.0', '^2.1.3', '0.3.7', '~5.2.12']; -export default { - id: primaryKey(Number), - - default_features: Boolean, - features: Array, - kind: String, - optional: Boolean, - req: String, - target: nullable(String), - - crate: oneOf('crate'), - version: oneOf('version'), - - preCreate(attrs, counter) { - applyDefault(attrs, 'id', () => counter); - applyDefault(attrs, 'default_features', () => counter % 4 === 3); - applyDefault(attrs, 'kind', () => (counter % 3 === 0 ? 'dev' : 'normal')); - applyDefault(attrs, 'optional', () => counter % 4 !== 3); - applyDefault(attrs, 'req', () => REQS[counter % REQS.length]); - applyDefault(attrs, 'target', () => null); - - if (!attrs.crate) { - throw new Error(`Missing \`crate\` relationship on \`dependency:${attrs.id}\``); - } - if (!attrs.version) { - throw new Error(`Missing \`version\` relationship on \`dependency:${attrs.id}\``); - } - }, -}; +const schema = z.object({ + id: z.number(), + + default_features: z.boolean(), + features: z.array(z.any()), + kind: z.string(), + optional: z.boolean(), + req: z.string(), + target: z.string().nullable(), + + crate: z.any(), + version: z.any(), +}); + +function preCreate(attrs, counter) { + applyDefault(attrs, 'id', () => counter); + applyDefault(attrs, 'default_features', () => counter % 4 === 3); + applyDefault(attrs, 'features', () => []); + applyDefault(attrs, 'kind', () => (counter % 3 === 0 ? 'dev' : 'normal')); + applyDefault(attrs, 'optional', () => counter % 4 !== 3); + applyDefault(attrs, 'req', () => REQS[counter % REQS.length]); + applyDefault(attrs, 'target', () => null); + + if (!attrs.crate) { + throw new Error(`Missing \`crate\` relationship on \`dependency:${attrs.id}\``); + } + if (!attrs.version) { + throw new Error(`Missing \`version\` relationship on \`dependency:${attrs.id}\``); + } +} + +const collection = new Collection({ + schema, + extensions: [preCreateExtension(preCreate)], +}); + +export default collection; diff --git a/packages/crates-io-msw/models/dependency.test.js b/packages/crates-io-msw/models/dependency.test.js index 17618c187f3..816bcdd2eec 100644 --- a/packages/crates-io-msw/models/dependency.test.js +++ b/packages/crates-io-msw/models/dependency.test.js @@ -2,24 +2,20 @@ import { test } from 'vitest'; import { db } from '../index.js'; -test('throws if `crate` is not set', ({ expect }) => { - let version = db.version.create({ crate: db.crate.create() }); - expect(() => db.dependency.create({ version })).toThrowErrorMatchingInlineSnapshot( - `[Error: Missing \`crate\` relationship on \`dependency:1\`]`, - ); +test('throws if `crate` is not set', async ({ expect }) => { + let version = await db.version.create({ crate: await db.crate.create() }); + await expect(() => db.dependency.create({ version })).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Missing \`crate\` relationship on \`dependency:1\`]`); }); -test('throws if `version` is not set', ({ expect }) => { - let crate = db.crate.create(); - expect(() => db.dependency.create({ crate })).toThrowErrorMatchingInlineSnapshot( - `[Error: Missing \`version\` relationship on \`dependency:1\`]`, - ); +test('throws if `version` is not set', async ({ expect }) => { + let crate = await db.crate.create(); + await expect(() => db.dependency.create({ crate })).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Missing \`version\` relationship on \`dependency:1\`]`); }); -test('happy path', ({ expect }) => { - let crate = db.crate.create(); - let version = db.version.create({ crate: db.crate.create() }); - let dependency = db.dependency.create({ crate, version }); +test('happy path', async ({ expect }) => { + let crate = await db.crate.create(); + let version = await db.version.create({ crate: await db.crate.create() }); + let dependency = await db.dependency.create({ crate, version }); expect(dependency).toMatchInlineSnapshot(` { "crate": { @@ -38,8 +34,6 @@ test('happy path', ({ expect }) => { "repository": null, "trustpubOnly": false, "updated_at": "2017-02-24T12:34:56Z", - Symbol(type): "crate", - Symbol(primaryKey): "id", }, "default_features": false, "features": [], @@ -65,8 +59,6 @@ test('happy path', ({ expect }) => { "repository": null, "trustpubOnly": false, "updated_at": "2017-02-24T12:34:56Z", - Symbol(type): "crate", - Symbol(primaryKey): "id", }, "crate_size": 162963, "created_at": "2010-06-16T21:30:45Z", @@ -98,11 +90,7 @@ test('happy path', ({ expect }) => { "updated_at": "2017-02-24T12:34:56Z", "yank_message": null, "yanked": false, - Symbol(type): "version", - Symbol(primaryKey): "id", }, - Symbol(type): "dependency", - Symbol(primaryKey): "id", } `); }); diff --git a/packages/crates-io-msw/models/index.js b/packages/crates-io-msw/models/index.js new file mode 100644 index 00000000000..10dd76184a0 --- /dev/null +++ b/packages/crates-io-msw/models/index.js @@ -0,0 +1,95 @@ +import apiTokens from './api-token.js'; +import categories from './category.js'; +import crateOwnerInvitations from './crate-owner-invitation.js'; +import crateOwnerships from './crate-ownership.js'; +import crates from './crate.js'; +import dependencies from './dependency.js'; +import keywords from './keyword.js'; +import mswSessions from './msw-session.js'; +import teams from './team.js'; +import trustpubGithubConfigs from './trustpub/github-config.js'; +import trustpubGitlabConfigs from './trustpub/gitlab-config.js'; +import users from './user.js'; +import versionDownloads from './version-download.js'; +import versions from './version.js'; + +// Define relations +users.defineRelations(({ many }) => ({ + followedCrates: many(crates), +})); + +crates.defineRelations(({ many }) => ({ + categories: many(categories), + keywords: many(keywords), +})); + +versions.defineRelations(({ one }) => ({ + crate: one(crates), + publishedBy: one(users), +})); + +dependencies.defineRelations(({ one }) => ({ + crate: one(crates), + version: one(versions), +})); + +versionDownloads.defineRelations(({ one }) => ({ + version: one(versions), +})); + +crateOwnerships.defineRelations(({ one }) => ({ + crate: one(crates), + team: one(teams), + user: one(users), +})); + +apiTokens.defineRelations(({ one }) => ({ + user: one(users), +})); + +crateOwnerInvitations.defineRelations(({ one }) => ({ + crate: one(crates), + invitee: one(users), + inviter: one(users), +})); + +mswSessions.defineRelations(({ one }) => ({ + user: one(users), +})); + +trustpubGithubConfigs.defineRelations(({ one }) => ({ + crate: one(crates), +})); + +trustpubGitlabConfigs.defineRelations(({ one }) => ({ + crate: one(crates), +})); + +export const db = { + apiToken: apiTokens, + category: categories, + crateOwnerInvitation: crateOwnerInvitations, + crateOwnership: crateOwnerships, + crate: crates, + dependency: dependencies, + keyword: keywords, + mswSession: mswSessions, + team: teams, + trustpubGithubConfig: trustpubGithubConfigs, + trustpubGitlabConfig: trustpubGitlabConfigs, + user: users, + versionDownload: versionDownloads, + version: versions, + + reset() { + for (let collection of Object.values(this)) { + if (collection?.deleteMany) { + collection.deleteMany(q => q.where(() => true)); + } + + if (collection?.__counter) { + collection.__counter = 0; + } + } + }, +}; diff --git a/packages/crates-io-msw/models/keyword.js b/packages/crates-io-msw/models/keyword.js index d6e914823a0..e8069aa3fc0 100644 --- a/packages/crates-io-msw/models/keyword.js +++ b/packages/crates-io-msw/models/keyword.js @@ -1,14 +1,22 @@ -import { primaryKey } from '@mswjs/data'; +import { Collection } from '@msw/data'; +import { z } from 'zod'; import { applyDefault } from '../utils/defaults.js'; +import { preCreateExtension } from '../utils/pre-create-extension.js'; -export default { - id: primaryKey(String), +const schema = z.object({ + id: z.string(), + keyword: z.string(), +}); - keyword: String, +function preCreate(attrs, counter) { + applyDefault(attrs, 'keyword', () => `keyword-${counter}`); + applyDefault(attrs, 'id', () => attrs.keyword); +} - preCreate(attrs, counter) { - applyDefault(attrs, 'keyword', () => `keyword-${counter}`); - applyDefault(attrs, 'id', () => attrs.keyword); - }, -}; +const collection = new Collection({ + schema, + extensions: [preCreateExtension(preCreate)], +}); + +export default collection; diff --git a/packages/crates-io-msw/models/keyword.test.js b/packages/crates-io-msw/models/keyword.test.js index 59e32a48b8e..639d2195825 100644 --- a/packages/crates-io-msw/models/keyword.test.js +++ b/packages/crates-io-msw/models/keyword.test.js @@ -2,26 +2,22 @@ import { test } from 'vitest'; import { db } from '../index.js'; -test('default are applied', ({ expect }) => { - let keyword = db.keyword.create(); +test('default are applied', async ({ expect }) => { + let keyword = await db.keyword.create(); expect(keyword).toMatchInlineSnapshot(` { "id": "keyword-1", "keyword": "keyword-1", - Symbol(type): "keyword", - Symbol(primaryKey): "id", } `); }); -test('name can be set', ({ expect }) => { - let keyword = db.keyword.create({ keyword: 'gamedev' }); +test('name can be set', async ({ expect }) => { + let keyword = await db.keyword.create({ keyword: 'gamedev' }); expect(keyword).toMatchInlineSnapshot(` { "id": "gamedev", "keyword": "gamedev", - Symbol(type): "keyword", - Symbol(primaryKey): "id", } `); }); diff --git a/packages/crates-io-msw/models/msw-session.js b/packages/crates-io-msw/models/msw-session.js index f66f614b9d5..a496684c293 100644 --- a/packages/crates-io-msw/models/msw-session.js +++ b/packages/crates-io-msw/models/msw-session.js @@ -1,6 +1,8 @@ -import { oneOf, primaryKey } from '@mswjs/data'; +import { Collection } from '@msw/data'; +import { z } from 'zod'; import { applyDefault } from '../utils/defaults.js'; +import { preCreateExtension } from '../utils/pre-create-extension.js'; /** * This is a MSW-only model, that is used to keep track of the current @@ -10,16 +12,23 @@ import { applyDefault } from '../utils/defaults.js'; * This mock implementation means that there can only ever exist one * session at a time. */ -export default { - id: primaryKey(Number), +const schema = z.object({ + id: z.number(), - user: oneOf('user'), + user: z.any(), +}); - preCreate(attrs, counter) { - applyDefault(attrs, 'id', () => counter); +function preCreate(attrs, counter) { + applyDefault(attrs, 'id', () => counter); - if (!attrs.user) { - throw new Error('Missing `user` relationship'); - } - }, -}; + if (!attrs.user) { + throw new Error('Missing `user` relationship'); + } +} + +const collection = new Collection({ + schema, + extensions: [preCreateExtension(preCreate)], +}); + +export default collection; diff --git a/packages/crates-io-msw/models/msw-session.test.js b/packages/crates-io-msw/models/msw-session.test.js index 5a6874566c9..fd480ece1da 100644 --- a/packages/crates-io-msw/models/msw-session.test.js +++ b/packages/crates-io-msw/models/msw-session.test.js @@ -2,13 +2,13 @@ import { test } from 'vitest'; import { db } from '../index.js'; -test('throws if `user` is not set', ({ expect }) => { - expect(() => db.mswSession.create()).toThrowErrorMatchingInlineSnapshot(`[Error: Missing \`user\` relationship]`); +test('throws if `user` is not set', async ({ expect }) => { + await expect(() => db.mswSession.create()).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Missing \`user\` relationship]`); }); -test('happy path', ({ expect }) => { - let user = db.user.create(); - let session = db.mswSession.create({ user }); +test('happy path', async ({ expect }) => { + let user = await db.user.create(); + let session = await db.mswSession.create({ user }); expect(session).toMatchInlineSnapshot(` { "id": 1, @@ -24,11 +24,7 @@ test('happy path', ({ expect }) => { "name": "User 1", "publishNotifications": true, "url": "https://github.com/user-1", - Symbol(type): "user", - Symbol(primaryKey): "id", }, - Symbol(type): "mswSession", - Symbol(primaryKey): "id", } `); }); diff --git a/packages/crates-io-msw/models/team.js b/packages/crates-io-msw/models/team.js index 87df22a6f80..1a4300bd387 100644 --- a/packages/crates-io-msw/models/team.js +++ b/packages/crates-io-msw/models/team.js @@ -1,24 +1,33 @@ -import { primaryKey } from '@mswjs/data'; +import { Collection } from '@msw/data'; +import { z } from 'zod'; import { applyDefault } from '../utils/defaults.js'; +import { preCreateExtension } from '../utils/pre-create-extension.js'; const ORGS = ['rust-lang', 'emberjs', 'rust-random', 'georust', 'actix']; -export default { - id: primaryKey(Number), +const schema = z.object({ + id: z.number(), - name: String, - org: String, - login: String, - url: String, - avatar: String, + name: z.string(), + org: z.string(), + login: z.string(), + url: z.string(), + avatar: z.string(), +}); - preCreate(attrs, counter) { - applyDefault(attrs, 'id', () => counter); - applyDefault(attrs, 'name', () => `team-${attrs.id}`); - applyDefault(attrs, 'org', () => ORGS[(attrs.id - 1) % ORGS.length]); - applyDefault(attrs, 'login', () => `github:${attrs.org}:${attrs.name}`); - applyDefault(attrs, 'url', () => `https://github.com/${attrs.org}`); - applyDefault(attrs, 'avatar', () => 'https://avatars1.githubusercontent.com/u/14631425?v=4'); - }, -}; +function preCreate(attrs, counter) { + applyDefault(attrs, 'id', () => counter); + applyDefault(attrs, 'name', () => `team-${attrs.id}`); + applyDefault(attrs, 'org', () => ORGS[(attrs.id - 1) % ORGS.length]); + applyDefault(attrs, 'login', () => `github:${attrs.org}:${attrs.name}`); + applyDefault(attrs, 'url', () => `https://github.com/${attrs.org}`); + applyDefault(attrs, 'avatar', () => 'https://avatars1.githubusercontent.com/u/14631425?v=4'); +} + +const collection = new Collection({ + schema, + extensions: [preCreateExtension(preCreate)], +}); + +export default collection; diff --git a/packages/crates-io-msw/models/team.test.js b/packages/crates-io-msw/models/team.test.js index c3aecafd0f1..f1ef0b32697 100644 --- a/packages/crates-io-msw/models/team.test.js +++ b/packages/crates-io-msw/models/team.test.js @@ -2,8 +2,8 @@ import { test } from 'vitest'; import { db } from '../index.js'; -test('default are applied', ({ expect }) => { - let team = db.team.create(); +test('default are applied', async ({ expect }) => { + let team = await db.team.create(); expect(team).toMatchInlineSnapshot(` { "avatar": "https://avatars1.githubusercontent.com/u/14631425?v=4", @@ -12,14 +12,12 @@ test('default are applied', ({ expect }) => { "name": "team-1", "org": "rust-lang", "url": "https://github.com/rust-lang", - Symbol(type): "team", - Symbol(primaryKey): "id", } `); }); -test('attributes can be set', ({ expect }) => { - let team = db.team.create({ name: 'axum', org: 'tokio-rs' }); +test('attributes can be set', async ({ expect }) => { + let team = await db.team.create({ name: 'axum', org: 'tokio-rs' }); expect(team).toMatchInlineSnapshot(` { "avatar": "https://avatars1.githubusercontent.com/u/14631425?v=4", @@ -28,8 +26,6 @@ test('attributes can be set', ({ expect }) => { "name": "axum", "org": "tokio-rs", "url": "https://github.com/tokio-rs", - Symbol(type): "team", - Symbol(primaryKey): "id", } `); }); diff --git a/packages/crates-io-msw/models/trustpub/github-config.js b/packages/crates-io-msw/models/trustpub/github-config.js index cc36bac2c03..3ca6fdce73f 100644 --- a/packages/crates-io-msw/models/trustpub/github-config.js +++ b/packages/crates-io-msw/models/trustpub/github-config.js @@ -1,25 +1,35 @@ -import { nullable, oneOf, primaryKey } from '@mswjs/data'; +import { Collection } from '@msw/data'; +import { z } from 'zod'; import { applyDefault } from '../../utils/defaults.js'; +import { preCreateExtension } from '../../utils/pre-create-extension.js'; -export default { - id: primaryKey(Number), +const schema = z.object({ + id: z.number(), - crate: oneOf('crate'), - repository_owner: String, - repository_owner_id: Number, - repository_name: String, - workflow_filename: String, - environment: nullable(String), - created_at: String, + crate: z.any().nullable(), + repository_owner: z.string(), + repository_owner_id: z.number(), + repository_name: z.string(), + workflow_filename: z.string(), + environment: z.string().nullable(), + created_at: z.string(), +}); - preCreate(attrs, counter) { - applyDefault(attrs, 'id', () => counter); - applyDefault(attrs, 'repository_owner', () => 'rust-lang'); - applyDefault(attrs, 'repository_owner_id', () => 5_430_905); - applyDefault(attrs, 'repository_name', () => `repo-${attrs.id}`); - applyDefault(attrs, 'workflow_filename', () => 'ci.yml'); - applyDefault(attrs, 'environment', () => null); - applyDefault(attrs, 'created_at', () => '2023-01-01T00:00:00Z'); - }, -}; +function preCreate(attrs, counter) { + applyDefault(attrs, 'id', () => counter); + applyDefault(attrs, 'repository_owner', () => 'rust-lang'); + applyDefault(attrs, 'repository_owner_id', () => 5_430_905); + applyDefault(attrs, 'repository_name', () => `repo-${attrs.id}`); + applyDefault(attrs, 'workflow_filename', () => 'ci.yml'); + applyDefault(attrs, 'environment', () => null); + applyDefault(attrs, 'created_at', () => '2023-01-01T00:00:00Z'); + applyDefault(attrs, 'crate', () => null); +} + +const collection = new Collection({ + schema, + extensions: [preCreateExtension(preCreate)], +}); + +export default collection; diff --git a/packages/crates-io-msw/models/trustpub/gitlab-config.js b/packages/crates-io-msw/models/trustpub/gitlab-config.js index dd1bee12c14..5141f7ab91b 100644 --- a/packages/crates-io-msw/models/trustpub/gitlab-config.js +++ b/packages/crates-io-msw/models/trustpub/gitlab-config.js @@ -1,25 +1,35 @@ -import { nullable, oneOf, primaryKey } from '@mswjs/data'; +import { Collection } from '@msw/data'; +import { z } from 'zod'; import { applyDefault } from '../../utils/defaults.js'; +import { preCreateExtension } from '../../utils/pre-create-extension.js'; -export default { - id: primaryKey(Number), +const schema = z.object({ + id: z.number(), - crate: oneOf('crate'), - namespace: String, - namespace_id: nullable(String), - project: String, - workflow_filepath: String, - environment: nullable(String), - created_at: String, + crate: z.any().nullable(), + namespace: z.string(), + namespace_id: z.string().nullable(), + project: z.string(), + workflow_filepath: z.string(), + environment: z.string().nullable(), + created_at: z.string(), +}); - preCreate(attrs, counter) { - applyDefault(attrs, 'id', () => counter); - applyDefault(attrs, 'namespace', () => 'rust-lang'); - applyDefault(attrs, 'namespace_id', () => null); - applyDefault(attrs, 'project', () => `repo-${attrs.id}`); - applyDefault(attrs, 'workflow_filepath', () => '.gitlab-ci.yml'); - applyDefault(attrs, 'environment', () => null); - applyDefault(attrs, 'created_at', () => '2023-01-01T00:00:00Z'); - }, -}; +function preCreate(attrs, counter) { + applyDefault(attrs, 'id', () => counter); + applyDefault(attrs, 'namespace', () => 'rust-lang'); + applyDefault(attrs, 'namespace_id', () => null); + applyDefault(attrs, 'project', () => `repo-${attrs.id}`); + applyDefault(attrs, 'workflow_filepath', () => '.gitlab-ci.yml'); + applyDefault(attrs, 'environment', () => null); + applyDefault(attrs, 'created_at', () => '2023-01-01T00:00:00Z'); + applyDefault(attrs, 'crate', () => null); +} + +const collection = new Collection({ + schema, + extensions: [preCreateExtension(preCreate)], +}); + +export default collection; diff --git a/packages/crates-io-msw/models/trustpub/gitlab-config.test.js b/packages/crates-io-msw/models/trustpub/gitlab-config.test.js index 4517d3aae41..686bde83523 100644 --- a/packages/crates-io-msw/models/trustpub/gitlab-config.test.js +++ b/packages/crates-io-msw/models/trustpub/gitlab-config.test.js @@ -2,9 +2,9 @@ import { test } from 'vitest'; import { db } from '../../index.js'; -test('defaults are applied', ({ expect }) => { - let crate = db.crate.create(); - let config = db.trustpubGitlabConfig.create({ crate }); +test('defaults are applied', async ({ expect }) => { + let crate = await db.crate.create(); + let config = await db.trustpubGitlabConfig.create({ crate }); expect(config).toMatchInlineSnapshot(` { "crate": { @@ -23,8 +23,6 @@ test('defaults are applied', ({ expect }) => { "repository": null, "trustpubOnly": false, "updated_at": "2017-02-24T12:34:56Z", - Symbol(type): "crate", - Symbol(primaryKey): "id", }, "created_at": "2023-01-01T00:00:00Z", "environment": null, @@ -33,15 +31,13 @@ test('defaults are applied', ({ expect }) => { "namespace_id": null, "project": "repo-1", "workflow_filepath": ".gitlab-ci.yml", - Symbol(type): "trustpubGitlabConfig", - Symbol(primaryKey): "id", } `); }); -test('fields can be set', ({ expect }) => { - let crate = db.crate.create({ name: 'serde' }); - let config = db.trustpubGitlabConfig.create({ +test('fields can be set', async ({ expect }) => { + let crate = await db.crate.create({ name: 'serde' }); + let config = await db.trustpubGitlabConfig.create({ crate, namespace: 'serde-rs', namespace_id: '12345', @@ -67,8 +63,6 @@ test('fields can be set', ({ expect }) => { "repository": null, "trustpubOnly": false, "updated_at": "2017-02-24T12:34:56Z", - Symbol(type): "crate", - Symbol(primaryKey): "id", }, "created_at": "2023-01-01T00:00:00Z", "environment": "production", @@ -77,8 +71,6 @@ test('fields can be set', ({ expect }) => { "namespace_id": "12345", "project": "serde", "workflow_filepath": ".gitlab/ci.yml", - Symbol(type): "trustpubGitlabConfig", - Symbol(primaryKey): "id", } `); }); diff --git a/packages/crates-io-msw/models/user.js b/packages/crates-io-msw/models/user.js index 2d3ce6f22f4..9b3282132b1 100644 --- a/packages/crates-io-msw/models/user.js +++ b/packages/crates-io-msw/models/user.js @@ -1,33 +1,42 @@ -import { manyOf, nullable, primaryKey } from '@mswjs/data'; +import { Collection } from '@msw/data'; +import { z } from 'zod'; import { applyDefault } from '../utils/defaults.js'; +import { preCreateExtension } from '../utils/pre-create-extension.js'; import { dasherize } from '../utils/strings.js'; -export default { - id: primaryKey(Number), +const schema = z.object({ + id: z.number(), - name: nullable(String), - login: String, - url: String, - avatar: String, - email: nullable(String), - emailVerificationToken: nullable(String), - emailVerified: Boolean, - isAdmin: Boolean, - publishNotifications: Boolean, + name: z.string().nullable(), + login: z.string(), + url: z.string(), + avatar: z.string(), + email: z.string().nullable(), + emailVerificationToken: z.string().nullable(), + emailVerified: z.boolean(), + isAdmin: z.boolean(), + publishNotifications: z.boolean(), - followedCrates: manyOf('crate'), + followedCrates: z.array(z.any()).default(() => []), +}); - preCreate(attrs, counter) { - applyDefault(attrs, 'id', () => counter); - applyDefault(attrs, 'name', () => `User ${attrs.id}`); - applyDefault(attrs, 'login', () => (attrs.name ? dasherize(attrs.name) : `user-${attrs.id}`)); - applyDefault(attrs, 'email', () => `${attrs.login}@crates.io`); - applyDefault(attrs, 'url', () => `https://github.com/${attrs.login}`); - applyDefault(attrs, 'avatar', () => 'https://avatars1.githubusercontent.com/u/14631425?v=4'); - applyDefault(attrs, 'emailVerificationToken', () => null); - applyDefault(attrs, 'emailVerified', () => Boolean(attrs.email && !attrs.emailVerificationToken)); - applyDefault(attrs, 'isAdmin', () => false); - applyDefault(attrs, 'publishNotifications', () => true); - }, -}; +function preCreate(attrs, counter) { + applyDefault(attrs, 'id', () => counter); + applyDefault(attrs, 'name', () => `User ${attrs.id}`); + applyDefault(attrs, 'login', () => (attrs.name ? dasherize(attrs.name) : `user-${attrs.id}`)); + applyDefault(attrs, 'email', () => `${attrs.login}@crates.io`); + applyDefault(attrs, 'url', () => `https://github.com/${attrs.login}`); + applyDefault(attrs, 'avatar', () => 'https://avatars1.githubusercontent.com/u/14631425?v=4'); + applyDefault(attrs, 'emailVerificationToken', () => null); + applyDefault(attrs, 'emailVerified', () => Boolean(attrs.email && !attrs.emailVerificationToken)); + applyDefault(attrs, 'isAdmin', () => false); + applyDefault(attrs, 'publishNotifications', () => true); +} + +const collection = new Collection({ + schema, + extensions: [preCreateExtension(preCreate)], +}); + +export default collection; diff --git a/packages/crates-io-msw/models/user.test.js b/packages/crates-io-msw/models/user.test.js index e3db559e569..0d5cf8f7790 100644 --- a/packages/crates-io-msw/models/user.test.js +++ b/packages/crates-io-msw/models/user.test.js @@ -2,8 +2,8 @@ import { test } from 'vitest'; import { db } from '../index.js'; -test('default are applied', ({ expect }) => { - let user = db.user.create(); +test('default are applied', async ({ expect }) => { + let user = await db.user.create(); expect(user).toMatchInlineSnapshot(` { "avatar": "https://avatars1.githubusercontent.com/u/14631425?v=4", @@ -17,14 +17,12 @@ test('default are applied', ({ expect }) => { "name": "User 1", "publishNotifications": true, "url": "https://github.com/user-1", - Symbol(type): "user", - Symbol(primaryKey): "id", } `); }); -test('name can be set', ({ expect }) => { - let user = db.user.create({ name: 'John Doe' }); +test('name can be set', async ({ expect }) => { + let user = await db.user.create({ name: 'John Doe' }); expect(user).toMatchInlineSnapshot(` { "avatar": "https://avatars1.githubusercontent.com/u/14631425?v=4", @@ -38,8 +36,6 @@ test('name can be set', ({ expect }) => { "name": "John Doe", "publishNotifications": true, "url": "https://github.com/john-doe", - Symbol(type): "user", - Symbol(primaryKey): "id", } `); }); diff --git a/packages/crates-io-msw/models/version-download.js b/packages/crates-io-msw/models/version-download.js index cf2ec077806..8acc7a38395 100644 --- a/packages/crates-io-msw/models/version-download.js +++ b/packages/crates-io-msw/models/version-download.js @@ -1,22 +1,31 @@ -import { oneOf, primaryKey } from '@mswjs/data'; +import { Collection } from '@msw/data'; +import { z } from 'zod'; import { applyDefault } from '../utils/defaults.js'; +import { preCreateExtension } from '../utils/pre-create-extension.js'; -export default { - id: primaryKey(Number), +const schema = z.object({ + id: z.number(), - date: String, - downloads: Number, + date: z.string(), + downloads: z.number(), - version: oneOf('version'), + version: z.any(), +}); - preCreate(attrs, counter) { - applyDefault(attrs, 'id', () => counter); - applyDefault(attrs, 'date', () => '2019-05-21'); - applyDefault(attrs, 'downloads', () => (((attrs.id + 13) * 42) % 13) * 2345); +function preCreate(attrs, counter) { + applyDefault(attrs, 'id', () => counter); + applyDefault(attrs, 'date', () => '2019-05-21'); + applyDefault(attrs, 'downloads', () => (((attrs.id + 13) * 42) % 13) * 2345); - if (!attrs.version) { - throw new Error('Missing `version` relationship on `version-download`'); - } - }, -}; + if (!attrs.version) { + throw new Error('Missing `version` relationship on `version-download`'); + } +} + +const collection = new Collection({ + schema, + extensions: [preCreateExtension(preCreate)], +}); + +export default collection; diff --git a/packages/crates-io-msw/models/version-download.test.js b/packages/crates-io-msw/models/version-download.test.js index bd148a47fae..f6b2e3b2e19 100644 --- a/packages/crates-io-msw/models/version-download.test.js +++ b/packages/crates-io-msw/models/version-download.test.js @@ -2,16 +2,14 @@ import { test } from 'vitest'; import { db } from '../index.js'; -test('throws if `version` is not set', ({ expect }) => { - expect(() => db.versionDownload.create()).toThrowErrorMatchingInlineSnapshot( - `[Error: Missing \`version\` relationship on \`version-download\`]`, - ); +test('throws if `version` is not set', async ({ expect }) => { + await expect(() => db.versionDownload.create()).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Missing \`version\` relationship on \`version-download\`]`); }); -test('happy path', ({ expect }) => { - let crate = db.crate.create(); - let version = db.version.create({ crate }); - let versionDownload = db.versionDownload.create({ version }); +test('happy path', async ({ expect }) => { + let crate = await db.crate.create(); + let version = await db.version.create({ crate }); + let versionDownload = await db.versionDownload.create({ version }); expect(versionDownload).toMatchInlineSnapshot(` { "date": "2019-05-21", @@ -34,8 +32,6 @@ test('happy path', ({ expect }) => { "repository": null, "trustpubOnly": false, "updated_at": "2017-02-24T12:34:56Z", - Symbol(type): "crate", - Symbol(primaryKey): "id", }, "crate_size": 162963, "created_at": "2010-06-16T21:30:45Z", @@ -67,11 +63,7 @@ test('happy path', ({ expect }) => { "updated_at": "2017-02-24T12:34:56Z", "yank_message": null, "yanked": false, - Symbol(type): "version", - Symbol(primaryKey): "id", }, - Symbol(type): "versionDownload", - Symbol(primaryKey): "id", } `); }); diff --git a/packages/crates-io-msw/models/version.js b/packages/crates-io-msw/models/version.js index 54801e67698..8973eee5aa2 100644 --- a/packages/crates-io-msw/models/version.js +++ b/packages/crates-io-msw/models/version.js @@ -1,51 +1,60 @@ -import { nullable, oneOf, primaryKey } from '@mswjs/data'; +import { Collection } from '@msw/data'; +import { z } from 'zod'; import { applyDefault } from '../utils/defaults.js'; +import { preCreateExtension } from '../utils/pre-create-extension.js'; const LICENSES = ['MIT/Apache-2.0', 'MIT', 'Apache-2.0']; const LANGUAGES = ['Rust', 'JavaScript', 'TypeScript', 'Python', 'CSS', 'HTML', 'Shell']; -export default { - id: primaryKey(Number), - - num: String, - created_at: String, - updated_at: String, - yanked: Boolean, - yank_message: nullable(String), - license: String, - downloads: Number, - features: Object, - crate_size: Number, - readme: nullable(String), - rust_version: nullable(String), - trustpub_data: nullable(Object), - linecounts: nullable(Object), - - crate: oneOf('crate'), - publishedBy: nullable(oneOf('user')), - - preCreate(attrs, counter) { - applyDefault(attrs, 'id', () => counter); - applyDefault(attrs, 'num', () => `1.0.${attrs.id - 1}`); - applyDefault(attrs, 'created_at', () => '2010-06-16T21:30:45Z'); - applyDefault(attrs, 'updated_at', () => '2017-02-24T12:34:56Z'); - applyDefault(attrs, 'yanked', () => false); - applyDefault(attrs, 'yank_message', () => null); - applyDefault(attrs, 'license', () => LICENSES[attrs.id % LICENSES.length]); - applyDefault(attrs, 'downloads', () => (((attrs.id + 13) * 42) % 13) * 1234); - applyDefault(attrs, 'crate_size', () => (((attrs.id + 13) * 42) % 13) * 54_321); - applyDefault(attrs, 'readme', () => null); - applyDefault(attrs, 'rust_version', () => null); - applyDefault(attrs, 'trustpub_data', () => null); - applyDefault(attrs, 'linecounts', () => generateLinecounts(attrs.id)); - - if (!attrs.crate) { - throw new Error(`Missing \`crate\` relationship on \`version:${attrs.num}\``); - } - }, -}; +const schema = z.object({ + id: z.number(), + + num: z.string(), + created_at: z.string(), + updated_at: z.string(), + yanked: z.boolean(), + yank_message: z.string().nullable(), + license: z.string(), + downloads: z.number(), + features: z.record(z.string(), z.any()).default(() => ({})), + crate_size: z.number(), + readme: z.string().nullable(), + rust_version: z.string().nullable(), + trustpub_data: z.any().nullable(), + linecounts: z.any().nullable(), + + crate: z.any(), + publishedBy: z.any().nullable().default(null), +}); + +function preCreate(attrs, counter) { + applyDefault(attrs, 'id', () => counter); + applyDefault(attrs, 'num', () => `1.0.${attrs.id - 1}`); + applyDefault(attrs, 'created_at', () => '2010-06-16T21:30:45Z'); + applyDefault(attrs, 'updated_at', () => '2017-02-24T12:34:56Z'); + applyDefault(attrs, 'yanked', () => false); + applyDefault(attrs, 'yank_message', () => null); + applyDefault(attrs, 'license', () => LICENSES[attrs.id % LICENSES.length]); + applyDefault(attrs, 'downloads', () => (((attrs.id + 13) * 42) % 13) * 1234); + applyDefault(attrs, 'crate_size', () => (((attrs.id + 13) * 42) % 13) * 54_321); + applyDefault(attrs, 'readme', () => null); + applyDefault(attrs, 'rust_version', () => null); + applyDefault(attrs, 'trustpub_data', () => null); + applyDefault(attrs, 'linecounts', () => generateLinecounts(attrs.id)); + + if (!attrs.crate) { + throw new Error(`Missing \`crate\` relationship on \`version:${attrs.num}\``); + } +} + +const collection = new Collection({ + schema, + extensions: [preCreateExtension(preCreate)], +}); + +export default collection; function generateLinecounts(id) { // Some versions don't have linecount data (simulating older versions) diff --git a/packages/crates-io-msw/models/version.test.js b/packages/crates-io-msw/models/version.test.js index 4d5ca9af164..ab0fff8e133 100644 --- a/packages/crates-io-msw/models/version.test.js +++ b/packages/crates-io-msw/models/version.test.js @@ -2,15 +2,15 @@ import { test } from 'vitest'; import { db } from '../index.js'; -test('throws if `crate` is not set', ({ expect }) => { - expect(() => db.version.create()).toThrowErrorMatchingInlineSnapshot( +test('throws if `crate` is not set', async ({ expect }) => { + await expect(() => db.version.create()).rejects.toThrowErrorMatchingInlineSnapshot( `[Error: Missing \`crate\` relationship on \`version:1.0.0\`]`, ); }); -test('happy path', ({ expect }) => { - let crate = db.crate.create(); - let version = db.version.create({ crate }); +test('happy path', async ({ expect }) => { + let crate = await db.crate.create(); + let version = await db.version.create({ crate }); expect(version).toMatchInlineSnapshot(` { "crate": { @@ -29,8 +29,6 @@ test('happy path', ({ expect }) => { "repository": null, "trustpubOnly": false, "updated_at": "2017-02-24T12:34:56Z", - Symbol(type): "crate", - Symbol(primaryKey): "id", }, "crate_size": 162963, "created_at": "2010-06-16T21:30:45Z", @@ -62,8 +60,6 @@ test('happy path', ({ expect }) => { "updated_at": "2017-02-24T12:34:56Z", "yank_message": null, "yanked": false, - Symbol(type): "version", - Symbol(primaryKey): "id", } `); }); diff --git a/packages/crates-io-msw/utils/factory.d.ts b/packages/crates-io-msw/utils/factory.d.ts deleted file mode 100644 index c8de6302ede..00000000000 --- a/packages/crates-io-msw/utils/factory.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { FactoryAPI as mswFactoryApi, ModelDictionary } from '@mswjs/data/lib/glossary'; - -export declare type FactoryAPI = mswFactoryApi & { - reset(): void; -}; - -export declare function factory(dictionary: Dictionary): FactoryAPI; diff --git a/packages/crates-io-msw/utils/factory.js b/packages/crates-io-msw/utils/factory.js deleted file mode 100644 index 1c7fb416591..00000000000 --- a/packages/crates-io-msw/utils/factory.js +++ /dev/null @@ -1,53 +0,0 @@ -import { factory as mswFactory } from '@mswjs/data'; - -/** - * This function creates a new MSW database instance with the given models. - * - * This is a custom factory function that extends the default MSW factory - * by adding a `counter` property to each model and support for a `preCreate()` - * function that is executed before creating a new model and has access to the - * model attributes and the current sequence number. - */ -export function factory(models) { - // Extract `preCreate()` functions from the model definitions - // and store them in a separate Map. - let preCreateFns = new Map(); - for (let [modelName, modelDef] of Object.entries(models)) { - if (modelDef.preCreate) { - preCreateFns.set(modelName, modelDef.preCreate); - delete modelDef.preCreate; - } - } - - // Create a new MSW database instance with the given models. - let db = mswFactory(models); - - // Override the `create()` method of each model to apply - // the `preCreate()` function before creating a new model. - for (let [key, preCreate] of preCreateFns.entries()) { - let modelApi = db[key]; - - // Add a counter to each model. - modelApi.counter = 0; - - modelApi.mswCreate = modelApi.create; - modelApi.create = function (attrs = {}) { - preCreate(attrs, ++modelApi.counter); - return modelApi.mswCreate(attrs); - }; - } - - db.reset = function () { - for (let model of Object.values(db)) { - if (model.deleteMany) { - model.deleteMany({ where: {} }); - } - - if (model.counter) { - model.counter = 0; - } - } - }; - - return db; -} diff --git a/packages/crates-io-msw/utils/pre-create-extension.js b/packages/crates-io-msw/utils/pre-create-extension.js new file mode 100644 index 00000000000..859077833dc --- /dev/null +++ b/packages/crates-io-msw/utils/pre-create-extension.js @@ -0,0 +1,15 @@ +export function preCreateExtension(preCreate) { + return { + name: 'preCreate', + extend(collection) { + collection.__counter = 0; + + collection.__originalCreate = collection.create; + collection.create = async function (attrs) { + attrs = attrs ?? {}; + preCreate(attrs, ++collection.__counter); + return await collection.__originalCreate(attrs); + }; + }, + }; +} From 3d86e5fe55caab1689b8ecf706853804820799b0 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 14 Oct 2025 11:52:52 +0200 Subject: [PATCH 3/6] msw: Migrate fixtures to new `@msw/data` API --- packages/crates-io-msw/fixtures.js | 114 ++++++++++-------- packages/crates-io-msw/fixtures.test.js | 2 +- .../crates-io-msw/fixtures/dependencies.js | 10 +- packages/crates-io-msw/models/crate.js | 3 +- 4 files changed, 70 insertions(+), 59 deletions(-) diff --git a/packages/crates-io-msw/fixtures.js b/packages/crates-io-msw/fixtures.js index 596b96d1f63..a72bcf87ded 100644 --- a/packages/crates-io-msw/fixtures.js +++ b/packages/crates-io-msw/fixtures.js @@ -8,67 +8,77 @@ import USERS from './fixtures/users.js'; import VERSION_DOWNLOADS from './fixtures/version-downloads.js'; import VERSIONS from './fixtures/versions.js'; -export function loadFixtures(db) { - CATEGORIES.forEach(it => db.category.create(it)); - let keywords = KEYWORDS.map(it => db.keyword.create(it)); +export async function loadFixtures(db) { + await Promise.all(structuredClone(CATEGORIES).map(it => db.category.create(it))); + let keywords = await Promise.all(structuredClone(KEYWORDS).map(it => db.keyword.create(it))); - let users = USERS.map(it => db.user.create(it)); - let teams = TEAMS.map(it => db.team.create(it)); + let users = await Promise.all(structuredClone(USERS).map(it => db.user.create(it))); + let teams = await Promise.all(structuredClone(TEAMS).map(it => db.team.create(it))); - let crates = CRATES.map(it => { - if (it.keywordIds) { - it.keywords = it.keywordIds.map(id => keywords.find(k => k.id === id)).filter(Boolean); - delete it.keywordIds; - } + let crates = await Promise.all( + structuredClone(CRATES).map(it => { + if (it.keywordIds) { + it.keywords = it.keywordIds.map(id => keywords.find(k => k.id === id)).filter(Boolean); + delete it.keywordIds; + } - return db.crate.create(it); - }); + return db.crate.create(it); + }), + ); - CRATE_OWNERSHIPS.forEach(it => { - if (it.crateId) { - it.crate = crates.find(c => c.name === it.crateId); - delete it.crateId; - } - if (it.teamId) { - it.team = teams.find(t => t.id === it.teamId); - delete it.teamId; - } - if (it.userId) { - it.user = users.find(u => u.id === it.userId); - delete it.userId; - } + await Promise.all( + structuredClone(CRATE_OWNERSHIPS).map(it => { + if (it.crateId) { + it.crate = crates.find(c => c.name === it.crateId); + delete it.crateId; + } + if (it.teamId) { + it.team = teams.find(t => t.id === it.teamId); + delete it.teamId; + } + if (it.userId) { + it.user = users.find(u => u.id === it.userId); + delete it.userId; + } - return db.crateOwnership.create(it); - }); + return db.crateOwnership.create(it); + }), + ); - let versions = VERSIONS.map(it => { - if (it.crateId) { - it.crate = crates.find(c => c.name === it.crateId); - delete it.crateId; - } + let versions = await Promise.all( + structuredClone(VERSIONS).map(it => { + if (it.crateId) { + it.crate = crates.find(c => c.name === it.crateId); + delete it.crateId; + } - return db.version.create(it); - }); + return db.version.create(it); + }), + ); - DEPENDENCIES.forEach(it => { - if (it.crateId) { - it.crate = crates.find(c => c.name === it.crateId); - delete it.crateId; - } - if (it.versionId) { - it.version = versions.find(v => v.id === it.versionId); - delete it.versionId; - } + await Promise.all( + structuredClone(DEPENDENCIES).map(it => { + if (it.crateId) { + it.crate = crates.find(c => c.name === it.crateId); + delete it.crateId; + } + if (it.versionId) { + it.version = versions.find(v => v.id === it.versionId); + delete it.versionId; + } - return db.dependency.create(it); - }); + return db.dependency.create(it); + }), + ); - VERSION_DOWNLOADS.forEach(it => { - if (it.versionId) { - it.version = versions.find(v => v.id === it.versionId); - delete it.versionId; - } + await Promise.all( + structuredClone(VERSION_DOWNLOADS).map(it => { + if (it.versionId) { + it.version = versions.find(v => v.id === it.versionId); + delete it.versionId; + } - return db.versionDownload.create(it); - }); + return db.versionDownload.create(it); + }), + ); } diff --git a/packages/crates-io-msw/fixtures.test.js b/packages/crates-io-msw/fixtures.test.js index 300d0786ae3..dc2677ea207 100644 --- a/packages/crates-io-msw/fixtures.test.js +++ b/packages/crates-io-msw/fixtures.test.js @@ -4,5 +4,5 @@ import { loadFixtures } from './fixtures.js'; import { db } from './index.js'; test('loadFixtures() succeeds', async function () { - loadFixtures(db); + await loadFixtures(db); }); diff --git a/packages/crates-io-msw/fixtures/dependencies.js b/packages/crates-io-msw/fixtures/dependencies.js index ea9384d747f..fa4b56a98c8 100644 --- a/packages/crates-io-msw/fixtures/dependencies.js +++ b/packages/crates-io-msw/fixtures/dependencies.js @@ -2,7 +2,7 @@ export default [ { crateId: 'libc', default_features: true, - features: '', + features: [], id: 146_231, kind: 'normal', optional: false, @@ -13,7 +13,7 @@ export default [ { crateId: 'nanomsg-sys', default_features: true, - features: '', + features: [], id: 146_232, kind: 'normal', optional: false, @@ -24,7 +24,7 @@ export default [ { crateId: 'nanomsg', default_features: true, - features: '', + features: [], id: 146_233, kind: 'normal', optional: false, @@ -35,7 +35,7 @@ export default [ { crateId: 'mock-build-deps', default_features: true, - features: '', + features: [], id: 146_234, kind: 'build', optional: false, @@ -46,7 +46,7 @@ export default [ { crateId: 'mock-dev-deps', default_features: true, - features: '', + features: [], id: 146_235, kind: 'dev', optional: true, diff --git a/packages/crates-io-msw/models/crate.js b/packages/crates-io-msw/models/crate.js index c71362917c0..3f4ba2ff422 100644 --- a/packages/crates-io-msw/models/crate.js +++ b/packages/crates-io-msw/models/crate.js @@ -5,7 +5,8 @@ import { applyDefault } from '../utils/defaults.js'; import { preCreateExtension } from '../utils/pre-create-extension.js'; const schema = z.object({ - id: z.number(), + // `z.string()` is used to support some of our old fixture that use strings here for some reason + id: z.number().or(z.string()), name: z.string(), description: z.string(), From 8000f7dc84910a6c724ba472c9ea18c0a0d8dbc6 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 14 Oct 2025 14:23:43 +0200 Subject: [PATCH 4/6] msw: Migrate handlers to new `@msw/data` API --- .../handlers/api-tokens/create.js | 2 +- .../handlers/api-tokens/create.test.js | 18 +-- .../handlers/api-tokens/delete.js | 7 +- .../handlers/api-tokens/delete.test.js | 12 +- .../crates-io-msw/handlers/api-tokens/get.js | 7 +- .../handlers/api-tokens/get.test.js | 10 +- .../crates-io-msw/handlers/api-tokens/list.js | 5 +- .../handlers/api-tokens/list.test.js | 16 +-- .../crates-io-msw/handlers/categories/get.js | 2 +- .../handlers/categories/get.test.js | 20 +-- .../handlers/categories/list-slugs.js | 2 +- .../handlers/categories/list-slugs.test.js | 6 +- .../crates-io-msw/handlers/categories/list.js | 2 +- .../handlers/categories/list.test.js | 16 +-- .../handlers/crates/add-owners.js | 10 +- .../handlers/crates/add-owners.test.js | 50 ++++---- .../crates-io-msw/handlers/crates/delete.js | 4 +- .../handlers/crates/delete.test.js | 17 +-- .../handlers/crates/downloads.js | 4 +- .../handlers/crates/downloads.test.js | 22 ++-- .../crates-io-msw/handlers/crates/follow.js | 9 +- .../handlers/crates/follow.test.js | 15 +-- .../handlers/crates/following.js | 4 +- .../handlers/crates/following.test.js | 16 +-- packages/crates-io-msw/handlers/crates/get.js | 4 +- .../crates-io-msw/handlers/crates/get.test.js | 56 ++++----- .../crates-io-msw/handlers/crates/list.js | 20 ++- .../handlers/crates/list.test.js | 114 +++++++++--------- .../crates-io-msw/handlers/crates/patch.js | 9 +- .../handlers/crates/patch.test.js | 16 +-- .../handlers/crates/remove-owners.js | 12 +- .../handlers/crates/remove-owners.test.js | 56 ++++----- .../handlers/crates/reverse-dependencies.js | 5 +- .../crates/reverse-dependencies.test.js | 41 +++---- .../handlers/crates/team-owners.js | 4 +- .../handlers/crates/team-owners.test.js | 8 +- .../crates-io-msw/handlers/crates/unfollow.js | 9 +- .../handlers/crates/unfollow.test.js | 15 +-- .../handlers/crates/user-owners.js | 4 +- .../handlers/crates/user-owners.test.js | 8 +- .../handlers/invites/legacy-list.js | 2 +- .../handlers/invites/legacy-list.test.js | 24 ++-- .../crates-io-msw/handlers/invites/list.js | 6 +- .../handlers/invites/list.test.js | 68 +++++------ .../handlers/invites/redeem-by-crate-id.js | 13 +- .../invites/redeem-by-crate-id.test.js | 44 ++++--- .../handlers/invites/redeem-by-token.js | 6 +- .../handlers/invites/redeem-by-token.test.js | 22 ++-- .../crates-io-msw/handlers/keywords/get.js | 2 +- .../handlers/keywords/get.test.js | 16 +-- .../crates-io-msw/handlers/keywords/list.js | 2 +- .../handlers/keywords/list.test.js | 10 +- .../crates-io-msw/handlers/sessions/delete.js | 2 +- .../handlers/sessions/delete.test.js | 8 +- packages/crates-io-msw/handlers/summary.js | 6 +- .../crates-io-msw/handlers/summary.test.js | 8 +- packages/crates-io-msw/handlers/teams/get.js | 2 +- .../crates-io-msw/handlers/teams/get.test.js | 2 +- .../trustpub/github-configs/create.js | 13 +- .../trustpub/github-configs/create.test.js | 50 ++++---- .../trustpub/github-configs/delete.js | 13 +- .../trustpub/github-configs/delete.test.js | 38 +++--- .../handlers/trustpub/github-configs/list.js | 15 +-- .../trustpub/github-configs/list.test.js | 40 +++--- .../trustpub/gitlab-configs/create.js | 13 +- .../trustpub/gitlab-configs/create.test.js | 50 ++++---- .../trustpub/gitlab-configs/delete.js | 13 +- .../trustpub/gitlab-configs/delete.test.js | 38 +++--- .../handlers/trustpub/gitlab-configs/list.js | 15 +-- .../trustpub/gitlab-configs/list.test.js | 40 +++--- .../handlers/users/confirm-email.js | 11 +- .../handlers/users/confirm-email.test.js | 10 +- packages/crates-io-msw/handlers/users/get.js | 2 +- .../crates-io-msw/handlers/users/get.test.js | 2 +- packages/crates-io-msw/handlers/users/me.js | 2 +- .../crates-io-msw/handlers/users/me.test.js | 16 +-- .../handlers/users/resend.test.js | 10 +- .../crates-io-msw/handlers/users/update.js | 18 +-- .../handlers/users/update.test.js | 34 +++--- .../handlers/versions/dependencies.js | 13 +- .../handlers/versions/dependencies.test.js | 22 ++-- .../handlers/versions/downloads.js | 13 +- .../handlers/versions/downloads.test.js | 16 +-- .../handlers/versions/follow-updates.js | 2 +- .../handlers/versions/follow-updates.test.js | 24 ++-- .../crates-io-msw/handlers/versions/get.js | 11 +- .../handlers/versions/get.test.js | 8 +- .../crates-io-msw/handlers/versions/list.js | 4 +- .../handlers/versions/list.test.js | 60 ++++----- .../crates-io-msw/handlers/versions/patch.js | 20 ++- .../handlers/versions/patch.test.js | 22 ++-- .../crates-io-msw/handlers/versions/readme.js | 11 +- .../handlers/versions/readme.test.js | 10 +- .../handlers/versions/rebuild-docs.js | 11 +- .../handlers/versions/rebuild-docs.test.js | 18 +-- .../crates-io-msw/handlers/versions/unyank.js | 18 +-- .../handlers/versions/unyank.test.js | 20 +-- .../crates-io-msw/handlers/versions/yank.js | 17 +-- .../handlers/versions/yank.test.js | 20 +-- .../models/crate-ownership.test.js | 12 +- .../crates-io-msw/models/dependency.test.js | 8 +- packages/crates-io-msw/models/index.js | 8 +- .../crates-io-msw/models/msw-session.test.js | 4 +- .../models/version-download.test.js | 4 +- .../crates-io-msw/serializers/category.js | 3 +- packages/crates-io-msw/serializers/crate.js | 2 +- packages/crates-io-msw/serializers/keyword.js | 4 +- packages/crates-io-msw/utils/session.js | 2 +- tests/acceptance/api-token-test.js | 6 +- 109 files changed, 857 insertions(+), 879 deletions(-) diff --git a/packages/crates-io-msw/handlers/api-tokens/create.js b/packages/crates-io-msw/handlers/api-tokens/create.js index 4ad4bf360c2..b7ee9834608 100644 --- a/packages/crates-io-msw/handlers/api-tokens/create.js +++ b/packages/crates-io-msw/handlers/api-tokens/create.js @@ -12,7 +12,7 @@ export default http.put('/api/v1/me/tokens', async ({ request }) => { let json = await request.json(); - let token = db.apiToken.create({ + let token = await db.apiToken.create({ user, name: json.api_token.name, crateScopes: json.api_token.crate_scopes ?? null, diff --git a/packages/crates-io-msw/handlers/api-tokens/create.test.js b/packages/crates-io-msw/handlers/api-tokens/create.test.js index 48e57d9127d..6a1351c8644 100644 --- a/packages/crates-io-msw/handlers/api-tokens/create.test.js +++ b/packages/crates-io-msw/handlers/api-tokens/create.test.js @@ -12,14 +12,14 @@ afterEach(() => { }); test('creates a new API token', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let body = JSON.stringify({ api_token: { name: 'foooo' } }); let response = await fetch('/api/v1/me/tokens', { method: 'PUT', body }); assert.strictEqual(response.status, 200); - let token = db.apiToken.findMany({})[0]; + let token = db.apiToken.findMany(null)[0]; assert.ok(token); assert.deepEqual(await response.json(), { @@ -38,8 +38,8 @@ test('creates a new API token', async function () { }); test('creates a new API token with scopes', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let body = JSON.stringify({ api_token: { @@ -51,7 +51,7 @@ test('creates a new API token with scopes', async function () { let response = await fetch('/api/v1/me/tokens', { method: 'PUT', body }); assert.strictEqual(response.status, 200); - let token = db.apiToken.findMany({})[0]; + let token = db.apiToken.findMany(null)[0]; assert.ok(token); assert.deepEqual(await response.json(), { @@ -70,8 +70,8 @@ test('creates a new API token with scopes', async function () { }); test('creates a new API token with expiry date', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let body = JSON.stringify({ api_token: { @@ -82,7 +82,7 @@ test('creates a new API token with expiry date', async function () { let response = await fetch('/api/v1/me/tokens', { method: 'PUT', body }); assert.strictEqual(response.status, 200); - let token = db.apiToken.findMany({})[0]; + let token = db.apiToken.findMany(null)[0]; assert.ok(token); assert.deepEqual(await response.json(), { diff --git a/packages/crates-io-msw/handlers/api-tokens/delete.js b/packages/crates-io-msw/handlers/api-tokens/delete.js index 6cd4b2a4e00..12c1d726b0c 100644 --- a/packages/crates-io-msw/handlers/api-tokens/delete.js +++ b/packages/crates-io-msw/handlers/api-tokens/delete.js @@ -10,12 +10,7 @@ export default http.delete('/api/v1/me/tokens/:tokenId', async ({ params }) => { } let { tokenId } = params; - db.apiToken.delete({ - where: { - id: { equals: parseInt(tokenId) }, - user: { id: { equals: user.id } }, - }, - }); + db.apiToken.delete(q => q.where(token => token.id === parseInt(tokenId) && token.user.id === user.id)); return HttpResponse.json({}); }); diff --git a/packages/crates-io-msw/handlers/api-tokens/delete.test.js b/packages/crates-io-msw/handlers/api-tokens/delete.test.js index 0db2a45a5b9..0145ac7f537 100644 --- a/packages/crates-io-msw/handlers/api-tokens/delete.test.js +++ b/packages/crates-io-msw/handlers/api-tokens/delete.test.js @@ -3,22 +3,22 @@ import { assert, test } from 'vitest'; import { db } from '../../index.js'; test('revokes an API token', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - let token = db.apiToken.create({ user }); + let token = await db.apiToken.create({ user }); let response = await fetch(`/api/v1/me/tokens/${token.id}`, { method: 'DELETE' }); assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), {}); - let tokens = db.apiToken.findMany({}); + let tokens = db.apiToken.findMany(null); assert.strictEqual(tokens.length, 0); }); test('returns an error if unauthenticated', async function () { - let user = db.user.create(); - let token = db.apiToken.create({ user }); + let user = await db.user.create(); + let token = await db.apiToken.create({ user }); let response = await fetch(`/api/v1/me/tokens/${token.id}`, { method: 'DELETE' }); assert.strictEqual(response.status, 403); diff --git a/packages/crates-io-msw/handlers/api-tokens/get.js b/packages/crates-io-msw/handlers/api-tokens/get.js index 2d743a52815..5f48a13f60a 100644 --- a/packages/crates-io-msw/handlers/api-tokens/get.js +++ b/packages/crates-io-msw/handlers/api-tokens/get.js @@ -12,12 +12,7 @@ export default http.get('/api/v1/me/tokens/:tokenId', async ({ params }) => { } let { tokenId } = params; - let token = db.apiToken.findFirst({ - where: { - id: { equals: parseInt(tokenId) }, - user: { id: { equals: user.id } }, - }, - }); + let token = db.apiToken.findFirst(q => q.where(token => token.id === parseInt(tokenId) && token.user.id === user.id)); if (!token) return notFound(); return HttpResponse.json({ diff --git a/packages/crates-io-msw/handlers/api-tokens/get.test.js b/packages/crates-io-msw/handlers/api-tokens/get.test.js index 7f68044cbf7..e280d65de32 100644 --- a/packages/crates-io-msw/handlers/api-tokens/get.test.js +++ b/packages/crates-io-msw/handlers/api-tokens/get.test.js @@ -3,10 +3,10 @@ import { assert, test } from 'vitest'; import { db } from '../../index.js'; test('returns the requested token', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - let token = db.apiToken.create({ + let token = await db.apiToken.create({ user, crateScopes: ['serde', 'serde-*'], endpointScopes: ['publish-update'], @@ -28,8 +28,8 @@ test('returns the requested token', async function () { }); test('returns 404 if token not found', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/me/tokens/42'); assert.strictEqual(response.status, 404); diff --git a/packages/crates-io-msw/handlers/api-tokens/list.js b/packages/crates-io-msw/handlers/api-tokens/list.js index 1a5759296ee..806e8772f81 100644 --- a/packages/crates-io-msw/handlers/api-tokens/list.js +++ b/packages/crates-io-msw/handlers/api-tokens/list.js @@ -18,10 +18,7 @@ export default http.get('/api/v1/me/tokens', async ({ request }) => { } let apiTokens = db.apiToken - .findMany({ - where: { user: { id: { equals: user.id } } }, - orderBy: { id: 'desc' }, - }) + .findMany(q => q.where(token => token.user.id === user.id), { orderBy: { id: 'desc' } }) .filter(token => !token.expiredAt || new Date(token.expiredAt) > expiredAfter); return HttpResponse.json({ diff --git a/packages/crates-io-msw/handlers/api-tokens/list.test.js b/packages/crates-io-msw/handlers/api-tokens/list.test.js index 221805a9167..c9349a5426e 100644 --- a/packages/crates-io-msw/handlers/api-tokens/list.test.js +++ b/packages/crates-io-msw/handlers/api-tokens/list.test.js @@ -12,18 +12,18 @@ afterEach(() => { }); test('returns the list of API token for the authenticated `user`', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - db.apiToken.create({ + await db.apiToken.create({ user, createdAt: '2017-11-19T12:59:22Z', crateScopes: ['serde', 'serde-*'], endpointScopes: ['publish-update'], }); - db.apiToken.create({ user, createdAt: '2017-11-19T13:59:22Z', expiredAt: '2023-11-20T10:59:22Z' }); - db.apiToken.create({ user, createdAt: '2017-11-19T14:59:22Z' }); - db.apiToken.create({ user, createdAt: '2017-11-19T15:59:22Z', expiredAt: '2017-11-20T10:59:22Z' }); + await db.apiToken.create({ user, createdAt: '2017-11-19T13:59:22Z', expiredAt: '2023-11-20T10:59:22Z' }); + await db.apiToken.create({ user, createdAt: '2017-11-19T14:59:22Z' }); + await db.apiToken.create({ user, createdAt: '2017-11-19T15:59:22Z', expiredAt: '2017-11-20T10:59:22Z' }); let response = await fetch('/api/v1/me/tokens'); assert.strictEqual(response.status, 200); @@ -61,8 +61,8 @@ test('returns the list of API token for the authenticated `user`', async functio }); test('empty list case', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/me/tokens'); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/categories/get.js b/packages/crates-io-msw/handlers/categories/get.js index 902a3eb8232..b0a2f3fb0e5 100644 --- a/packages/crates-io-msw/handlers/categories/get.js +++ b/packages/crates-io-msw/handlers/categories/get.js @@ -6,7 +6,7 @@ import { notFound } from '../../utils/handlers.js'; export default http.get('/api/v1/categories/:category_id', ({ params }) => { let catId = params.category_id; - let category = db.category.findFirst({ where: { id: { equals: catId } } }); + let category = db.category.findFirst(q => q.where({ id: catId })); if (!category) { return notFound(); } diff --git a/packages/crates-io-msw/handlers/categories/get.test.js b/packages/crates-io-msw/handlers/categories/get.test.js index 636854d1b4c..63dfec046e6 100644 --- a/packages/crates-io-msw/handlers/categories/get.test.js +++ b/packages/crates-io-msw/handlers/categories/get.test.js @@ -9,7 +9,7 @@ test('returns 404 for unknown categories', async function () { }); test('returns a category object for known categories', async function () { - db.category.create({ + await db.category.create({ category: 'no-std', description: 'Crates that are able to function without the Rust standard library.', }); @@ -29,21 +29,21 @@ test('returns a category object for known categories', async function () { }); test('calculates `crates_cnt` correctly', async function () { - let cli = db.category.create({ category: 'cli' }); - Array.from({ length: 7 }, () => db.crate.create({ categories: [cli] })); - let notCli = db.category.create({ category: 'not-cli' }); - Array.from({ length: 3 }, () => db.crate.create({ categories: [notCli] })); + let testCli = await db.category.create({ category: 'test-cli-category' }); + await Promise.all(Array.from({ length: 7 }, () => db.crate.create({ categories: [testCli] }))); + let notTestCli = await db.category.create({ category: 'not-test-cli' }); + await Promise.all(Array.from({ length: 3 }, () => db.crate.create({ categories: [notTestCli] }))); - let response = await fetch('/api/v1/categories/cli'); + let response = await fetch('/api/v1/categories/test-cli-category'); assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { category: { - category: 'cli', + category: 'test-cli-category', crates_cnt: 7, created_at: '2010-06-16T21:30:45Z', - description: 'This is the description for the category called "cli"', - id: 'cli', - slug: 'cli', + description: 'This is the description for the category called "test-cli-category"', + id: 'test-cli-category', + slug: 'test-cli-category', }, }); }); diff --git a/packages/crates-io-msw/handlers/categories/list-slugs.js b/packages/crates-io-msw/handlers/categories/list-slugs.js index e15bdf78e2f..7e194690bad 100644 --- a/packages/crates-io-msw/handlers/categories/list-slugs.js +++ b/packages/crates-io-msw/handlers/categories/list-slugs.js @@ -4,7 +4,7 @@ import { db } from '../../index.js'; import { serializeCategorySlug } from '../../serializers/category.js'; export default http.get('/api/v1/category_slugs', () => { - let allCategories = db.category.findMany({ orderBy: { category: 'asc' } }); + let allCategories = db.category.findMany(null, { orderBy: { category: 'asc' } }); return HttpResponse.json({ category_slugs: allCategories.map(c => serializeCategorySlug(c)) }); }); diff --git a/packages/crates-io-msw/handlers/categories/list-slugs.test.js b/packages/crates-io-msw/handlers/categories/list-slugs.test.js index f5d97e77b69..36699c62b4b 100644 --- a/packages/crates-io-msw/handlers/categories/list-slugs.test.js +++ b/packages/crates-io-msw/handlers/categories/list-slugs.test.js @@ -11,11 +11,11 @@ test('empty case', async function () { }); test('returns a category slugs list', async function () { - db.category.create({ + await db.category.create({ category: 'no-std', description: 'Crates that are able to function without the Rust standard library.', }); - Array.from({ length: 2 }, () => db.category.create()); + await Promise.all(Array.from({ length: 2 }, () => db.category.create())); let response = await fetch('/api/v1/category_slugs'); assert.strictEqual(response.status, 200); @@ -41,7 +41,7 @@ test('returns a category slugs list', async function () { }); test('has no pagination', async function () { - Array.from({ length: 25 }, () => db.category.create()); + await Promise.all(Array.from({ length: 25 }, () => db.category.create())); let response = await fetch('/api/v1/category_slugs'); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/categories/list.js b/packages/crates-io-msw/handlers/categories/list.js index e0d133d170c..8ac656dabd2 100644 --- a/packages/crates-io-msw/handlers/categories/list.js +++ b/packages/crates-io-msw/handlers/categories/list.js @@ -7,7 +7,7 @@ import { pageParams } from '../../utils/handlers.js'; export default http.get('/api/v1/categories', ({ request }) => { let { skip, take } = pageParams(request); - let categories = db.category.findMany({ skip, take, orderBy: { category: 'asc' } }); + let categories = db.category.findMany(null, { skip, take, orderBy: { category: 'asc' } }); let total = db.category.count(); return HttpResponse.json({ categories: categories.map(c => serializeCategory(c)), meta: { total } }); diff --git a/packages/crates-io-msw/handlers/categories/list.test.js b/packages/crates-io-msw/handlers/categories/list.test.js index 3c19ba11e9e..56a6ec9e1e3 100644 --- a/packages/crates-io-msw/handlers/categories/list.test.js +++ b/packages/crates-io-msw/handlers/categories/list.test.js @@ -14,11 +14,11 @@ test('empty case', async function () { }); test('returns a paginated categories list', async function () { - db.category.create({ + await db.category.create({ category: 'no-std', description: 'Crates that are able to function without the Rust standard library.', }); - Array.from({ length: 2 }, () => db.category.create()); + await Promise.all(Array.from({ length: 2 }, () => db.category.create())); let response = await fetch('/api/v1/categories'); assert.strictEqual(response.status, 200); @@ -56,7 +56,7 @@ test('returns a paginated categories list', async function () { }); test('never returns more than 10 results', async function () { - Array.from({ length: 25 }, () => db.category.create()); + await Promise.all(Array.from({ length: 25 }, () => db.category.create())); let response = await fetch('/api/v1/categories'); assert.strictEqual(response.status, 200); @@ -67,10 +67,12 @@ test('never returns more than 10 results', async function () { }); test('supports `page` and `per_page` parameters', async function () { - Array.from({ length: 25 }, (_, i) => - db.category.create({ - category: `cat-${String(i + 1).padStart(2, '0')}`, - }), + await Promise.all( + Array.from({ length: 25 }, (_, i) => + db.category.create({ + category: `cat-${String(i + 1).padStart(2, '0')}`, + }), + ), ); let response = await fetch('/api/v1/categories?page=2&per_page=5'); diff --git a/packages/crates-io-msw/handlers/crates/add-owners.js b/packages/crates-io-msw/handlers/crates/add-owners.js index 227d27ef6a8..cae2d53a042 100644 --- a/packages/crates-io-msw/handlers/crates/add-owners.js +++ b/packages/crates-io-msw/handlers/crates/add-owners.js @@ -10,7 +10,7 @@ export default http.put('/api/v1/crates/:name/owners', async ({ request, params return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 }); } - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) { return notFound(); } @@ -22,7 +22,7 @@ export default http.put('/api/v1/crates/:name/owners', async ({ request, params let msgs = []; for (let login of body.owners) { if (login.includes(':')) { - let team = db.team.findFirst({ where: { login: { equals: login } } }); + let team = db.team.findFirst(q => q.where({ login })); if (!team) { let errorMessage = `could not find team with login \`${login}\``; return HttpResponse.json({ errors: [{ detail: errorMessage }] }, { status: 404 }); @@ -31,7 +31,7 @@ export default http.put('/api/v1/crates/:name/owners', async ({ request, params teams.push(team); msgs.push(`team ${login} has been added as an owner of crate ${crate.name}`); } else { - let user = db.user.findFirst({ where: { login: { equals: login } } }); + let user = db.user.findFirst(q => q.where({ login })); if (!user) { let errorMessage = `could not find user with login \`${login}\``; return HttpResponse.json({ errors: [{ detail: errorMessage }] }, { status: 404 }); @@ -43,11 +43,11 @@ export default http.put('/api/v1/crates/:name/owners', async ({ request, params } for (let team of teams) { - db.crateOwnership.create({ crate, team }); + await db.crateOwnership.create({ crate, team }); } for (let invitee of users) { - db.crateOwnerInvitation.create({ crate, inviter: user, invitee }); + await db.crateOwnerInvitation.create({ crate, inviter: user, invitee }); } return HttpResponse.json({ ok: true, msg: msgs.join(',') }); diff --git a/packages/crates-io-msw/handlers/crates/add-owners.test.js b/packages/crates-io-msw/handlers/crates/add-owners.test.js index cdaae3e7ae6..8671942dfa5 100644 --- a/packages/crates-io-msw/handlers/crates/add-owners.test.js +++ b/packages/crates-io-msw/handlers/crates/add-owners.test.js @@ -13,8 +13,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 404 for unknown crates', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/owners', { method: 'PUT', body: ADD_USER_BODY }); assert.strictEqual(response.status, 404); @@ -22,13 +22,13 @@ test('returns 404 for unknown crates', async function () { }); test('can add new owner', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - let crate = db.crate.create({ name: 'foo' }); - db.crateOwnership.create({ crate, user }); + let crate = await db.crate.create({ name: 'foo' }); + await db.crateOwnership.create({ crate, user }); - let user2 = db.user.create(); + let user2 = await db.user.create(); let body = JSON.stringify({ owners: [user2.login] }); let response = await fetch('/api/v1/crates/foo/owners', { method: 'PUT', body }); @@ -38,24 +38,24 @@ test('can add new owner', async function () { msg: 'user user-2 has been invited to be an owner of crate foo', }); - let owners = db.crateOwnership.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let owners = db.crateOwnership.findMany(q => q.where({ crate: { id: crate.id } })); assert.strictEqual(owners.length, 1); assert.strictEqual(owners[0].user.id, user.id); - let invites = db.crateOwnerInvitation.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let invites = db.crateOwnerInvitation.findMany(q => q.where({ crate: { id: crate.id } })); assert.strictEqual(invites.length, 1); assert.strictEqual(invites[0].inviter.id, user.id); assert.strictEqual(invites[0].invitee.id, user2.id); }); test('can add team owner', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - let crate = db.crate.create({ name: 'foo' }); - db.crateOwnership.create({ crate, user }); + let crate = await db.crate.create({ name: 'foo' }); + await db.crateOwnership.create({ crate, user }); - let team = db.team.create(); + let team = await db.team.create(); let body = JSON.stringify({ owners: [team.login] }); let response = await fetch('/api/v1/crates/foo/owners', { method: 'PUT', body }); @@ -65,27 +65,27 @@ test('can add team owner', async function () { msg: 'team github:rust-lang:team-1 has been added as an owner of crate foo', }); - let owners = db.crateOwnership.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let owners = db.crateOwnership.findMany(q => q.where({ crate: { id: crate.id } })); assert.strictEqual(owners.length, 2); assert.strictEqual(owners[0].user.id, user.id); assert.strictEqual(owners[0].team, null); assert.strictEqual(owners[1].user, null); assert.strictEqual(owners[1].team.id, user.id); - let invites = db.crateOwnerInvitation.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let invites = db.crateOwnerInvitation.findMany(q => q.where({ crate: { id: crate.id } })); assert.strictEqual(invites.length, 0); }); test('can add multiple owners', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - let crate = db.crate.create({ name: 'foo' }); - db.crateOwnership.create({ crate, user }); + let crate = await db.crate.create({ name: 'foo' }); + await db.crateOwnership.create({ crate, user }); - let team = db.team.create(); - let user2 = db.user.create(); - let user3 = db.user.create(); + let team = await db.team.create(); + let user2 = await db.user.create(); + let user3 = await db.user.create(); let body = JSON.stringify({ owners: [user2.login, team.login, user3.login] }); let response = await fetch('/api/v1/crates/foo/owners', { method: 'PUT', body }); @@ -95,14 +95,14 @@ test('can add multiple owners', async function () { msg: 'user user-2 has been invited to be an owner of crate foo,team github:rust-lang:team-1 has been added as an owner of crate foo,user user-3 has been invited to be an owner of crate foo', }); - let owners = db.crateOwnership.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let owners = db.crateOwnership.findMany(q => q.where({ crate: { id: crate.id } })); assert.strictEqual(owners.length, 2); assert.strictEqual(owners[0].user.id, user.id); assert.strictEqual(owners[0].team, null); assert.strictEqual(owners[1].user, null); assert.strictEqual(owners[1].team.id, user.id); - let invites = db.crateOwnerInvitation.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let invites = db.crateOwnerInvitation.findMany(q => q.where({ crate: { id: crate.id } })); assert.strictEqual(invites.length, 2); assert.strictEqual(invites[0].inviter.id, user.id); assert.strictEqual(invites[0].invitee.id, user2.id); diff --git a/packages/crates-io-msw/handlers/crates/delete.js b/packages/crates-io-msw/handlers/crates/delete.js index 15bcc4422cb..01dac79fade 100644 --- a/packages/crates-io-msw/handlers/crates/delete.js +++ b/packages/crates-io-msw/handlers/crates/delete.js @@ -9,12 +9,12 @@ export default http.delete('/api/v1/crates/:name', async ({ params }) => { return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 }); } - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) { return HttpResponse.json({ errors: [{ detail: `crate \`${params.name}\` does not exist` }] }, { status: 404 }); } - db.crate.delete({ where: { id: crate.id } }); + db.crate.delete(q => q.where({ id: crate.id })); return new HttpResponse(null, { status: 204 }); }); diff --git a/packages/crates-io-msw/handlers/crates/delete.test.js b/packages/crates-io-msw/handlers/crates/delete.test.js index aeff3e6382b..367da9cff73 100644 --- a/packages/crates-io-msw/handlers/crates/delete.test.js +++ b/packages/crates-io-msw/handlers/crates/delete.test.js @@ -11,8 +11,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 404 for unknown crates', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo', { method: 'DELETE' }); assert.strictEqual(response.status, 404); @@ -20,15 +20,18 @@ test('returns 404 for unknown crates', async function () { }); test('deletes crates', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - let crate = db.crate.create({ name: 'foo' }); - db.crateOwnership.create({ crate, user }); + let crate = await db.crate.create({ name: 'foo' }); + await db.crateOwnership.create({ crate, user }); let response = await fetch('/api/v1/crates/foo', { method: 'DELETE' }); assert.strictEqual(response.status, 204); assert.deepEqual(await response.text(), ''); - assert.strictEqual(db.crate.findFirst({ where: { name: { equals: 'foo' } } }), null); + assert.strictEqual( + db.crate.findFirst(q => q.where({ name: 'foo' })), + undefined, + ); }); diff --git a/packages/crates-io-msw/handlers/crates/downloads.js b/packages/crates-io-msw/handlers/crates/downloads.js index c4fd5b4372b..979c33c4c4b 100644 --- a/packages/crates-io-msw/handlers/crates/downloads.js +++ b/packages/crates-io-msw/handlers/crates/downloads.js @@ -5,10 +5,10 @@ import { serializeVersion } from '../../serializers/version.js'; import { notFound } from '../../utils/handlers.js'; export default http.get('/api/v1/crates/:name/downloads', async ({ request, params }) => { - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) return notFound(); - let downloads = db.versionDownload.findMany({ where: { version: { crate: { id: { equals: crate.id } } } } }); + let downloads = db.versionDownload.findMany(q => q.where(download => download.version.crate.id === crate.id)); let resp = { version_downloads: downloads.map(download => ({ date: download.date, diff --git a/packages/crates-io-msw/handlers/crates/downloads.test.js b/packages/crates-io-msw/handlers/crates/downloads.test.js index 2337366adc1..d0730b38406 100644 --- a/packages/crates-io-msw/handlers/crates/downloads.test.js +++ b/packages/crates-io-msw/handlers/crates/downloads.test.js @@ -9,7 +9,7 @@ test('returns 404 for unknown crates', async function () { }); test('empty case', async function () { - db.crate.create({ name: 'rand' }); + await db.crate.create({ name: 'rand' }); let response = await fetch('/api/v1/crates/rand/downloads'); assert.strictEqual(response.status, 200); @@ -22,11 +22,11 @@ test('empty case', async function () { }); test('returns a list of version downloads belonging to the specified crate version', async function () { - let crate = db.crate.create({ name: 'rand' }); - let versions = Array.from({ length: 2 }, () => db.version.create({ crate })); - db.versionDownload.create({ version: versions[0], date: '2020-01-13' }); - db.versionDownload.create({ version: versions[1], date: '2020-01-14' }); - db.versionDownload.create({ version: versions[1], date: '2020-01-15' }); + let crate = await db.crate.create({ name: 'rand' }); + let versions = await Promise.all(Array.from({ length: 2 }, () => db.version.create({ crate }))); + await db.versionDownload.create({ version: versions[0], date: '2020-01-13' }); + await db.versionDownload.create({ version: versions[1], date: '2020-01-14' }); + await db.versionDownload.create({ version: versions[1], date: '2020-01-15' }); let response = await fetch('/api/v1/crates/rand/downloads'); assert.strictEqual(response.status, 200); @@ -55,11 +55,11 @@ test('returns a list of version downloads belonging to the specified crate versi }); test('includes related versions', async function () { - let crate = db.crate.create({ name: 'rand' }); - let versions = Array.from({ length: 2 }, () => db.version.create({ crate })); - db.versionDownload.create({ version: versions[0], date: '2020-01-13' }); - db.versionDownload.create({ version: versions[1], date: '2020-01-14' }); - db.versionDownload.create({ version: versions[1], date: '2020-01-15' }); + let crate = await db.crate.create({ name: 'rand' }); + let versions = await Promise.all(Array.from({ length: 2 }, () => db.version.create({ crate }))); + await db.versionDownload.create({ version: versions[0], date: '2020-01-13' }); + await db.versionDownload.create({ version: versions[1], date: '2020-01-14' }); + await db.versionDownload.create({ version: versions[1], date: '2020-01-15' }); let response = await fetch('/api/v1/crates/rand/downloads?include=versions'); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/crates/follow.js b/packages/crates-io-msw/handlers/crates/follow.js index 0c716342450..2540dfc2dfb 100644 --- a/packages/crates-io-msw/handlers/crates/follow.js +++ b/packages/crates-io-msw/handlers/crates/follow.js @@ -10,15 +10,14 @@ export default http.put('/api/v1/crates/:name/follow', async ({ params }) => { return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 }); } - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) { return notFound(); } - db.user.update({ - where: { id: { equals: user.id } }, - data: { - followedCrates: [...user.followedCrates.filter(c => c.id !== crate.id), crate], + await db.user.update(q => q.where({ id: user.id }), { + data(user) { + user.followedCrates = [...user.followedCrates.filter(c => c.id !== crate.id), crate]; }, }); diff --git a/packages/crates-io-msw/handlers/crates/follow.test.js b/packages/crates-io-msw/handlers/crates/follow.test.js index e0eafa98806..9166b7e335c 100644 --- a/packages/crates-io-msw/handlers/crates/follow.test.js +++ b/packages/crates-io-msw/handlers/crates/follow.test.js @@ -11,8 +11,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 404 for unknown crates', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/follow', { method: 'PUT' }); assert.strictEqual(response.status, 404); @@ -20,10 +20,10 @@ test('returns 404 for unknown crates', async function () { }); test('makes the authenticated user follow the crate', async function () { - let crate = db.crate.create({ name: 'rand' }); + let crate = await db.crate.create({ name: 'rand' }); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); assert.deepEqual(user.followedCrates, []); @@ -31,6 +31,7 @@ test('makes the authenticated user follow the crate', async function () { assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { ok: true }); - user = db.user.findFirst({ where: { id: user.id } }); - assert.deepEqual(user.followedCrates, [crate]); + user = db.user.findFirst(q => q.where({ id: user.id })); + assert.equal(user.followedCrates.length, 1); + assert.equal(user.followedCrates[0].name, crate.name); }); diff --git a/packages/crates-io-msw/handlers/crates/following.js b/packages/crates-io-msw/handlers/crates/following.js index 4d248d21892..f8e204b971e 100644 --- a/packages/crates-io-msw/handlers/crates/following.js +++ b/packages/crates-io-msw/handlers/crates/following.js @@ -10,12 +10,12 @@ export default http.get('/api/v1/crates/:name/following', async ({ params }) => return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 }); } - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) { return notFound(); } - let following = user.followedCrates.includes(crate); + let following = user.followedCrates.some(followedCrate => followedCrate.id === crate.id); return HttpResponse.json({ following }); }); diff --git a/packages/crates-io-msw/handlers/crates/following.test.js b/packages/crates-io-msw/handlers/crates/following.test.js index 06828af29f2..64bae13a426 100644 --- a/packages/crates-io-msw/handlers/crates/following.test.js +++ b/packages/crates-io-msw/handlers/crates/following.test.js @@ -11,8 +11,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 404 for unknown crates', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/following'); assert.strictEqual(response.status, 404); @@ -20,10 +20,10 @@ test('returns 404 for unknown crates', async function () { }); test('returns true if the authenticated user follows the crate', async function () { - let crate = db.crate.create({ name: 'rand' }); + let crate = await db.crate.create({ name: 'rand' }); - let user = db.user.create({ followedCrates: [crate] }); - db.mswSession.create({ user }); + let user = await db.user.create({ followedCrates: [crate] }); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/rand/following'); assert.strictEqual(response.status, 200); @@ -31,10 +31,10 @@ test('returns true if the authenticated user follows the crate', async function }); test('returns false if the authenticated user is not following the crate', async function () { - db.crate.create({ name: 'rand' }); + await db.crate.create({ name: 'rand' }); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/rand/following'); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/crates/get.js b/packages/crates-io-msw/handlers/crates/get.js index ae2d13c3f4d..5c3223714d0 100644 --- a/packages/crates-io-msw/handlers/crates/get.js +++ b/packages/crates-io-msw/handlers/crates/get.js @@ -12,10 +12,10 @@ const DEFAULT_INCLUDES = ['versions', 'keywords', 'categories']; export default http.get('/api/v1/crates/:name', async ({ request, params }) => { let { name } = params; let canonicalName = toCanonicalName(name); - let crate = db.crate.findMany({}).find(it => toCanonicalName(it.name) === canonicalName); + let crate = db.crate.findFirst(q => q.where(crate => toCanonicalName(crate.name) === canonicalName)); if (!crate) return notFound(); - let versions = db.version.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let versions = db.version.findMany(q => q.where(version => version.crate?.id === crate.id)); versions.sort((a, b) => b.id - a.id); let url = new URL(request.url); diff --git a/packages/crates-io-msw/handlers/crates/get.test.js b/packages/crates-io-msw/handlers/crates/get.test.js index a2350d0609d..1ef7f82a765 100644 --- a/packages/crates-io-msw/handlers/crates/get.test.js +++ b/packages/crates-io-msw/handlers/crates/get.test.js @@ -9,8 +9,8 @@ test('returns 404 for unknown crates', async function () { }); test('returns a crate object for known crates', async function () { - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ crate, num: '1.0.0-beta.1' }); + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, num: '1.0.0-beta.1' }); let response = await fetch('/api/v1/crates/rand'); assert.strictEqual(response.status, 200); @@ -91,8 +91,8 @@ test('returns a crate object for known crates', async function () { }); test('works for non-canonical names', async function () { - let crate = db.crate.create({ name: 'foo-bar' }); - db.version.create({ crate, num: '1.0.0-beta.1' }); + let crate = await db.crate.create({ name: 'foo-bar' }); + await db.version.create({ crate, num: '1.0.0-beta.1' }); let response = await fetch('/api/v1/crates/foo_bar'); assert.strictEqual(response.status, 200); @@ -173,10 +173,10 @@ test('works for non-canonical names', async function () { }); test('includes related versions', async function () { - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ crate, num: '1.0.0' }); - db.version.create({ crate, num: '1.1.0' }); - db.version.create({ crate, num: '1.2.0' }); + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, num: '1.0.0' }); + await db.version.create({ crate, num: '1.1.0' }); + await db.version.create({ crate, num: '1.2.0' }); let response = await fetch('/api/v1/crates/rand'); assert.strictEqual(response.status, 200); @@ -302,10 +302,10 @@ test('includes related versions', async function () { }); test('includes related categories', async function () { - let noStd = db.category.create({ category: 'no-std' }); - db.category.create({ category: 'cli' }); - let crate = db.crate.create({ name: 'rand', categories: [noStd] }); - db.version.create({ crate }); + let noStd = await db.category.create({ category: 'no-std' }); + await db.category.create({ category: 'cli' }); + let crate = await db.crate.create({ name: 'rand', categories: [noStd] }); + await db.version.create({ crate }); let response = await fetch('/api/v1/crates/rand'); assert.strictEqual(response.status, 200); @@ -325,10 +325,10 @@ test('includes related categories', async function () { }); test('includes related keywords', async function () { - let noStd = db.keyword.create({ keyword: 'no-std' }); - db.keyword.create({ keyword: 'cli' }); - let crate = db.crate.create({ name: 'rand', keywords: [noStd] }); - db.version.create({ crate }); + let noStd = await db.keyword.create({ keyword: 'no-std' }); + await db.keyword.create({ keyword: 'cli' }); + let crate = await db.crate.create({ name: 'rand', keywords: [noStd] }); + await db.version.create({ crate }); let response = await fetch('/api/v1/crates/rand'); assert.strictEqual(response.status, 200); @@ -345,14 +345,14 @@ test('includes related keywords', async function () { }); test('without versions included', async function () { - db.category.create({ category: 'no-std' }); - db.category.create({ category: 'cli' }); - db.keyword.create({ keyword: 'no-std' }); - db.keyword.create({ keyword: 'cli' }); - let crate = db.crate.create({ name: 'rand', categoryIds: ['no-std'], keywordIds: ['no-std'] }); - db.version.create({ crate, num: '1.0.0' }); - db.version.create({ crate, num: '1.1.0' }); - db.version.create({ crate, num: '1.2.0' }); + await db.category.create({ category: 'no-std' }); + await db.category.create({ category: 'cli' }); + await db.keyword.create({ keyword: 'no-std' }); + await db.keyword.create({ keyword: 'cli' }); + let crate = await db.crate.create({ name: 'rand', categoryIds: ['no-std'], keywordIds: ['no-std'] }); + await db.version.create({ crate, num: '1.0.0' }); + await db.version.create({ crate, num: '1.1.0' }); + await db.version.create({ crate, num: '1.2.0' }); let req = await fetch('/api/v1/crates/rand'); let expected = await req.json(); @@ -375,10 +375,10 @@ test('without versions included', async function () { }); test('includes default_version', async function () { - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ crate, num: '1.0.0' }); - db.version.create({ crate, num: '1.1.0' }); - db.version.create({ crate, num: '1.2.0' }); + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, num: '1.0.0' }); + await db.version.create({ crate, num: '1.1.0' }); + await db.version.create({ crate, num: '1.2.0' }); let req = await fetch('/api/v1/crates/rand'); let expected = await req.json(); diff --git a/packages/crates-io-msw/handlers/crates/list.js b/packages/crates-io-msw/handlers/crates/list.js index 7afeca24b02..c553aa9b677 100644 --- a/packages/crates-io-msw/handlers/crates/list.js +++ b/packages/crates-io-msw/handlers/crates/list.js @@ -10,7 +10,7 @@ export default http.get('/api/v1/crates', async ({ request }) => { const { start, end } = pageParams(request); - let crates = db.crate.findMany({}); + let crates = db.crate.findMany(null); if (url.searchParams.get('following') === '1') { let { user } = getSession(); @@ -37,12 +37,9 @@ export default http.get('/api/v1/crates', async ({ request }) => { if (userId) { userId = parseInt(userId, 10); crates = crates.filter(crate => - db.crateOwnership.findFirst({ - where: { - crate: { id: { equals: crate.id } }, - user: { id: { equals: userId } }, - }, - }), + db.crateOwnership.findFirst(q => + q.where(ownership => ownership.crate.id === crate.id && ownership.user?.id === userId), + ), ); } @@ -50,12 +47,9 @@ export default http.get('/api/v1/crates', async ({ request }) => { if (teamId) { teamId = parseInt(teamId, 10); crates = crates.filter(crate => - db.crateOwnership.findFirst({ - where: { - crate: { id: { equals: crate.id } }, - team: { id: { equals: teamId } }, - }, - }), + db.crateOwnership.findFirst(q => + q.where(ownership => ownership.crate.id === crate.id && ownership.team?.id === teamId), + ), ); } diff --git a/packages/crates-io-msw/handlers/crates/list.test.js b/packages/crates-io-msw/handlers/crates/list.test.js index 8a879fb03ff..734cbc314c4 100644 --- a/packages/crates-io-msw/handlers/crates/list.test.js +++ b/packages/crates-io-msw/handlers/crates/list.test.js @@ -14,14 +14,14 @@ test('empty case', async function () { }); test('returns a paginated crates list', async function () { - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, created_at: '2020-11-06T12:34:56Z', num: '1.0.0', updated_at: '2020-11-06T12:34:56Z', }); - db.version.create({ + await db.version.create({ crate, created_at: '2020-12-25T12:34:56Z', num: '2.0.0-beta.1', @@ -29,7 +29,7 @@ test('returns a paginated crates list', async function () { }); let response = await fetch('/api/v1/crates'); - // assert.strictEqual(response.status, 200); + assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { crates: [ { @@ -71,8 +71,8 @@ test('returns a paginated crates list', async function () { }); test('never returns more than 10 results', async function () { - let crates = Array.from({ length: 25 }, () => db.crate.create()); - crates.forEach(crate => db.version.create({ crate })); + let crates = await Promise.all(Array.from({ length: 25 }, () => db.crate.create())); + await Promise.all(crates.map(crate => db.version.create({ crate }))); let response = await fetch('/api/v1/crates'); assert.strictEqual(response.status, 200); @@ -83,10 +83,10 @@ test('never returns more than 10 results', async function () { }); test('supports `page` and `per_page` parameters', async function () { - let crates = Array.from({ length: 25 }, (_, i) => - db.crate.create({ name: `crate-${String(i + 1).padStart(2, '0')}` }), + let crates = await Promise.all( + Array.from({ length: 25 }, (_, i) => db.crate.create({ name: `crate-${String(i + 1).padStart(2, '0')}` })), ); - crates.forEach(crate => db.version.create({ crate })); + await Promise.all(crates.map(crate => db.version.create({ crate }))); let response = await fetch('/api/v1/crates?page=2&per_page=5'); assert.strictEqual(response.status, 200); @@ -101,12 +101,12 @@ test('supports `page` and `per_page` parameters', async function () { }); test('supports a `letter` parameter', async function () { - let foo = db.crate.create({ name: 'foo' }); - db.version.create({ crate: foo }); - let bar = db.crate.create({ name: 'bar' }); - db.version.create({ crate: bar }); - let baz = db.crate.create({ name: 'BAZ' }); - db.version.create({ crate: baz }); + let foo = await db.crate.create({ name: 'foo' }); + await db.version.create({ crate: foo }); + let bar = await db.crate.create({ name: 'bar' }); + await db.version.create({ crate: bar }); + let baz = await db.crate.create({ name: 'BAZ' }); + await db.version.create({ crate: baz }); let response = await fetch('/api/v1/crates?letter=b'); assert.strictEqual(response.status, 200); @@ -121,12 +121,12 @@ test('supports a `letter` parameter', async function () { }); test('supports a `q` parameter', async function () { - let crate1 = db.crate.create({ name: '123456' }); - db.version.create({ crate: crate1 }); - let crate2 = db.crate.create({ name: '123' }); - db.version.create({ crate: crate2 }); - let crate3 = db.crate.create({ name: '87654' }); - db.version.create({ crate: crate3 }); + let crate1 = await db.crate.create({ name: '123456' }); + await db.version.create({ crate: crate1 }); + let crate2 = await db.crate.create({ name: '123' }); + await db.version.create({ crate: crate2 }); + let crate3 = await db.crate.create({ name: '87654' }); + await db.version.create({ crate: crate3 }); let response = await fetch('/api/v1/crates?q=123'); assert.strictEqual(response.status, 200); @@ -145,17 +145,17 @@ test('supports a `q` parameter', async function () { }); test('supports a `user_id` parameter', async function () { - let user1 = db.user.create(); - let user2 = db.user.create(); - - let foo = db.crate.create({ name: 'foo' }); - db.version.create({ crate: foo }); - let bar = db.crate.create({ name: 'bar' }); - db.crateOwnership.create({ crate: bar, user: user1 }); - db.version.create({ crate: bar }); - let baz = db.crate.create({ name: 'baz' }); - db.crateOwnership.create({ crate: baz, user: user2 }); - db.version.create({ crate: baz }); + let user1 = await db.user.create(); + let user2 = await db.user.create(); + + let foo = await db.crate.create({ name: 'foo' }); + await db.version.create({ crate: foo }); + let bar = await db.crate.create({ name: 'bar' }); + await db.crateOwnership.create({ crate: bar, user: user1 }); + await db.version.create({ crate: bar }); + let baz = await db.crate.create({ name: 'baz' }); + await db.crateOwnership.create({ crate: baz, user: user2 }); + await db.version.create({ crate: baz }); let response = await fetch(`/api/v1/crates?user_id=${user1.id}`); assert.strictEqual(response.status, 200); @@ -167,17 +167,17 @@ test('supports a `user_id` parameter', async function () { }); test('supports a `team_id` parameter', async function () { - let team1 = db.team.create(); - let team2 = db.team.create(); - - let foo = db.crate.create({ name: 'foo' }); - db.version.create({ crate: foo }); - let bar = db.crate.create({ name: 'bar' }); - db.crateOwnership.create({ crate: bar, team: team1 }); - db.version.create({ crate: bar }); - let baz = db.crate.create({ name: 'baz' }); - db.crateOwnership.create({ crate: baz, team: team2 }); - db.version.create({ crate: baz }); + let team1 = await db.team.create(); + let team2 = await db.team.create(); + + let foo = await db.crate.create({ name: 'foo' }); + await db.version.create({ crate: foo }); + let bar = await db.crate.create({ name: 'bar' }); + await db.crateOwnership.create({ crate: bar, team: team1 }); + await db.version.create({ crate: bar }); + let baz = await db.crate.create({ name: 'baz' }); + await db.crateOwnership.create({ crate: baz, team: team2 }); + await db.version.create({ crate: baz }); let response = await fetch(`/api/v1/crates?team_id=${team1.id}`); assert.strictEqual(response.status, 200); @@ -189,13 +189,13 @@ test('supports a `team_id` parameter', async function () { }); test('supports a `following` parameter', async function () { - let foo = db.crate.create({ name: 'foo' }); - db.version.create({ crate: foo }); - let bar = db.crate.create({ name: 'bar' }); - db.version.create({ crate: bar }); + let foo = await db.crate.create({ name: 'foo' }); + await db.version.create({ crate: foo }); + let bar = await db.crate.create({ name: 'bar' }); + await db.version.create({ crate: bar }); - let user = db.user.create({ followedCrates: [bar] }); - db.mswSession.create({ user }); + let user = await db.user.create({ followedCrates: [bar] }); + await db.mswSession.create({ user }); let response = await fetch(`/api/v1/crates?following=1`); assert.strictEqual(response.status, 200); @@ -207,14 +207,14 @@ test('supports a `following` parameter', async function () { }); test('supports multiple `ids[]` parameters', async function () { - let foo = db.crate.create({ name: 'foo' }); - db.version.create({ crate: foo }); - let bar = db.crate.create({ name: 'bar' }); - db.version.create({ crate: bar }); - let baz = db.crate.create({ name: 'baz' }); - db.version.create({ crate: baz }); - let other = db.crate.create({ name: 'other' }); - db.version.create({ crate: other }); + let foo = await db.crate.create({ name: 'foo' }); + await db.version.create({ crate: foo }); + let bar = await db.crate.create({ name: 'bar' }); + await db.version.create({ crate: bar }); + let baz = await db.crate.create({ name: 'baz' }); + await db.version.create({ crate: baz }); + let other = await db.crate.create({ name: 'other' }); + await db.version.create({ crate: other }); let response = await fetch(`/api/v1/crates?ids[]=foo&ids[]=bar&ids[]=baz&ids[]=baz&ids[]=unknown`); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/crates/patch.js b/packages/crates-io-msw/handlers/crates/patch.js index 426abbe2023..492e14f6cae 100644 --- a/packages/crates-io-msw/handlers/crates/patch.js +++ b/packages/crates-io-msw/handlers/crates/patch.js @@ -10,7 +10,7 @@ export default http.patch('/api/v1/crates/:name', async ({ request, params }) => return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 }); } - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) { return HttpResponse.json({ errors: [{ detail: `crate \`${params.name}\` does not exist` }] }, { status: 404 }); } @@ -18,10 +18,9 @@ export default http.patch('/api/v1/crates/:name', async ({ request, params }) => let body = await request.json(); if (body.crate?.trustpub_only != null) { - crate = db.crate.update({ - where: { id: { equals: crate.id } }, - data: { - trustpubOnly: body.crate.trustpub_only, + crate = await db.crate.update(q => q.where({ id: crate.id }), { + data(crate) { + crate.trustpubOnly = body.crate.trustpub_only; }, }); } diff --git a/packages/crates-io-msw/handlers/crates/patch.test.js b/packages/crates-io-msw/handlers/crates/patch.test.js index ee93e1ec5fb..621c18a8ddd 100644 --- a/packages/crates-io-msw/handlers/crates/patch.test.js +++ b/packages/crates-io-msw/handlers/crates/patch.test.js @@ -15,8 +15,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 404 for unknown crates', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo', { method: 'PATCH', @@ -28,14 +28,14 @@ test('returns 404 for unknown crates', async function () { }); test('updates trustpub_only flag', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - let crate = db.crate.create({ name: 'foo', trustpubOnly: false }); + let crate = await db.crate.create({ name: 'foo', trustpubOnly: false }); assert.strictEqual(crate.trustpubOnly, false); - db.version.create({ crate, num: '1.0.0' }); - db.crateOwnership.create({ crate, user }); + await db.version.create({ crate, num: '1.0.0' }); + await db.crateOwnership.create({ crate, user }); let response = await fetch('/api/v1/crates/foo', { method: 'PATCH', @@ -47,6 +47,6 @@ test('updates trustpub_only flag', async function () { let json = await response.json(); assert.strictEqual(json.crate.trustpub_only, true); - let updatedCrate = db.crate.findFirst({ where: { name: { equals: 'foo' } } }); + let updatedCrate = db.crate.findFirst(q => q.where({ name: 'foo' })); assert.strictEqual(updatedCrate.trustpubOnly, true); }); diff --git a/packages/crates-io-msw/handlers/crates/remove-owners.js b/packages/crates-io-msw/handlers/crates/remove-owners.js index a221967d4fb..b713eab2c70 100644 --- a/packages/crates-io-msw/handlers/crates/remove-owners.js +++ b/packages/crates-io-msw/handlers/crates/remove-owners.js @@ -10,7 +10,7 @@ export default http.delete('/api/v1/crates/:name/owners', async ({ request, para return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 }); } - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) { return notFound(); } @@ -18,11 +18,13 @@ export default http.delete('/api/v1/crates/:name/owners', async ({ request, para let body = await request.json(); for (let owner of body.owners) { - let ownership = db.crateOwnership.findFirst({ - where: owner.includes(':') ? { team: { login: { equals: owner } } } : { user: { login: { equals: owner } } }, - }); + let ownership = db.crateOwnership.findFirst( + owner.includes(':') + ? q => q.where(ownership => ownership.team?.login === owner) + : q => q.where(ownership => ownership.user?.login === owner), + ); if (!ownership) return notFound(); - db.crateOwnership.delete({ where: { id: { equals: ownership.id } } }); + db.crateOwnership.delete(q => q.where({ id: ownership.id })); } return HttpResponse.json({ ok: true, msg: 'owners successfully removed' }); diff --git a/packages/crates-io-msw/handlers/crates/remove-owners.test.js b/packages/crates-io-msw/handlers/crates/remove-owners.test.js index d1c84998227..b3ab41e161c 100644 --- a/packages/crates-io-msw/handlers/crates/remove-owners.test.js +++ b/packages/crates-io-msw/handlers/crates/remove-owners.test.js @@ -13,8 +13,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 404 for unknown crates', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/owners', { method: 'DELETE', body: REMOVE_USER_BODY }); assert.strictEqual(response.status, 404); @@ -22,75 +22,75 @@ test('returns 404 for unknown crates', async function () { }); test('can remove a user owner', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - let crate = db.crate.create({ name: 'foo' }); - db.crateOwnership.create({ crate, user }); + let crate = await db.crate.create({ name: 'foo' }); + await db.crateOwnership.create({ crate, user }); - let user2 = db.user.create(); - db.crateOwnership.create({ crate, user: user2 }); + let user2 = await db.user.create(); + await db.crateOwnership.create({ crate, user: user2 }); let body = JSON.stringify({ owners: [user2.login] }); let response = await fetch('/api/v1/crates/foo/owners', { method: 'DELETE', body }); assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { ok: true, msg: 'owners successfully removed' }); - let owners = db.crateOwnership.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let owners = db.crateOwnership.findMany(q => q.where({ crate: { id: crate.id } })); assert.strictEqual(owners.length, 1); assert.strictEqual(owners[0].user.id, user.id); - let invites = db.crateOwnerInvitation.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let invites = db.crateOwnerInvitation.findMany(q => q.where({ crate: { id: crate.id } })); assert.strictEqual(invites.length, 0); }); test('can remove a team owner', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - let crate = db.crate.create({ name: 'foo' }); - db.crateOwnership.create({ crate, user }); + let crate = await db.crate.create({ name: 'foo' }); + await db.crateOwnership.create({ crate, user }); - let team = db.team.create(); - db.crateOwnership.create({ crate, team }); + let team = await db.team.create(); + await db.crateOwnership.create({ crate, team }); let body = JSON.stringify({ owners: [team.login] }); let response = await fetch('/api/v1/crates/foo/owners', { method: 'DELETE', body }); assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { ok: true, msg: 'owners successfully removed' }); - let owners = db.crateOwnership.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let owners = db.crateOwnership.findMany(q => q.where({ crate: { id: crate.id } })); assert.strictEqual(owners.length, 1); assert.strictEqual(owners[0].user.id, user.id); assert.strictEqual(owners[0].team, null); - let invites = db.crateOwnerInvitation.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let invites = db.crateOwnerInvitation.findMany(q => q.where({ crate: { id: crate.id } })); assert.strictEqual(invites.length, 0); }); test('can remove multiple owners', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - let crate = db.crate.create({ name: 'foo' }); - db.crateOwnership.create({ crate, user }); + let crate = await db.crate.create({ name: 'foo' }); + await db.crateOwnership.create({ crate, user }); - let team = db.team.create(); - db.crateOwnership.create({ crate, team }); + let team = await db.team.create(); + await db.crateOwnership.create({ crate, team }); - let user2 = db.user.create(); - db.crateOwnership.create({ crate, user: user2 }); + let user2 = await db.user.create(); + await db.crateOwnership.create({ crate, user: user2 }); let body = JSON.stringify({ owners: [user2.login, team.login] }); let response = await fetch('/api/v1/crates/foo/owners', { method: 'DELETE', body }); assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { ok: true, msg: 'owners successfully removed' }); - let owners = db.crateOwnership.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let owners = db.crateOwnership.findMany(q => q.where({ crate: { id: crate.id } })); assert.strictEqual(owners.length, 1); assert.strictEqual(owners[0].user.id, user.id); assert.strictEqual(owners[0].team, null); - let invites = db.crateOwnerInvitation.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let invites = db.crateOwnerInvitation.findMany(q => q.where({ crate: { id: crate.id } })); assert.strictEqual(invites.length, 0); }); diff --git a/packages/crates-io-msw/handlers/crates/reverse-dependencies.js b/packages/crates-io-msw/handlers/crates/reverse-dependencies.js index 4925fbbdb82..458b05e8c85 100644 --- a/packages/crates-io-msw/handlers/crates/reverse-dependencies.js +++ b/packages/crates-io-msw/handlers/crates/reverse-dependencies.js @@ -6,13 +6,12 @@ import { serializeVersion } from '../../serializers/version.js'; import { notFound, pageParams } from '../../utils/handlers.js'; export default http.get('/api/v1/crates/:name/reverse_dependencies', async ({ request, params }) => { - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) return notFound(); let { start, end } = pageParams(request); - let allDependencies = db.dependency.findMany({ - where: { crate: { id: { equals: crate.id } } }, + let allDependencies = db.dependency.findMany(q => q.where(dep => dep.crate.id === crate.id), { orderBy: { version: { crate: { downloads: 'desc' } } }, }); diff --git a/packages/crates-io-msw/handlers/crates/reverse-dependencies.test.js b/packages/crates-io-msw/handlers/crates/reverse-dependencies.test.js index 57a3eac95d1..896637e797c 100644 --- a/packages/crates-io-msw/handlers/crates/reverse-dependencies.test.js +++ b/packages/crates-io-msw/handlers/crates/reverse-dependencies.test.js @@ -9,7 +9,7 @@ test('returns 404 for unknown crates', async function () { }); test('empty case', async function () { - db.crate.create({ name: 'rand' }); + await db.crate.create({ name: 'rand' }); let response = await fetch('/api/v1/crates/rand/reverse_dependencies'); assert.strictEqual(response.status, 200); @@ -23,19 +23,19 @@ test('empty case', async function () { }); test('returns a paginated list of crate versions depending to the specified crate', async function () { - let crate = db.crate.create({ name: 'foo' }); + let crate = await db.crate.create({ name: 'foo' }); - db.dependency.create({ + await db.dependency.create({ crate, - version: db.version.create({ - crate: db.crate.create({ name: 'bar' }), + version: await db.version.create({ + crate: await db.crate.create({ name: 'bar' }), }), }); - db.dependency.create({ + await db.dependency.create({ crate, - version: db.version.create({ - crate: db.crate.create({ name: 'baz' }), + version: await db.version.create({ + crate: await db.crate.create({ name: 'baz' }), }), }); @@ -156,14 +156,13 @@ test('returns a paginated list of crate versions depending to the specified crat }); test('never returns more than 10 results', async function () { - let crate = db.crate.create({ name: 'foo' }); - - Array.from({ length: 25 }, () => - db.dependency.create({ - crate, - version: db.version.create({ - crate: db.crate.create({ name: 'bar' }), - }), + let crate = await db.crate.create({ name: 'foo' }); + + await Promise.all( + Array.from({ length: 25 }, async () => { + const depCrate = await db.crate.create({ name: 'bar' }); + const version = await db.version.create({ crate: depCrate }); + return db.dependency.create({ crate, version }); }), ); @@ -177,13 +176,13 @@ test('never returns more than 10 results', async function () { }); test('supports `page` and `per_page` parameters', async function () { - let crate = db.crate.create({ name: 'foo' }); + let crate = await db.crate.create({ name: 'foo' }); - let crates = Array.from({ length: 25 }, (_, i) => - db.crate.create({ name: `crate-${String(i + 1).padStart(2, '0')}` }), + let crates = await Promise.all( + Array.from({ length: 25 }, (_, i) => db.crate.create({ name: `crate-${String(i + 1).padStart(2, '0')}` })), ); - let versions = crates.map(crate => db.version.create({ crate })); - versions.forEach(version => db.dependency.create({ crate, version })); + let versions = await Promise.all(crates.map(crate => db.version.create({ crate }))); + await Promise.all(versions.map(version => db.dependency.create({ crate, version }))); let response = await fetch('/api/v1/crates/foo/reverse_dependencies?page=2&per_page=5'); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/crates/team-owners.js b/packages/crates-io-msw/handlers/crates/team-owners.js index d5c30c76558..64fd5ae1713 100644 --- a/packages/crates-io-msw/handlers/crates/team-owners.js +++ b/packages/crates-io-msw/handlers/crates/team-owners.js @@ -5,12 +5,12 @@ import { serializeTeam } from '../../serializers/team.js'; import { notFound } from '../../utils/handlers.js'; export default http.get('/api/v1/crates/:name/owner_team', async ({ params }) => { - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) { return notFound(); } - let ownerships = db.crateOwnership.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let ownerships = db.crateOwnership.findMany(q => q.where(ownership => ownership.crate.id === crate.id)); return HttpResponse.json({ teams: ownerships.filter(o => o.team).map(o => ({ ...serializeTeam(o.team), kind: 'team' })), diff --git a/packages/crates-io-msw/handlers/crates/team-owners.test.js b/packages/crates-io-msw/handlers/crates/team-owners.test.js index 25a9981aff5..8d15130c647 100644 --- a/packages/crates-io-msw/handlers/crates/team-owners.test.js +++ b/packages/crates-io-msw/handlers/crates/team-owners.test.js @@ -9,7 +9,7 @@ test('returns 404 for unknown crates', async function () { }); test('empty case', async function () { - db.crate.create({ name: 'rand' }); + await db.crate.create({ name: 'rand' }); let response = await fetch('/api/v1/crates/rand/owner_team'); assert.strictEqual(response.status, 200); @@ -19,9 +19,9 @@ test('empty case', async function () { }); test('returns the list of teams that own the specified crate', async function () { - let team = db.team.create({ name: 'maintainers' }); - let crate = db.crate.create({ name: 'rand' }); - db.crateOwnership.create({ crate, team }); + let team = await db.team.create({ name: 'maintainers' }); + let crate = await db.crate.create({ name: 'rand' }); + await db.crateOwnership.create({ crate, team }); let response = await fetch('/api/v1/crates/rand/owner_team'); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/crates/unfollow.js b/packages/crates-io-msw/handlers/crates/unfollow.js index 2701fc61b5d..c213951ea73 100644 --- a/packages/crates-io-msw/handlers/crates/unfollow.js +++ b/packages/crates-io-msw/handlers/crates/unfollow.js @@ -10,15 +10,14 @@ export default http.delete('/api/v1/crates/:name/follow', async ({ params }) => return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 }); } - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) { return notFound(); } - db.user.update({ - where: { id: { equals: user.id } }, - data: { - followedCrates: user.followedCrates.filter(c => c.id !== crate.id), + await db.user.update(q => q.where({ id: user.id }), { + data(user) { + user.followedCrates = user.followedCrates.filter(c => c.id !== crate.id); }, }); diff --git a/packages/crates-io-msw/handlers/crates/unfollow.test.js b/packages/crates-io-msw/handlers/crates/unfollow.test.js index 2ca9621ab4b..e018cc0f647 100644 --- a/packages/crates-io-msw/handlers/crates/unfollow.test.js +++ b/packages/crates-io-msw/handlers/crates/unfollow.test.js @@ -11,8 +11,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 404 for unknown crates', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/follow', { method: 'DELETE' }); assert.strictEqual(response.status, 404); @@ -20,17 +20,18 @@ test('returns 404 for unknown crates', async function () { }); test('makes the authenticated user unfollow the crate', async function () { - let crate = db.crate.create({ name: 'rand' }); + let crate = await db.crate.create({ name: 'rand' }); - let user = db.user.create({ followedCrates: [crate] }); - db.mswSession.create({ user }); + let user = await db.user.create({ followedCrates: [crate] }); + await db.mswSession.create({ user }); - assert.deepEqual(user.followedCrates, [crate]); + assert.equal(user.followedCrates.length, 1); + assert.equal(user.followedCrates[0].name, crate.name); let response = await fetch('/api/v1/crates/rand/follow', { method: 'DELETE' }); assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { ok: true }); - user = db.user.findFirst({ where: { id: user.id } }); + user = db.user.findFirst(q => q.where({ id: user.id })); assert.deepEqual(user.followedCrates, []); }); diff --git a/packages/crates-io-msw/handlers/crates/user-owners.js b/packages/crates-io-msw/handlers/crates/user-owners.js index 1182cdba937..a28e76e38e9 100644 --- a/packages/crates-io-msw/handlers/crates/user-owners.js +++ b/packages/crates-io-msw/handlers/crates/user-owners.js @@ -5,12 +5,12 @@ import { serializeUser } from '../../serializers/user.js'; import { notFound } from '../../utils/handlers.js'; export default http.get('/api/v1/crates/:name/owner_user', async ({ params }) => { - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) { return notFound(); } - let ownerships = db.crateOwnership.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let ownerships = db.crateOwnership.findMany(q => q.where(ownership => ownership.crate.id === crate.id)); return HttpResponse.json({ users: ownerships.filter(o => o.user).map(o => ({ ...serializeUser(o.user), kind: 'user' })), diff --git a/packages/crates-io-msw/handlers/crates/user-owners.test.js b/packages/crates-io-msw/handlers/crates/user-owners.test.js index e5426153674..c763ddd3de8 100644 --- a/packages/crates-io-msw/handlers/crates/user-owners.test.js +++ b/packages/crates-io-msw/handlers/crates/user-owners.test.js @@ -9,7 +9,7 @@ test('returns 404 for unknown crates', async function () { }); test('empty case', async function () { - db.crate.create({ name: 'rand' }); + await db.crate.create({ name: 'rand' }); let response = await fetch('/api/v1/crates/rand/owner_user'); assert.strictEqual(response.status, 200); @@ -19,9 +19,9 @@ test('empty case', async function () { }); test('returns the list of users that own the specified crate', async function () { - let user = db.user.create({ name: 'John Doe' }); - let crate = db.crate.create({ name: 'rand' }); - db.crateOwnership.create({ crate, user }); + let user = await db.user.create({ name: 'John Doe' }); + let crate = await db.crate.create({ name: 'rand' }); + await db.crateOwnership.create({ crate, user }); let response = await fetch('/api/v1/crates/rand/owner_user'); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/invites/legacy-list.js b/packages/crates-io-msw/handlers/invites/legacy-list.js index 6f70f2a9f85..17d23f94ce7 100644 --- a/packages/crates-io-msw/handlers/invites/legacy-list.js +++ b/packages/crates-io-msw/handlers/invites/legacy-list.js @@ -11,7 +11,7 @@ export default http.get('/api/v1/me/crate_owner_invitations', () => { return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 }); } - let invites = db.crateOwnerInvitation.findMany({ where: { invitee: { id: { equals: user.id } } } }); + let invites = db.crateOwnerInvitation.findMany(q => q.where(invite => invite.invitee.id === user.id)); let inviters = invites.map(invite => invite.inviter); let invitees = invites.map(invite => invite.invitee); diff --git a/packages/crates-io-msw/handlers/invites/legacy-list.test.js b/packages/crates-io-msw/handlers/invites/legacy-list.test.js index 91e7b4c768e..75d79c31ac8 100644 --- a/packages/crates-io-msw/handlers/invites/legacy-list.test.js +++ b/packages/crates-io-msw/handlers/invites/legacy-list.test.js @@ -3,8 +3,8 @@ import { assert, test } from 'vitest'; import { db } from '../../index.js'; test('empty case', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/me/crate_owner_invitations'); assert.strictEqual(response.status, 200); @@ -12,25 +12,25 @@ test('empty case', async function () { }); test('returns the list of invitations for the authenticated user', async function () { - let nanomsg = db.crate.create({ name: 'nanomsg' }); - db.version.create({ crate: nanomsg }); + let nanomsg = await db.crate.create({ name: 'nanomsg' }); + await db.version.create({ crate: nanomsg }); - let ember = db.crate.create({ name: 'ember-rs' }); - db.version.create({ crate: ember }); + let ember = await db.crate.create({ name: 'ember-rs' }); + await db.version.create({ crate: ember }); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - let inviter = db.user.create({ name: 'janed' }); - db.crateOwnerInvitation.create({ + let inviter = await db.user.create({ name: 'janed' }); + await db.crateOwnerInvitation.create({ crate: nanomsg, createdAt: '2016-12-24T12:34:56Z', invitee: user, inviter, }); - let inviter2 = db.user.create({ name: 'wycats' }); - db.crateOwnerInvitation.create({ + let inviter2 = await db.user.create({ name: 'wycats' }); + await db.crateOwnerInvitation.create({ crate: ember, createdAt: '2020-12-31T12:34:56Z', invitee: user, diff --git a/packages/crates-io-msw/handlers/invites/list.js b/packages/crates-io-msw/handlers/invites/list.js index 257832f457f..3c95667fd2e 100644 --- a/packages/crates-io-msw/handlers/invites/list.js +++ b/packages/crates-io-msw/handlers/invites/list.js @@ -16,17 +16,17 @@ export default http.get('/api/private/crate_owner_invitations', ({ request }) => let invites; if (url.searchParams.has('crate_name')) { - let crate = db.crate.findFirst({ where: { name: { equals: url.searchParams.get('crate_name') } } }); + let crate = db.crate.findFirst(q => q.where({ name: url.searchParams.get('crate_name') })); if (!crate) return notFound(); - invites = db.crateOwnerInvitation.findMany({ where: { crate: { id: { equals: crate.id } } } }); + invites = db.crateOwnerInvitation.findMany(q => q.where(invite => invite.crate.id === crate.id)); } else if (url.searchParams.has('invitee_id')) { let inviteeId = parseInt(url.searchParams.get('invitee_id')); if (inviteeId !== user.id) { return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 }); } - invites = db.crateOwnerInvitation.findMany({ where: { invitee: { id: { equals: inviteeId } } } }); + invites = db.crateOwnerInvitation.findMany(q => q.where(invite => invite.invitee.id === inviteeId)); } else { return HttpResponse.json({ errors: [{ detail: 'missing or invalid filter' }] }, { status: 400 }); } diff --git a/packages/crates-io-msw/handlers/invites/list.test.js b/packages/crates-io-msw/handlers/invites/list.test.js index 551bcd05903..15d3b983639 100644 --- a/packages/crates-io-msw/handlers/invites/list.test.js +++ b/packages/crates-io-msw/handlers/invites/list.test.js @@ -3,25 +3,25 @@ import { assert, test } from 'vitest'; import { db } from '../../index.js'; test('happy path (invitee_id)', async function () { - let nanomsg = db.crate.create({ name: 'nanomsg' }); - db.version.create({ crate: nanomsg }); + let nanomsg = await db.crate.create({ name: 'nanomsg' }); + await db.version.create({ crate: nanomsg }); - let ember = db.crate.create({ name: 'ember-rs' }); - db.version.create({ crate: ember }); + let ember = await db.crate.create({ name: 'ember-rs' }); + await db.version.create({ crate: ember }); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - let inviter = db.user.create({ name: 'janed' }); - db.crateOwnerInvitation.create({ + let inviter = await db.user.create({ name: 'janed' }); + await db.crateOwnerInvitation.create({ crate: nanomsg, createdAt: '2016-12-24T12:34:56Z', invitee: user, inviter, }); - let inviter2 = db.user.create({ name: 'wycats' }); - db.crateOwnerInvitation.create({ + let inviter2 = await db.user.create({ name: 'wycats' }); + await db.crateOwnerInvitation.create({ crate: ember, createdAt: '2020-12-31T12:34:56Z', invitee: user, @@ -79,8 +79,8 @@ test('happy path (invitee_id)', async function () { }); test('happy path with empty response (invitee_id)', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch(`/api/private/crate_owner_invitations?invitee_id=${user.id}`); assert.strictEqual(response.status, 200); @@ -94,15 +94,15 @@ test('happy path with empty response (invitee_id)', async function () { }); test('happy path with pagination (invitee_id)', async function () { - let inviter = db.user.create(); + let inviter = await db.user.create(); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); for (let i = 0; i < 15; i++) { - let crate = db.crate.create(); - db.version.create({ crate }); - db.crateOwnerInvitation.create({ crate, invitee: user, inviter }); + let crate = await db.crate.create(); + await db.version.create({ crate }); + await db.crateOwnerInvitation.create({ crate, invitee: user, inviter }); } let response = await fetch(`/api/private/crate_owner_invitations?invitee_id=${user.id}`); @@ -119,25 +119,25 @@ test('happy path with pagination (invitee_id)', async function () { }); test('happy path (crate_name)', async function () { - let nanomsg = db.crate.create({ name: 'nanomsg' }); - db.version.create({ crate: nanomsg }); + let nanomsg = await db.crate.create({ name: 'nanomsg' }); + await db.version.create({ crate: nanomsg }); - let ember = db.crate.create({ name: 'ember-rs' }); - db.version.create({ crate: ember }); + let ember = await db.crate.create({ name: 'ember-rs' }); + await db.version.create({ crate: ember }); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - let inviter = db.user.create({ name: 'janed' }); - db.crateOwnerInvitation.create({ + let inviter = await db.user.create({ name: 'janed' }); + await db.crateOwnerInvitation.create({ crate: nanomsg, createdAt: '2016-12-24T12:34:56Z', invitee: user, inviter, }); - let inviter2 = db.user.create({ name: 'wycats' }); - db.crateOwnerInvitation.create({ + let inviter2 = await db.user.create({ name: 'wycats' }); + await db.crateOwnerInvitation.create({ crate: ember, createdAt: '2020-12-31T12:34:56Z', invitee: user, @@ -188,8 +188,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 400 if query params are missing', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch(`/api/private/crate_owner_invitations`); assert.strictEqual(response.status, 400); @@ -199,8 +199,8 @@ test('returns 400 if query params are missing', async function () { }); test("returns 404 if crate can't be found", async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch(`/api/private/crate_owner_invitations?crate_name=foo`); assert.strictEqual(response.status, 404); @@ -210,8 +210,8 @@ test("returns 404 if crate can't be found", async function () { }); test('returns 403 if requesting for other user', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch(`/api/private/crate_owner_invitations?invitee_id=${user.id + 1}`); assert.strictEqual(response.status, 403); diff --git a/packages/crates-io-msw/handlers/invites/redeem-by-crate-id.js b/packages/crates-io-msw/handlers/invites/redeem-by-crate-id.js index 61837c62252..23d95004ac3 100644 --- a/packages/crates-io-msw/handlers/invites/redeem-by-crate-id.js +++ b/packages/crates-io-msw/handlers/invites/redeem-by-crate-id.js @@ -13,19 +13,16 @@ export default http.put('/api/v1/me/crate_owner_invitations/:crate_id', async ({ let body = await request.json(); let { accepted, crate_id: crateId } = body.crate_owner_invite; - let invite = db.crateOwnerInvitation.findFirst({ - where: { - crate: { id: { equals: parseInt(crateId) } }, - invitee: { id: { equals: user.id } }, - }, - }); + let invite = db.crateOwnerInvitation.findFirst(q => + q.where(invite => invite.crate.id === parseInt(crateId) && invite.invitee.id === user.id), + ); if (!invite) return notFound(); if (accepted) { - db.crateOwnership.create({ crate: invite.crate, user }); + await db.crateOwnership.create({ crate: invite.crate, user }); } - db.crateOwnerInvitation.delete({ where: { id: invite.id } }); + db.crateOwnerInvitation.delete(q => q.where({ id: invite.id })); return HttpResponse.json({ crate_owner_invitation: { crate_id: crateId, accepted } }); }); diff --git a/packages/crates-io-msw/handlers/invites/redeem-by-crate-id.test.js b/packages/crates-io-msw/handlers/invites/redeem-by-crate-id.test.js index 32ec482ebb9..398f011b855 100644 --- a/packages/crates-io-msw/handlers/invites/redeem-by-crate-id.test.js +++ b/packages/crates-io-msw/handlers/invites/redeem-by-crate-id.test.js @@ -5,18 +5,18 @@ import { db } from '../../index.js'; let test = _test.extend({ // eslint-disable-next-line no-empty-pattern serde: async ({}, use) => { - let serde = db.crate.create({ name: 'serde' }); - db.version.create({ crate: serde }); + let serde = await db.crate.create({ name: 'serde' }); + await db.version.create({ crate: serde }); await use(serde); }, }); test('can accept an invitation', async function ({ serde }) { - let inviter = db.user.create(); - let invitee = db.user.create(); - db.mswSession.create({ user: invitee }); + let inviter = await db.user.create(); + let invitee = await db.user.create(); + await db.mswSession.create({ user: invitee }); - db.crateOwnerInvitation.create({ crate: serde, invitee, inviter }); + await db.crateOwnerInvitation.create({ crate: serde, invitee, inviter }); let body = JSON.stringify({ crate_owner_invite: { crate_id: serde.id, accepted: true } }); let response = await fetch('/api/v1/me/crate_owner_invitations/serde', { method: 'PUT', body }); @@ -28,18 +28,20 @@ test('can accept an invitation', async function ({ serde }) { }, }); - let invites = db.crateOwnerInvitation.findMany({ where: { crate: { id: serde.id }, invitee: { id: invitee.id } } }); + let invites = db.crateOwnerInvitation.findMany(q => + q.where({ crate: { id: serde.id }, invitee: { id: invitee.id } }), + ); assert.strictEqual(invites.length, 0); - let owners = db.crateOwnership.findMany({ where: { crate: { id: serde.id }, user: { id: invitee.id } } }); + let owners = db.crateOwnership.findMany(q => q.where({ crate: { id: serde.id }, user: { id: invitee.id } })); assert.strictEqual(owners.length, 1); }); test('can decline an invitation', async function ({ serde }) { - let inviter = db.user.create(); - let invitee = db.user.create(); - db.mswSession.create({ user: invitee }); + let inviter = await db.user.create(); + let invitee = await db.user.create(); + await db.mswSession.create({ user: invitee }); - db.crateOwnerInvitation.create({ crate: serde, invitee, inviter }); + await db.crateOwnerInvitation.create({ crate: serde, invitee, inviter }); let body = JSON.stringify({ crate_owner_invite: { crate_id: serde.id, accepted: false } }); let response = await fetch('/api/v1/me/crate_owner_invitations/serde', { method: 'PUT', body }); @@ -51,15 +53,17 @@ test('can decline an invitation', async function ({ serde }) { }, }); - let invites = db.crateOwnerInvitation.findMany({ where: { crate: { id: serde.id }, invitee: { id: invitee.id } } }); + let invites = db.crateOwnerInvitation.findMany(q => + q.where({ crate: { id: serde.id }, invitee: { id: invitee.id } }), + ); assert.strictEqual(invites.length, 0); - let owners = db.crateOwnership.findMany({ where: { crate: { id: serde.id }, user: { id: invitee.id } } }); + let owners = db.crateOwnership.findMany(q => q.where({ crate: { id: serde.id }, user: { id: invitee.id } })); assert.strictEqual(owners.length, 0); }); test('returns 404 if invite does not exist', async function ({ serde }) { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let body = JSON.stringify({ crate_owner_invite: { crate_id: serde.id, accepted: true } }); let response = await fetch('/api/v1/me/crate_owner_invitations/serde', { method: 'PUT', body }); @@ -67,11 +71,11 @@ test('returns 404 if invite does not exist', async function ({ serde }) { }); test('returns 404 if invite is for another user', async function ({ serde }) { - let inviter = db.user.create(); - let invitee = db.user.create(); - db.mswSession.create({ user: inviter }); + let inviter = await db.user.create(); + let invitee = await db.user.create(); + await db.mswSession.create({ user: inviter }); - db.crateOwnerInvitation.create({ crate: serde, invitee, inviter }); + await db.crateOwnerInvitation.create({ crate: serde, invitee, inviter }); let body = JSON.stringify({ crate_owner_invite: { crate_id: serde.id, accepted: true } }); let response = await fetch('/api/v1/me/crate_owner_invitations/serde', { method: 'PUT', body }); diff --git a/packages/crates-io-msw/handlers/invites/redeem-by-token.js b/packages/crates-io-msw/handlers/invites/redeem-by-token.js index 98df6daa60b..5bfeee116af 100644 --- a/packages/crates-io-msw/handlers/invites/redeem-by-token.js +++ b/packages/crates-io-msw/handlers/invites/redeem-by-token.js @@ -6,11 +6,11 @@ import { notFound } from '../../utils/handlers.js'; export default http.put('/api/v1/me/crate_owner_invitations/accept/:token', async ({ params }) => { let { token } = params; - let invite = db.crateOwnerInvitation.findFirst({ where: { token: { equals: token } } }); + let invite = db.crateOwnerInvitation.findFirst(q => q.where({ token })); if (!invite) return notFound(); - db.crateOwnership.create({ crate: invite.crate, user: invite.invitee }); - db.crateOwnerInvitation.delete({ where: { id: invite.id } }); + await db.crateOwnership.create({ crate: invite.crate, user: invite.invitee }); + db.crateOwnerInvitation.delete(q => q.where({ id: invite.id })); return HttpResponse.json({ crate_owner_invitation: { crate_id: invite.crate.id, accepted: true } }); }); diff --git a/packages/crates-io-msw/handlers/invites/redeem-by-token.test.js b/packages/crates-io-msw/handlers/invites/redeem-by-token.test.js index c8cd870d2b8..c11ff9b2c6c 100644 --- a/packages/crates-io-msw/handlers/invites/redeem-by-token.test.js +++ b/packages/crates-io-msw/handlers/invites/redeem-by-token.test.js @@ -3,14 +3,14 @@ import { assert, test } from 'vitest'; import { db } from '../../index.js'; test('can accept an invitation', async function () { - let serde = db.crate.create({ name: 'serde' }); - db.version.create({ crate: serde }); + let serde = await db.crate.create({ name: 'serde' }); + await db.version.create({ crate: serde }); - let inviter = db.user.create(); - let invitee = db.user.create(); - db.mswSession.create({ user: invitee }); + let inviter = await db.user.create(); + let invitee = await db.user.create(); + await db.mswSession.create({ user: invitee }); - let invite = db.crateOwnerInvitation.create({ crate: serde, invitee, inviter }); + let invite = await db.crateOwnerInvitation.create({ crate: serde, invitee, inviter }); let response = await fetch(`/api/v1/me/crate_owner_invitations/accept/${invite.token}`, { method: 'PUT' }); assert.strictEqual(response.status, 200); @@ -21,15 +21,17 @@ test('can accept an invitation', async function () { }, }); - let invites = db.crateOwnerInvitation.findMany({ where: { crate: { id: serde.id }, invitee: { id: invitee.id } } }); + let invites = db.crateOwnerInvitation.findMany(q => + q.where({ crate: { id: serde.id }, invitee: { id: invitee.id } }), + ); assert.strictEqual(invites.length, 0); - let owners = db.crateOwnership.findMany({ where: { crate: { id: serde.id }, user: { id: invitee.id } } }); + let owners = db.crateOwnership.findMany(q => q.where({ crate: { id: serde.id }, user: { id: invitee.id } })); assert.strictEqual(owners.length, 1); }); test('returns 404 if invite does not exist', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/me/crate_owner_invitations/accept/secret-token', { method: 'PUT' }); assert.strictEqual(response.status, 404); diff --git a/packages/crates-io-msw/handlers/keywords/get.js b/packages/crates-io-msw/handlers/keywords/get.js index 8432e00d650..b280453ef5f 100644 --- a/packages/crates-io-msw/handlers/keywords/get.js +++ b/packages/crates-io-msw/handlers/keywords/get.js @@ -6,7 +6,7 @@ import { notFound } from '../../utils/handlers.js'; export default http.get('/api/v1/keywords/:keyword_id', ({ params }) => { let keywordId = params.keyword_id; - let keyword = db.keyword.findFirst({ where: { id: { equals: keywordId } } }); + let keyword = db.keyword.findFirst(q => q.where({ id: keywordId })); if (!keyword) { return notFound(); } diff --git a/packages/crates-io-msw/handlers/keywords/get.test.js b/packages/crates-io-msw/handlers/keywords/get.test.js index 7e7c501bebe..2caaf3390de 100644 --- a/packages/crates-io-msw/handlers/keywords/get.test.js +++ b/packages/crates-io-msw/handlers/keywords/get.test.js @@ -9,7 +9,7 @@ test('returns 404 for unknown keywords', async function () { }); test('returns a keyword object for known keywords', async function () { - db.keyword.create({ keyword: 'cli' }); + await db.keyword.create({ keyword: 'cli' }); let response = await fetch('/api/v1/keywords/cli'); assert.strictEqual(response.status, 200); @@ -23,18 +23,18 @@ test('returns a keyword object for known keywords', async function () { }); test('calculates `crates_cnt` correctly', async function () { - let cli = db.keyword.create({ keyword: 'cli' }); - Array.from({ length: 7 }, () => db.crate.create({ keywords: [cli] })); - let notCli = db.keyword.create({ keyword: 'not-cli' }); - Array.from({ length: 3 }, () => db.crate.create({ keywords: [notCli] })); + let testKeyword = await db.keyword.create({ keyword: 'test-cli-keyword' }); + await Promise.all(Array.from({ length: 7 }, () => db.crate.create({ keywords: [testKeyword] }))); + let notTestKeyword = await db.keyword.create({ keyword: 'not-test-cli' }); + await Promise.all(Array.from({ length: 3 }, () => db.crate.create({ keywords: [notTestKeyword] }))); - let response = await fetch('/api/v1/keywords/cli'); + let response = await fetch('/api/v1/keywords/test-cli-keyword'); assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { keyword: { - id: 'cli', + id: 'test-cli-keyword', crates_cnt: 7, - keyword: 'cli', + keyword: 'test-cli-keyword', }, }); }); diff --git a/packages/crates-io-msw/handlers/keywords/list.js b/packages/crates-io-msw/handlers/keywords/list.js index 07b750919e0..3d98f647cce 100644 --- a/packages/crates-io-msw/handlers/keywords/list.js +++ b/packages/crates-io-msw/handlers/keywords/list.js @@ -7,7 +7,7 @@ import { pageParams } from '../../utils/handlers.js'; export default http.get('/api/v1/keywords', ({ request }) => { let { skip, take } = pageParams(request); - let keywords = db.keyword.findMany({ skip, take, orderBy: { crates_cnt: 'desc' } }); + let keywords = db.keyword.findMany(null, { skip, take, orderBy: { crates_cnt: 'desc' } }); let total = db.keyword.count(); return HttpResponse.json({ keywords: keywords.map(k => serializeKeyword(k)), meta: { total } }); diff --git a/packages/crates-io-msw/handlers/keywords/list.test.js b/packages/crates-io-msw/handlers/keywords/list.test.js index a127b087ea7..fec4444fdbd 100644 --- a/packages/crates-io-msw/handlers/keywords/list.test.js +++ b/packages/crates-io-msw/handlers/keywords/list.test.js @@ -14,8 +14,8 @@ test('empty case', async function () { }); test('returns a paginated keywords list', async function () { - db.keyword.create({ keyword: 'api' }); - Array.from({ length: 2 }, () => db.keyword.create()); + await db.keyword.create({ keyword: 'api' }); + await Promise.all(Array.from({ length: 2 }, () => db.keyword.create())); let response = await fetch('/api/v1/keywords'); assert.strictEqual(response.status, 200); @@ -44,7 +44,7 @@ test('returns a paginated keywords list', async function () { }); test('never returns more than 10 results', async function () { - Array.from({ length: 25 }, () => db.keyword.create()); + await Promise.all(Array.from({ length: 25 }, () => db.keyword.create())); let response = await fetch('/api/v1/keywords'); assert.strictEqual(response.status, 200); @@ -55,7 +55,9 @@ test('never returns more than 10 results', async function () { }); test('supports `page` and `per_page` parameters', async function () { - Array.from({ length: 25 }, (_, i) => db.keyword.create({ keyword: `k${String(i + 1).padStart(2, '0')}` })); + await Promise.all( + Array.from({ length: 25 }, (_, i) => db.keyword.create({ keyword: `k${String(i + 1).padStart(2, '0')}` })), + ); let response = await fetch('/api/v1/keywords?page=2&per_page=5'); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/sessions/delete.js b/packages/crates-io-msw/handlers/sessions/delete.js index 343be4a7437..899b64e237b 100644 --- a/packages/crates-io-msw/handlers/sessions/delete.js +++ b/packages/crates-io-msw/handlers/sessions/delete.js @@ -3,6 +3,6 @@ import { http, HttpResponse } from 'msw'; import { db } from '../../index.js'; export default http.delete('/api/private/session', () => { - db.mswSession.deleteMany({}); + db.mswSession.deleteMany(null); return HttpResponse.json({ ok: true }); }); diff --git a/packages/crates-io-msw/handlers/sessions/delete.test.js b/packages/crates-io-msw/handlers/sessions/delete.test.js index ea79f9a4ddf..2658dae8b2e 100644 --- a/packages/crates-io-msw/handlers/sessions/delete.test.js +++ b/packages/crates-io-msw/handlers/sessions/delete.test.js @@ -3,14 +3,14 @@ import { assert, test } from 'vitest'; import { db } from '../../index.js'; test('returns 200 when authenticated', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/private/session', { method: 'DELETE' }); assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { ok: true }); - assert.notOk(db.mswSession.findFirst({})); + assert.notOk(db.mswSession.findFirst(null)); }); test('returns 200 when unauthenticated', async function () { @@ -18,5 +18,5 @@ test('returns 200 when unauthenticated', async function () { assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { ok: true }); - assert.notOk(db.mswSession.findFirst({})); + assert.notOk(db.mswSession.findFirst(null)); }); diff --git a/packages/crates-io-msw/handlers/summary.js b/packages/crates-io-msw/handlers/summary.js index caf818f0b80..a9b5cae268c 100644 --- a/packages/crates-io-msw/handlers/summary.js +++ b/packages/crates-io-msw/handlers/summary.js @@ -8,7 +8,7 @@ import { compareDates } from '../utils/dates.js'; export default [ http.get('/api/v1/summary', () => { - let crates = db.crate.findMany({}); + let crates = db.crate.findMany(null); let just_updated = crates.sort((a, b) => compareDates(b.updated_at, a.updated_at)).slice(0, 10); let most_downloaded = crates.sort((a, b) => b.downloads - a.downloads).slice(0, 10); @@ -18,8 +18,8 @@ export default [ let num_crates = crates.length; let num_downloads = crates.reduce((sum, crate) => sum + crate.downloads, 0); - let popularCategories = db.category.findMany({ take: 10 }); - let popularKeywords = db.keyword.findMany({ take: 10 }); + let popularCategories = db.category.findMany(null, { take: 10 }); + let popularKeywords = db.keyword.findMany(null, { take: 10 }); return HttpResponse.json({ just_updated: just_updated.map(c => serializeCrate(c)), diff --git a/packages/crates-io-msw/handlers/summary.test.js b/packages/crates-io-msw/handlers/summary.test.js index 243ab55f58f..9feef67affe 100644 --- a/packages/crates-io-msw/handlers/summary.test.js +++ b/packages/crates-io-msw/handlers/summary.test.js @@ -18,10 +18,10 @@ test('empty case', async function () { }); test('returns the data for the front page', async function () { - Array.from({ length: 15 }, () => db.category.create()); - Array.from({ length: 25 }, () => db.keyword.create()); - let crates = Array.from({ length: 20 }, () => db.crate.create()); - crates.forEach(crate => db.version.create({ crate })); + await Promise.all(Array.from({ length: 15 }, () => db.category.create())); + await Promise.all(Array.from({ length: 25 }, () => db.keyword.create())); + let crates = await Promise.all(Array.from({ length: 20 }, () => db.crate.create())); + await Promise.all(crates.map(crate => db.version.create({ crate }))); let response = await fetch('/api/v1/summary'); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/teams/get.js b/packages/crates-io-msw/handlers/teams/get.js index 8fb593aa11f..1b6d58e50ae 100644 --- a/packages/crates-io-msw/handlers/teams/get.js +++ b/packages/crates-io-msw/handlers/teams/get.js @@ -6,7 +6,7 @@ import { notFound } from '../../utils/handlers.js'; export default http.get('/api/v1/teams/:team_id', ({ params }) => { let login = params.team_id; - let team = db.team.findFirst({ where: { login: { equals: login } } }); + let team = db.team.findFirst(q => q.where({ login })); if (!team) { return notFound(); } diff --git a/packages/crates-io-msw/handlers/teams/get.test.js b/packages/crates-io-msw/handlers/teams/get.test.js index 7e164e26f74..1046ee20433 100644 --- a/packages/crates-io-msw/handlers/teams/get.test.js +++ b/packages/crates-io-msw/handlers/teams/get.test.js @@ -9,7 +9,7 @@ test('returns 404 for unknown teams', async function () { }); test('returns a team object for known teams', async function () { - let team = db.team.create({ name: 'maintainers' }); + let team = await db.team.create({ name: 'maintainers' }); let response = await fetch(`/api/v1/teams/${team.login}`); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/trustpub/github-configs/create.js b/packages/crates-io-msw/handlers/trustpub/github-configs/create.js index 1e6a7e02a23..1c46399b3cf 100644 --- a/packages/crates-io-msw/handlers/trustpub/github-configs/create.js +++ b/packages/crates-io-msw/handlers/trustpub/github-configs/create.js @@ -23,16 +23,13 @@ export default http.post('/api/v1/trusted_publishing/github_configs', async ({ r return HttpResponse.json({ errors: [{ detail: 'missing required fields' }] }, { status: 400 }); } - let crate = db.crate.findFirst({ where: { name: { equals: crateName } } }); + let crate = db.crate.findFirst(q => q.where({ name: crateName })); if (!crate) return notFound(); // Check if the user is an owner of the crate - let isOwner = db.crateOwnership.findFirst({ - where: { - crate: { id: { equals: crate.id } }, - user: { id: { equals: user.id } }, - }, - }); + let isOwner = db.crateOwnership.findFirst(q => + q.where(ownership => ownership.crate.id === crate.id && ownership.user?.id === user.id), + ); if (!isOwner) { return HttpResponse.json({ errors: [{ detail: 'You are not an owner of this crate' }] }, { status: 400 }); } @@ -45,7 +42,7 @@ export default http.post('/api/v1/trusted_publishing/github_configs', async ({ r } // Create a new GitHub config - let config = db.trustpubGithubConfig.create({ + let config = await db.trustpubGithubConfig.create({ crate, repository_owner, repository_name, diff --git a/packages/crates-io-msw/handlers/trustpub/github-configs/create.test.js b/packages/crates-io-msw/handlers/trustpub/github-configs/create.test.js index e93205fad31..e89f9ade13c 100644 --- a/packages/crates-io-msw/handlers/trustpub/github-configs/create.test.js +++ b/packages/crates-io-msw/handlers/trustpub/github-configs/create.test.js @@ -13,14 +13,14 @@ afterEach(() => { test('happy path', async function () { vi.setSystemTime(new Date('2023-01-01T00:00:00Z')); - let crate = db.crate.create({ name: 'test-crate' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate' }); + await db.version.create({ crate }); - let user = db.user.create({ emailVerified: true }); - db.mswSession.create({ user }); + let user = await db.user.create({ emailVerified: true }); + await db.mswSession.create({ user }); // Create crate ownership - db.crateOwnership.create({ + await db.crateOwnership.create({ crate, user, }); @@ -55,14 +55,14 @@ test('happy path', async function () { test('happy path with environment', async function () { vi.setSystemTime(new Date('2023-02-01T00:00:00Z')); - let crate = db.crate.create({ name: 'test-crate-env' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate-env' }); + await db.version.create({ crate }); - let user = db.user.create({ emailVerified: true }); - db.mswSession.create({ user }); + let user = await db.user.create({ emailVerified: true }); + await db.mswSession.create({ user }); // Create crate ownership - db.crateOwnership.create({ + await db.crateOwnership.create({ crate, user, }); @@ -115,8 +115,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 400 if request body is invalid', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/trusted_publishing/github_configs', { method: 'POST', @@ -130,8 +130,8 @@ test('returns 400 if request body is invalid', async function () { }); test('returns 400 if required fields are missing', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/trusted_publishing/github_configs', { method: 'POST', @@ -149,8 +149,8 @@ test('returns 400 if required fields are missing', async function () { }); test("returns 404 if crate can't be found", async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/trusted_publishing/github_configs', { method: 'POST', @@ -171,11 +171,11 @@ test("returns 404 if crate can't be found", async function () { }); test('returns 400 if user is not an owner of the crate', async function () { - let crate = db.crate.create({ name: 'test-crate-not-owner' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate-not-owner' }); + await db.version.create({ crate }); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/trusted_publishing/github_configs', { method: 'POST', @@ -196,14 +196,14 @@ test('returns 400 if user is not an owner of the crate', async function () { }); test('returns 403 if user email is not verified', async function () { - let crate = db.crate.create({ name: 'test-crate-unverified' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate-unverified' }); + await db.version.create({ crate }); - let user = db.user.create({ emailVerified: false }); - db.mswSession.create({ user }); + let user = await db.user.create({ emailVerified: false }); + await db.mswSession.create({ user }); // Create crate ownership - db.crateOwnership.create({ + await db.crateOwnership.create({ crate, user, }); diff --git a/packages/crates-io-msw/handlers/trustpub/github-configs/delete.js b/packages/crates-io-msw/handlers/trustpub/github-configs/delete.js index 23eb35d6e97..e4934d273a2 100644 --- a/packages/crates-io-msw/handlers/trustpub/github-configs/delete.js +++ b/packages/crates-io-msw/handlers/trustpub/github-configs/delete.js @@ -11,22 +11,19 @@ export default http.delete('/api/v1/trusted_publishing/github_configs/:id', ({ p } let id = parseInt(params.id); - let config = db.trustpubGithubConfig.findFirst({ where: { id: { equals: id } } }); + let config = db.trustpubGithubConfig.findFirst(q => q.where({ id })); if (!config) return notFound(); // Check if the user is an owner of the crate - let isOwner = db.crateOwnership.findFirst({ - where: { - crate: { id: { equals: config.crate.id } }, - user: { id: { equals: user.id } }, - }, - }); + let isOwner = db.crateOwnership.findFirst(q => + q.where(ownership => ownership.crate.id === config.crate.id && ownership.user?.id === user.id), + ); if (!isOwner) { return HttpResponse.json({ errors: [{ detail: 'You are not an owner of this crate' }] }, { status: 400 }); } // Delete the config - db.trustpubGithubConfig.delete({ where: { id: { equals: id } } }); + db.trustpubGithubConfig.delete(q => q.where({ id })); return new HttpResponse(null, { status: 204 }); }); diff --git a/packages/crates-io-msw/handlers/trustpub/github-configs/delete.test.js b/packages/crates-io-msw/handlers/trustpub/github-configs/delete.test.js index a4e09990b16..045c0b0ae27 100644 --- a/packages/crates-io-msw/handlers/trustpub/github-configs/delete.test.js +++ b/packages/crates-io-msw/handlers/trustpub/github-configs/delete.test.js @@ -3,20 +3,20 @@ import { assert, test } from 'vitest'; import { db } from '../../../index.js'; test('happy path', async function () { - let crate = db.crate.create({ name: 'test-crate' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate' }); + await db.version.create({ crate }); - let user = db.user.create({ email_verified: true }); - db.mswSession.create({ user }); + let user = await db.user.create({ email_verified: true }); + await db.mswSession.create({ user }); // Create crate ownership - db.crateOwnership.create({ + await db.crateOwnership.create({ crate, user, }); // Create GitHub config - let config = db.trustpubGithubConfig.create({ + let config = await db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -32,8 +32,8 @@ test('happy path', async function () { assert.strictEqual(await response.text(), ''); // Verify the config was deleted - let deletedConfig = db.trustpubGithubConfig.findFirst({ where: { id: { equals: config.id } } }); - assert.strictEqual(deletedConfig, null); + let deletedConfig = db.trustpubGithubConfig.findFirst(q => q.where({ id: config.id })); + assert.strictEqual(deletedConfig, undefined); }); test('returns 403 if unauthenticated', async function () { @@ -48,8 +48,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 404 if config ID is invalid', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/trusted_publishing/github_configs/invalid', { method: 'DELETE', @@ -62,8 +62,8 @@ test('returns 404 if config ID is invalid', async function () { }); test("returns 404 if config can't be found", async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/trusted_publishing/github_configs/999999', { method: 'DELETE', @@ -76,17 +76,17 @@ test("returns 404 if config can't be found", async function () { }); test('returns 400 if user is not an owner of the crate', async function () { - let crate = db.crate.create({ name: 'test-crate-not-owner' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate-not-owner' }); + await db.version.create({ crate }); - let owner = db.user.create(); - db.crateOwnership.create({ + let owner = await db.user.create(); + await db.crateOwnership.create({ crate, user: owner, }); // Create GitHub config - let config = db.trustpubGithubConfig.create({ + let config = await db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -95,8 +95,8 @@ test('returns 400 if user is not an owner of the crate', async function () { }); // Login as a different user - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch(`/api/v1/trusted_publishing/github_configs/${config.id}`, { method: 'DELETE', diff --git a/packages/crates-io-msw/handlers/trustpub/github-configs/list.js b/packages/crates-io-msw/handlers/trustpub/github-configs/list.js index 7b4424057f1..c5ed18e6035 100644 --- a/packages/crates-io-msw/handlers/trustpub/github-configs/list.js +++ b/packages/crates-io-msw/handlers/trustpub/github-configs/list.js @@ -18,23 +18,18 @@ export default http.get('/api/v1/trusted_publishing/github_configs', ({ request return HttpResponse.json({ errors: [{ detail: 'missing or invalid filter' }] }, { status: 400 }); } - let crate = db.crate.findFirst({ where: { name: { equals: crateName } } }); + let crate = db.crate.findFirst(q => q.where({ name: crateName })); if (!crate) return notFound(); // Check if the user is an owner of the crate - let isOwner = db.crateOwnership.findFirst({ - where: { - crate: { id: { equals: crate.id } }, - user: { id: { equals: user.id } }, - }, - }); + let isOwner = db.crateOwnership.findFirst(q => + q.where(ownership => ownership.crate.id === crate.id && ownership.user?.id === user.id), + ); if (!isOwner) { return HttpResponse.json({ errors: [{ detail: 'You are not an owner of this crate' }] }, { status: 400 }); } - let configs = db.trustpubGithubConfig.findMany({ - where: { crate: { id: { equals: crate.id } } }, - }); + let configs = db.trustpubGithubConfig.findMany(q => q.where(config => config.crate.id === crate.id)); return HttpResponse.json({ github_configs: configs.map(config => serializeGitHubConfig(config)), diff --git a/packages/crates-io-msw/handlers/trustpub/github-configs/list.test.js b/packages/crates-io-msw/handlers/trustpub/github-configs/list.test.js index b7394b5a20d..469971bd5b4 100644 --- a/packages/crates-io-msw/handlers/trustpub/github-configs/list.test.js +++ b/packages/crates-io-msw/handlers/trustpub/github-configs/list.test.js @@ -3,20 +3,20 @@ import { assert, test } from 'vitest'; import { db } from '../../../index.js'; test('happy path', async function () { - let crate = db.crate.create({ name: 'test-crate' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate' }); + await db.version.create({ crate }); - let user = db.user.create({ email_verified: true }); - db.mswSession.create({ user }); + let user = await db.user.create({ email_verified: true }); + await db.mswSession.create({ user }); // Create crate ownership - db.crateOwnership.create({ + await db.crateOwnership.create({ crate, user, }); // Create GitHub configs - let config1 = db.trustpubGithubConfig.create({ + let config1 = await db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_owner_id: 1, @@ -25,7 +25,7 @@ test('happy path', async function () { created_at: '2023-01-01T00:00:00Z', }); - let config2 = db.trustpubGithubConfig.create({ + let config2 = await db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_owner_id: 42, @@ -64,14 +64,14 @@ test('happy path', async function () { }); test('happy path with no configs', async function () { - let crate = db.crate.create({ name: 'test-crate-empty' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate-empty' }); + await db.version.create({ crate }); - let user = db.user.create({ email_verified: true }); - db.mswSession.create({ user }); + let user = await db.user.create({ email_verified: true }); + await db.mswSession.create({ user }); // Create crate ownership - db.crateOwnership.create({ + await db.crateOwnership.create({ crate, user, }); @@ -92,8 +92,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 400 if query params are missing', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch(`/api/v1/trusted_publishing/github_configs`); assert.strictEqual(response.status, 400); @@ -103,8 +103,8 @@ test('returns 400 if query params are missing', async function () { }); test("returns 404 if crate can't be found", async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch(`/api/v1/trusted_publishing/github_configs?crate=nonexistent`); assert.strictEqual(response.status, 404); @@ -114,11 +114,11 @@ test("returns 404 if crate can't be found", async function () { }); test('returns 400 if user is not an owner of the crate', async function () { - let crate = db.crate.create({ name: 'test-crate-not-owner' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate-not-owner' }); + await db.version.create({ crate }); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch(`/api/v1/trusted_publishing/github_configs?crate=${crate.name}`); assert.strictEqual(response.status, 400); diff --git a/packages/crates-io-msw/handlers/trustpub/gitlab-configs/create.js b/packages/crates-io-msw/handlers/trustpub/gitlab-configs/create.js index 166ebfe9ddf..4fe1b0b9b9b 100644 --- a/packages/crates-io-msw/handlers/trustpub/gitlab-configs/create.js +++ b/packages/crates-io-msw/handlers/trustpub/gitlab-configs/create.js @@ -23,16 +23,13 @@ export default http.post('/api/v1/trusted_publishing/gitlab_configs', async ({ r return HttpResponse.json({ errors: [{ detail: 'missing required fields' }] }, { status: 400 }); } - let crate = db.crate.findFirst({ where: { name: { equals: crateName } } }); + let crate = db.crate.findFirst(q => q.where({ name: crateName })); if (!crate) return notFound(); // Check if the user is an owner of the crate - let isOwner = db.crateOwnership.findFirst({ - where: { - crate: { id: { equals: crate.id } }, - user: { id: { equals: user.id } }, - }, - }); + let isOwner = db.crateOwnership.findFirst(q => + q.where(ownership => ownership.crate.id === crate.id && ownership.user?.id === user.id), + ); if (!isOwner) { return HttpResponse.json({ errors: [{ detail: 'You are not an owner of this crate' }] }, { status: 400 }); } @@ -45,7 +42,7 @@ export default http.post('/api/v1/trusted_publishing/gitlab_configs', async ({ r } // Create a new GitLab config - let config = db.trustpubGitlabConfig.create({ + let config = await db.trustpubGitlabConfig.create({ crate, namespace, namespace_id: null, diff --git a/packages/crates-io-msw/handlers/trustpub/gitlab-configs/create.test.js b/packages/crates-io-msw/handlers/trustpub/gitlab-configs/create.test.js index 05e60f98459..4ca709b405c 100644 --- a/packages/crates-io-msw/handlers/trustpub/gitlab-configs/create.test.js +++ b/packages/crates-io-msw/handlers/trustpub/gitlab-configs/create.test.js @@ -13,14 +13,14 @@ afterEach(() => { test('happy path', async function () { vi.setSystemTime(new Date('2023-01-01T00:00:00Z')); - let crate = db.crate.create({ name: 'test-crate' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate' }); + await db.version.create({ crate }); - let user = db.user.create({ emailVerified: true }); - db.mswSession.create({ user }); + let user = await db.user.create({ emailVerified: true }); + await db.mswSession.create({ user }); // Create crate ownership - db.crateOwnership.create({ + await db.crateOwnership.create({ crate, user, }); @@ -55,14 +55,14 @@ test('happy path', async function () { test('happy path with environment', async function () { vi.setSystemTime(new Date('2023-02-01T00:00:00Z')); - let crate = db.crate.create({ name: 'test-crate-env' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate-env' }); + await db.version.create({ crate }); - let user = db.user.create({ emailVerified: true }); - db.mswSession.create({ user }); + let user = await db.user.create({ emailVerified: true }); + await db.mswSession.create({ user }); // Create crate ownership - db.crateOwnership.create({ + await db.crateOwnership.create({ crate, user, }); @@ -115,8 +115,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 400 if request body is invalid', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/trusted_publishing/gitlab_configs', { method: 'POST', @@ -130,8 +130,8 @@ test('returns 400 if request body is invalid', async function () { }); test('returns 400 if required fields are missing', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/trusted_publishing/gitlab_configs', { method: 'POST', @@ -149,8 +149,8 @@ test('returns 400 if required fields are missing', async function () { }); test("returns 404 if crate can't be found", async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/trusted_publishing/gitlab_configs', { method: 'POST', @@ -171,11 +171,11 @@ test("returns 404 if crate can't be found", async function () { }); test('returns 400 if user is not an owner of the crate', async function () { - let crate = db.crate.create({ name: 'test-crate-not-owner' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate-not-owner' }); + await db.version.create({ crate }); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/trusted_publishing/gitlab_configs', { method: 'POST', @@ -196,14 +196,14 @@ test('returns 400 if user is not an owner of the crate', async function () { }); test('returns 403 if user email is not verified', async function () { - let crate = db.crate.create({ name: 'test-crate-unverified' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate-unverified' }); + await db.version.create({ crate }); - let user = db.user.create({ emailVerified: false }); - db.mswSession.create({ user }); + let user = await db.user.create({ emailVerified: false }); + await db.mswSession.create({ user }); // Create crate ownership - db.crateOwnership.create({ + await db.crateOwnership.create({ crate, user, }); diff --git a/packages/crates-io-msw/handlers/trustpub/gitlab-configs/delete.js b/packages/crates-io-msw/handlers/trustpub/gitlab-configs/delete.js index e8a09c2288e..13d65da994e 100644 --- a/packages/crates-io-msw/handlers/trustpub/gitlab-configs/delete.js +++ b/packages/crates-io-msw/handlers/trustpub/gitlab-configs/delete.js @@ -11,22 +11,19 @@ export default http.delete('/api/v1/trusted_publishing/gitlab_configs/:id', ({ p } let id = parseInt(params.id); - let config = db.trustpubGitlabConfig.findFirst({ where: { id: { equals: id } } }); + let config = db.trustpubGitlabConfig.findFirst(q => q.where({ id })); if (!config) return notFound(); // Check if the user is an owner of the crate - let isOwner = db.crateOwnership.findFirst({ - where: { - crate: { id: { equals: config.crate.id } }, - user: { id: { equals: user.id } }, - }, - }); + let isOwner = db.crateOwnership.findFirst(q => + q.where(ownership => ownership.crate.id === config.crate.id && ownership.user?.id === user.id), + ); if (!isOwner) { return HttpResponse.json({ errors: [{ detail: 'You are not an owner of this crate' }] }, { status: 400 }); } // Delete the config - db.trustpubGitlabConfig.delete({ where: { id: { equals: id } } }); + db.trustpubGitlabConfig.delete(q => q.where({ id })); return new HttpResponse(null, { status: 204 }); }); diff --git a/packages/crates-io-msw/handlers/trustpub/gitlab-configs/delete.test.js b/packages/crates-io-msw/handlers/trustpub/gitlab-configs/delete.test.js index 9c26bad8c30..c69772792f0 100644 --- a/packages/crates-io-msw/handlers/trustpub/gitlab-configs/delete.test.js +++ b/packages/crates-io-msw/handlers/trustpub/gitlab-configs/delete.test.js @@ -3,20 +3,20 @@ import { assert, test } from 'vitest'; import { db } from '../../../index.js'; test('happy path', async function () { - let crate = db.crate.create({ name: 'test-crate' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate' }); + await db.version.create({ crate }); - let user = db.user.create({ email_verified: true }); - db.mswSession.create({ user }); + let user = await db.user.create({ email_verified: true }); + await db.mswSession.create({ user }); // Create crate ownership - db.crateOwnership.create({ + await db.crateOwnership.create({ crate, user, }); // Create GitLab config - let config = db.trustpubGitlabConfig.create({ + let config = await db.trustpubGitlabConfig.create({ crate, namespace: 'rust-lang', project: 'crates.io', @@ -32,8 +32,8 @@ test('happy path', async function () { assert.strictEqual(await response.text(), ''); // Verify the config was deleted - let deletedConfig = db.trustpubGitlabConfig.findFirst({ where: { id: { equals: config.id } } }); - assert.strictEqual(deletedConfig, null); + let deletedConfig = db.trustpubGitlabConfig.findFirst(q => q.where({ id: config.id })); + assert.strictEqual(deletedConfig, undefined); }); test('returns 403 if unauthenticated', async function () { @@ -48,8 +48,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 404 if config ID is invalid', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/trusted_publishing/gitlab_configs/invalid', { method: 'DELETE', @@ -62,8 +62,8 @@ test('returns 404 if config ID is invalid', async function () { }); test("returns 404 if config can't be found", async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/trusted_publishing/gitlab_configs/999999', { method: 'DELETE', @@ -76,17 +76,17 @@ test("returns 404 if config can't be found", async function () { }); test('returns 400 if user is not an owner of the crate', async function () { - let crate = db.crate.create({ name: 'test-crate-not-owner' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate-not-owner' }); + await db.version.create({ crate }); - let owner = db.user.create(); - db.crateOwnership.create({ + let owner = await db.user.create(); + await db.crateOwnership.create({ crate, user: owner, }); // Create GitLab config - let config = db.trustpubGitlabConfig.create({ + let config = await db.trustpubGitlabConfig.create({ crate, namespace: 'rust-lang', project: 'crates.io', @@ -95,8 +95,8 @@ test('returns 400 if user is not an owner of the crate', async function () { }); // Login as a different user - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch(`/api/v1/trusted_publishing/gitlab_configs/${config.id}`, { method: 'DELETE', diff --git a/packages/crates-io-msw/handlers/trustpub/gitlab-configs/list.js b/packages/crates-io-msw/handlers/trustpub/gitlab-configs/list.js index 4ca10e0f33e..00a928d64a7 100644 --- a/packages/crates-io-msw/handlers/trustpub/gitlab-configs/list.js +++ b/packages/crates-io-msw/handlers/trustpub/gitlab-configs/list.js @@ -18,23 +18,18 @@ export default http.get('/api/v1/trusted_publishing/gitlab_configs', ({ request return HttpResponse.json({ errors: [{ detail: 'missing or invalid filter' }] }, { status: 400 }); } - let crate = db.crate.findFirst({ where: { name: { equals: crateName } } }); + let crate = db.crate.findFirst(q => q.where({ name: crateName })); if (!crate) return notFound(); // Check if the user is an owner of the crate - let isOwner = db.crateOwnership.findFirst({ - where: { - crate: { id: { equals: crate.id } }, - user: { id: { equals: user.id } }, - }, - }); + let isOwner = db.crateOwnership.findFirst(q => + q.where(ownership => ownership.crate.id === crate.id && ownership.user?.id === user.id), + ); if (!isOwner) { return HttpResponse.json({ errors: [{ detail: 'You are not an owner of this crate' }] }, { status: 400 }); } - let configs = db.trustpubGitlabConfig.findMany({ - where: { crate: { id: { equals: crate.id } } }, - }); + let configs = db.trustpubGitlabConfig.findMany(q => q.where(config => config.crate.id === crate.id)); return HttpResponse.json({ gitlab_configs: configs.map(config => serializeGitLabConfig(config)), diff --git a/packages/crates-io-msw/handlers/trustpub/gitlab-configs/list.test.js b/packages/crates-io-msw/handlers/trustpub/gitlab-configs/list.test.js index cca36000161..15c8d2c59c7 100644 --- a/packages/crates-io-msw/handlers/trustpub/gitlab-configs/list.test.js +++ b/packages/crates-io-msw/handlers/trustpub/gitlab-configs/list.test.js @@ -3,20 +3,20 @@ import { assert, test } from 'vitest'; import { db } from '../../../index.js'; test('happy path', async function () { - let crate = db.crate.create({ name: 'test-crate' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate' }); + await db.version.create({ crate }); - let user = db.user.create({ email_verified: true }); - db.mswSession.create({ user }); + let user = await db.user.create({ email_verified: true }); + await db.mswSession.create({ user }); // Create crate ownership - db.crateOwnership.create({ + await db.crateOwnership.create({ crate, user, }); // Create GitLab configs - let config1 = db.trustpubGitlabConfig.create({ + let config1 = await db.trustpubGitlabConfig.create({ crate, namespace: 'rust-lang', namespace_id: null, @@ -25,7 +25,7 @@ test('happy path', async function () { created_at: '2023-01-01T00:00:00Z', }); - let config2 = db.trustpubGitlabConfig.create({ + let config2 = await db.trustpubGitlabConfig.create({ crate, namespace: 'rust-lang', namespace_id: '12345', @@ -64,14 +64,14 @@ test('happy path', async function () { }); test('happy path with no configs', async function () { - let crate = db.crate.create({ name: 'test-crate-empty' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate-empty' }); + await db.version.create({ crate }); - let user = db.user.create({ email_verified: true }); - db.mswSession.create({ user }); + let user = await db.user.create({ email_verified: true }); + await db.mswSession.create({ user }); // Create crate ownership - db.crateOwnership.create({ + await db.crateOwnership.create({ crate, user, }); @@ -92,8 +92,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 400 if query params are missing', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch(`/api/v1/trusted_publishing/gitlab_configs`); assert.strictEqual(response.status, 400); @@ -103,8 +103,8 @@ test('returns 400 if query params are missing', async function () { }); test("returns 404 if crate can't be found", async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch(`/api/v1/trusted_publishing/gitlab_configs?crate=nonexistent`); assert.strictEqual(response.status, 404); @@ -114,11 +114,11 @@ test("returns 404 if crate can't be found", async function () { }); test('returns 400 if user is not an owner of the crate', async function () { - let crate = db.crate.create({ name: 'test-crate-not-owner' }); - db.version.create({ crate }); + let crate = await db.crate.create({ name: 'test-crate-not-owner' }); + await db.version.create({ crate }); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch(`/api/v1/trusted_publishing/gitlab_configs?crate=${crate.name}`); assert.strictEqual(response.status, 400); diff --git a/packages/crates-io-msw/handlers/users/confirm-email.js b/packages/crates-io-msw/handlers/users/confirm-email.js index d42c7b13d44..e4dab81fed5 100644 --- a/packages/crates-io-msw/handlers/users/confirm-email.js +++ b/packages/crates-io-msw/handlers/users/confirm-email.js @@ -2,15 +2,20 @@ import { http, HttpResponse } from 'msw'; import { db } from '../../index.js'; -export default http.put('/api/v1/confirm/:token', ({ params }) => { +export default http.put('/api/v1/confirm/:token', async ({ params }) => { let { token } = params; - let user = db.user.findFirst({ where: { emailVerificationToken: { equals: token } } }); + let user = db.user.findFirst(q => q.where({ emailVerificationToken: token })); if (!user) { return HttpResponse.json({ errors: [{ detail: 'Email belonging to token not found.' }] }, { status: 400 }); } - db.user.update({ where: { id: user.id }, data: { emailVerified: true, emailVerificationToken: null } }); + await db.user.update(q => q.where({ id: user.id }), { + data(user) { + user.emailVerified = true; + user.emailVerificationToken = null; + }, + }); return HttpResponse.json({ ok: true }); }); diff --git a/packages/crates-io-msw/handlers/users/confirm-email.test.js b/packages/crates-io-msw/handlers/users/confirm-email.test.js index 64c7fea7207..419f542a002 100644 --- a/packages/crates-io-msw/handlers/users/confirm-email.test.js +++ b/packages/crates-io-msw/handlers/users/confirm-email.test.js @@ -3,28 +3,28 @@ import { assert, test } from 'vitest'; import { db } from '../../index.js'; test('returns `ok: true` for a known token (unauthenticated)', async function () { - let user = db.user.create({ emailVerificationToken: 'foo' }); + let user = await db.user.create({ emailVerificationToken: 'foo' }); assert.strictEqual(user.emailVerified, false); let response = await fetch('/api/v1/confirm/foo', { method: 'PUT' }); assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { ok: true }); - user = db.user.findFirst({ where: { id: user.id } }); + user = db.user.findFirst(q => q.where({ id: user.id })); assert.strictEqual(user.emailVerified, true); }); test('returns `ok: true` for a known token (authenticated)', async function () { - let user = db.user.create({ emailVerificationToken: 'foo' }); + let user = await db.user.create({ emailVerificationToken: 'foo' }); assert.strictEqual(user.emailVerified, false); - db.mswSession.create({ user }); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/confirm/foo', { method: 'PUT' }); assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { ok: true }); - user = db.user.findFirst({ where: { id: user.id } }); + user = db.user.findFirst(q => q.where({ id: user.id })); assert.strictEqual(user.emailVerified, true); }); diff --git a/packages/crates-io-msw/handlers/users/get.js b/packages/crates-io-msw/handlers/users/get.js index ee299d708d1..02423489c9d 100644 --- a/packages/crates-io-msw/handlers/users/get.js +++ b/packages/crates-io-msw/handlers/users/get.js @@ -6,7 +6,7 @@ import { notFound } from '../../utils/handlers.js'; export default http.get('/api/v1/users/:user_id', ({ params }) => { let login = params.user_id; - let user = db.user.findFirst({ where: { login: { equals: login } } }); + let user = db.user.findFirst(q => q.where({ login })); if (!user) { return notFound(); } diff --git a/packages/crates-io-msw/handlers/users/get.test.js b/packages/crates-io-msw/handlers/users/get.test.js index f5314186740..8aa14a51cf1 100644 --- a/packages/crates-io-msw/handlers/users/get.test.js +++ b/packages/crates-io-msw/handlers/users/get.test.js @@ -9,7 +9,7 @@ test('returns 404 for unknown users', async function () { }); test('returns a user object for known users', async function () { - let user = db.user.create({ name: 'John Doe' }); + let user = await db.user.create({ name: 'John Doe' }); let response = await fetch(`/api/v1/users/${user.login}`); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/users/me.js b/packages/crates-io-msw/handlers/users/me.js index e435006946a..ae85b28a284 100644 --- a/packages/crates-io-msw/handlers/users/me.js +++ b/packages/crates-io-msw/handlers/users/me.js @@ -10,7 +10,7 @@ export default http.get('/api/v1/me', () => { return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 }); } - let ownerships = db.crateOwnership.findMany({ where: { user: { id: { equals: user.id } } } }); + let ownerships = db.crateOwnership.findMany(q => q.where(ownership => ownership.user?.id === user.id)); return HttpResponse.json({ user: serializeUser(user, { removePrivateData: false }), diff --git a/packages/crates-io-msw/handlers/users/me.test.js b/packages/crates-io-msw/handlers/users/me.test.js index fba39926019..1bf292254e3 100644 --- a/packages/crates-io-msw/handlers/users/me.test.js +++ b/packages/crates-io-msw/handlers/users/me.test.js @@ -3,8 +3,8 @@ import { assert, test } from 'vitest'; import { db } from '../../index.js'; test('returns the `user` resource including the private fields', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/me'); assert.strictEqual(response.status, 200); @@ -26,13 +26,13 @@ test('returns the `user` resource including the private fields', async function }); test('returns a list of `owned_crates`', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); - let [crate1, , crate3] = Array.from({ length: 3 }, () => db.crate.create()); + let [crate1, , crate3] = await Promise.all(Array.from({ length: 3 }, () => db.crate.create())); - db.crateOwnership.create({ crate: crate1, user }); - db.crateOwnership.create({ crate: crate3, user }); + await db.crateOwnership.create({ crate: crate1, user }); + await db.crateOwnership.create({ crate: crate3, user }); let response = await fetch('/api/v1/me'); assert.strictEqual(response.status, 200); @@ -45,7 +45,7 @@ test('returns a list of `owned_crates`', async function () { }); test('returns an error if unauthenticated', async function () { - db.user.create(); + await db.user.create(); let response = await fetch('/api/v1/me'); assert.strictEqual(response.status, 403); diff --git a/packages/crates-io-msw/handlers/users/resend.test.js b/packages/crates-io-msw/handlers/users/resend.test.js index a260624ff5a..8acef23dffc 100644 --- a/packages/crates-io-msw/handlers/users/resend.test.js +++ b/packages/crates-io-msw/handlers/users/resend.test.js @@ -3,8 +3,8 @@ import { assert, test } from 'vitest'; import { db } from '../../index.js'; test('returns `ok`', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch(`/api/v1/users/${user.id}/resend`, { method: 'PUT' }); assert.strictEqual(response.status, 200); @@ -12,7 +12,7 @@ test('returns `ok`', async function () { }); test('returns 403 when not logged in', async function () { - let user = db.user.create(); + let user = await db.user.create(); let response = await fetch(`/api/v1/users/${user.id}/resend`, { method: 'PUT' }); assert.strictEqual(response.status, 403); @@ -20,8 +20,8 @@ test('returns 403 when not logged in', async function () { }); test('returns 400 when requesting the wrong user id', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch(`/api/v1/users/wrong-id/resend`, { method: 'PUT' }); assert.strictEqual(response.status, 400); diff --git a/packages/crates-io-msw/handlers/users/update.js b/packages/crates-io-msw/handlers/users/update.js index 83480ee544a..2c690cec3a4 100644 --- a/packages/crates-io-msw/handlers/users/update.js +++ b/packages/crates-io-msw/handlers/users/update.js @@ -19,9 +19,10 @@ export default http.put('/api/v1/users/:user_id', async ({ params, request }) => } if (json.user.publish_notifications !== undefined) { - db.user.update({ - where: { id: { equals: user.id } }, - data: { publishNotifications: json.user.publish_notifications }, + await db.user.update(q => q.where({ id: user.id }), { + data(user) { + user.publishNotifications = json.user.publish_notifications; + }, }); } @@ -30,12 +31,11 @@ export default http.put('/api/v1/users/:user_id', async ({ params, request }) => return HttpResponse.json({ errors: [{ detail: 'empty email rejected' }] }, { status: 400 }); } - db.user.update({ - where: { id: { equals: user.id } }, - data: { - email: json.user.email, - emailVerified: false, - emailVerificationToken: 'secret123', + await db.user.update(q => q.where({ id: user.id }), { + data(user) { + user.email = json.user.email; + user.emailVerified = false; + user.emailVerificationToken = 'secret123'; }, }); } diff --git a/packages/crates-io-msw/handlers/users/update.test.js b/packages/crates-io-msw/handlers/users/update.test.js index 0456a47d530..04f6ba58dd6 100644 --- a/packages/crates-io-msw/handlers/users/update.test.js +++ b/packages/crates-io-msw/handlers/users/update.test.js @@ -3,23 +3,23 @@ import { assert, test } from 'vitest'; import { db } from '../../index.js'; test('updates the user with a new email address', async function () { - let user = db.user.create({ email: 'old@email.com' }); - db.mswSession.create({ user }); + let user = await db.user.create({ email: 'old@email.com' }); + await db.mswSession.create({ user }); let body = JSON.stringify({ user: { email: 'new@email.com' } }); let response = await fetch(`/api/v1/users/${user.id}`, { method: 'PUT', body }); assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { ok: true }); - user = db.user.findFirst({ where: { id: user.id } }); + user = db.user.findFirst(q => q.where({ id: user.id })); assert.strictEqual(user.email, 'new@email.com'); assert.strictEqual(user.emailVerified, false); assert.strictEqual(user.emailVerificationToken, 'secret123'); }); test('updates the `publish_notifications` settings', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); assert.strictEqual(user.publishNotifications, true); let body = JSON.stringify({ user: { publish_notifications: false } }); @@ -27,57 +27,57 @@ test('updates the `publish_notifications` settings', async function () { assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { ok: true }); - user = db.user.findFirst({ where: { id: user.id } }); + user = db.user.findFirst(q => q.where({ id: user.id })); assert.strictEqual(user.publishNotifications, false); }); test('returns 403 when not logged in', async function () { - let user = db.user.create({ email: 'old@email.com' }); + let user = await db.user.create({ email: 'old@email.com' }); let body = JSON.stringify({ user: { email: 'new@email.com' } }); let response = await fetch(`/api/v1/users/${user.id}`, { method: 'PUT', body }); assert.strictEqual(response.status, 403); assert.deepEqual(await response.json(), { errors: [{ detail: 'must be logged in to perform that action' }] }); - user = db.user.findFirst({ where: { id: user.id } }); + user = db.user.findFirst(q => q.where({ id: user.id })); assert.strictEqual(user.email, 'old@email.com'); }); test('returns 400 when requesting the wrong user id', async function () { - let user = db.user.create({ email: 'old@email.com' }); - db.mswSession.create({ user }); + let user = await db.user.create({ email: 'old@email.com' }); + await db.mswSession.create({ user }); let body = JSON.stringify({ user: { email: 'new@email.com' } }); let response = await fetch(`/api/v1/users/wrong-id`, { method: 'PUT', body }); assert.strictEqual(response.status, 400); assert.deepEqual(await response.json(), { errors: [{ detail: 'current user does not match requested user' }] }); - user = db.user.findFirst({ where: { id: user.id } }); + user = db.user.findFirst(q => q.where({ id: user.id })); assert.strictEqual(user.email, 'old@email.com'); }); test('returns 400 when sending an invalid payload', async function () { - let user = db.user.create({ email: 'old@email.com' }); - db.mswSession.create({ user }); + let user = await db.user.create({ email: 'old@email.com' }); + await db.mswSession.create({ user }); let body = JSON.stringify({}); let response = await fetch(`/api/v1/users/${user.id}`, { method: 'PUT', body }); assert.strictEqual(response.status, 400); assert.deepEqual(await response.json(), { errors: [{ detail: 'invalid json request' }] }); - user = db.user.findFirst({ where: { id: user.id } }); + user = db.user.findFirst(q => q.where({ id: user.id })); assert.strictEqual(user.email, 'old@email.com'); }); test('returns 400 when sending an empty email address', async function () { - let user = db.user.create({ email: 'old@email.com' }); - db.mswSession.create({ user }); + let user = await db.user.create({ email: 'old@email.com' }); + await db.mswSession.create({ user }); let body = JSON.stringify({ user: { email: '' } }); let response = await fetch(`/api/v1/users/${user.id}`, { method: 'PUT', body }); assert.strictEqual(response.status, 400); assert.deepEqual(await response.json(), { errors: [{ detail: 'empty email rejected' }] }); - user = db.user.findFirst({ where: { id: user.id } }); + user = db.user.findFirst(q => q.where({ id: user.id })); assert.strictEqual(user.email, 'old@email.com'); }); diff --git a/packages/crates-io-msw/handlers/versions/dependencies.js b/packages/crates-io-msw/handlers/versions/dependencies.js index 205142b5b5a..efb5405e7cd 100644 --- a/packages/crates-io-msw/handlers/versions/dependencies.js +++ b/packages/crates-io-msw/handlers/versions/dependencies.js @@ -5,21 +5,18 @@ import { serializeDependency } from '../../serializers/dependency.js'; import { notFound } from '../../utils/handlers.js'; export default http.get('/api/v1/crates/:name/:version/dependencies', async ({ params }) => { - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) return notFound(); - let version = db.version.findFirst({ - where: { - crate: { id: { equals: crate.id } }, - num: { equals: params.version }, - }, - }); + let version = db.version.findFirst(q => + q.where(version => version.crate.id === crate.id && version.num === params.version), + ); if (!version) { let errorMessage = `crate \`${crate.name}\` does not have a version \`${params.version}\``; return HttpResponse.json({ errors: [{ detail: errorMessage }] }, { status: 404 }); } - let dependencies = db.dependency.findMany({ where: { version: { id: { equals: version.id } } } }); + let dependencies = db.dependency.findMany(q => q.where(dep => dep.version.id === version.id)); return HttpResponse.json({ dependencies: dependencies.map(d => serializeDependency(d)), diff --git a/packages/crates-io-msw/handlers/versions/dependencies.test.js b/packages/crates-io-msw/handlers/versions/dependencies.test.js index a6f96601ccb..4a3f04e835d 100644 --- a/packages/crates-io-msw/handlers/versions/dependencies.test.js +++ b/packages/crates-io-msw/handlers/versions/dependencies.test.js @@ -9,7 +9,7 @@ test('returns 404 for unknown crates', async function () { }); test('returns 404 for unknown versions', async function () { - db.crate.create({ name: 'rand' }); + await db.crate.create({ name: 'rand' }); let response = await fetch('/api/v1/crates/rand/1.0.0/dependencies'); assert.strictEqual(response.status, 404); @@ -17,8 +17,8 @@ test('returns 404 for unknown versions', async function () { }); test('empty case', async function () { - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ crate, num: '1.0.0' }); + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, num: '1.0.0' }); let response = await fetch('/api/v1/crates/rand/1.0.0/dependencies'); assert.strictEqual(response.status, 200); @@ -28,15 +28,15 @@ test('empty case', async function () { }); test('returns a list of dependencies belonging to the specified crate version', async function () { - let crate = db.crate.create({ name: 'rand' }); - let version = db.version.create({ crate, num: '1.0.0' }); + let crate = await db.crate.create({ name: 'rand' }); + let version = await db.version.create({ crate, num: '1.0.0' }); - let foo = db.crate.create({ name: 'foo' }); - db.dependency.create({ crate: foo, version }); - let bar = db.crate.create({ name: 'bar' }); - db.dependency.create({ crate: bar, version }); - let baz = db.crate.create({ name: 'baz' }); - db.dependency.create({ crate: baz, version }); + let foo = await db.crate.create({ name: 'foo' }); + await db.dependency.create({ crate: foo, version }); + let bar = await db.crate.create({ name: 'bar' }); + await db.dependency.create({ crate: bar, version }); + let baz = await db.crate.create({ name: 'baz' }); + await db.dependency.create({ crate: baz, version }); let response = await fetch('/api/v1/crates/rand/1.0.0/dependencies'); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/versions/downloads.js b/packages/crates-io-msw/handlers/versions/downloads.js index 112a6100809..d9151bec3d6 100644 --- a/packages/crates-io-msw/handlers/versions/downloads.js +++ b/packages/crates-io-msw/handlers/versions/downloads.js @@ -4,21 +4,18 @@ import { db } from '../../index.js'; import { notFound } from '../../utils/handlers.js'; export default http.get('/api/v1/crates/:name/:version/downloads', async ({ params }) => { - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) return notFound(); - let version = db.version.findFirst({ - where: { - crate: { id: { equals: crate.id } }, - num: { equals: params.version }, - }, - }); + let version = db.version.findFirst(q => + q.where(version => version.crate.id === crate.id && version.num === params.version), + ); if (!version) { let errorMessage = `crate \`${crate.name}\` does not have a version \`${params.version}\``; return HttpResponse.json({ errors: [{ detail: errorMessage }] }, { status: 404 }); } - let downloads = db.versionDownload.findMany({ where: { version: { id: { equals: version.id } } } }); + let downloads = db.versionDownload.findMany(q => q.where(download => download.version.id === version.id)); return HttpResponse.json({ version_downloads: downloads.map(download => ({ diff --git a/packages/crates-io-msw/handlers/versions/downloads.test.js b/packages/crates-io-msw/handlers/versions/downloads.test.js index acca83fd730..6d9e22818f1 100644 --- a/packages/crates-io-msw/handlers/versions/downloads.test.js +++ b/packages/crates-io-msw/handlers/versions/downloads.test.js @@ -9,7 +9,7 @@ test('returns 404 for unknown crates', async function () { }); test('returns 404 for unknown versions', async function () { - db.crate.create({ name: 'rand' }); + await db.crate.create({ name: 'rand' }); let response = await fetch('/api/v1/crates/rand/1.0.0/downloads'); assert.strictEqual(response.status, 404); @@ -17,8 +17,8 @@ test('returns 404 for unknown versions', async function () { }); test('empty case', async function () { - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ crate, num: '1.0.0' }); + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, num: '1.0.0' }); let response = await fetch('/api/v1/crates/rand/1.0.0/downloads'); assert.strictEqual(response.status, 200); @@ -28,11 +28,11 @@ test('empty case', async function () { }); test('returns a list of version downloads belonging to the specified crate version', async function () { - let crate = db.crate.create({ name: 'rand' }); - let version = db.version.create({ crate, num: '1.0.0' }); - db.versionDownload.create({ version, date: '2020-01-13' }); - db.versionDownload.create({ version, date: '2020-01-14' }); - db.versionDownload.create({ version, date: '2020-01-15' }); + let crate = await db.crate.create({ name: 'rand' }); + let version = await db.version.create({ crate, num: '1.0.0' }); + await db.versionDownload.create({ version, date: '2020-01-13' }); + await db.versionDownload.create({ version, date: '2020-01-14' }); + await db.versionDownload.create({ version, date: '2020-01-15' }); let response = await fetch('/api/v1/crates/rand/1.0.0/downloads'); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/versions/follow-updates.js b/packages/crates-io-msw/handlers/versions/follow-updates.js index 2007da5875c..05f944f31c1 100644 --- a/packages/crates-io-msw/handlers/versions/follow-updates.js +++ b/packages/crates-io-msw/handlers/versions/follow-updates.js @@ -12,7 +12,7 @@ export default http.get('/api/v1/me/updates', ({ request }) => { } let allVersions = user.followedCrates - .flatMap(crate => db.version.findMany({ where: { crate: { id: { equals: crate.id } } } })) + .flatMap(crate => db.version.findMany(q => q.where(version => version.crate.id === crate.id))) .sort((a, b) => b.id - a.id); let { start, end, page, perPage } = pageParams(request); diff --git a/packages/crates-io-msw/handlers/versions/follow-updates.test.js b/packages/crates-io-msw/handlers/versions/follow-updates.test.js index 614aa27adf4..f3c933f386b 100644 --- a/packages/crates-io-msw/handlers/versions/follow-updates.test.js +++ b/packages/crates-io-msw/handlers/versions/follow-updates.test.js @@ -11,14 +11,14 @@ test('returns 403 for unauthenticated user', async function () { }); test('returns latest versions of followed crates', async function () { - let foo = db.crate.create({ name: 'foo' }); - db.version.create({ crate: foo, num: '1.2.3' }); + let foo = await db.crate.create({ name: 'foo' }); + await db.version.create({ crate: foo, num: '1.2.3' }); - let bar = db.crate.create({ name: 'bar' }); - db.version.create({ crate: bar, num: '0.8.6' }); + let bar = await db.crate.create({ name: 'bar' }); + await db.version.create({ crate: bar, num: '0.8.6' }); - let user = db.user.create({ followedCrates: [foo] }); - db.mswSession.create({ user }); + let user = await db.user.create({ followedCrates: [foo] }); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/me/updates'); assert.strictEqual(response.status, 200); @@ -70,8 +70,8 @@ test('returns latest versions of followed crates', async function () { }); test('empty case', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/me/updates'); assert.strictEqual(response.status, 200); @@ -82,11 +82,11 @@ test('empty case', async function () { }); test('supports pagination', async function () { - let crate = db.crate.create({ name: 'foo' }); - Array.from({ length: 25 }, () => db.version.create({ crate })); + let crate = await db.crate.create({ name: 'foo' }); + await Promise.all(Array.from({ length: 25 }, () => db.version.create({ crate }))); - let user = db.user.create({ followedCrates: [crate] }); - db.mswSession.create({ user }); + let user = await db.user.create({ followedCrates: [crate] }); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/me/updates?page=2'); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/versions/get.js b/packages/crates-io-msw/handlers/versions/get.js index 114e3960728..fb89d73b048 100644 --- a/packages/crates-io-msw/handlers/versions/get.js +++ b/packages/crates-io-msw/handlers/versions/get.js @@ -5,15 +5,12 @@ import { serializeVersion } from '../../serializers/version.js'; import { notFound } from '../../utils/handlers.js'; export default http.get('/api/v1/crates/:name/:version', async ({ params }) => { - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) return notFound(); - let version = db.version.findFirst({ - where: { - crate: { id: { equals: crate.id } }, - num: { equals: params.version }, - }, - }); + let version = db.version.findFirst(q => + q.where(version => version.crate.id === crate.id && version.num === params.version), + ); if (!version) { let errorMessage = `crate \`${crate.name}\` does not have a version \`${params.version}\``; return HttpResponse.json({ errors: [{ detail: errorMessage }] }, { status: 404 }); diff --git a/packages/crates-io-msw/handlers/versions/get.test.js b/packages/crates-io-msw/handlers/versions/get.test.js index 9052552a345..a1d328e6663 100644 --- a/packages/crates-io-msw/handlers/versions/get.test.js +++ b/packages/crates-io-msw/handlers/versions/get.test.js @@ -9,8 +9,8 @@ test('returns 404 for unknown crates', async function () { }); test('returns 404 for unknown versions', async function () { - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ crate, num: '1.0.0-alpha.1' }); + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, num: '1.0.0-alpha.1' }); let response = await fetch('/api/v1/crates/rand/1.0.0-beta.1'); assert.strictEqual(response.status, 404); assert.deepEqual(await response.json(), { @@ -19,8 +19,8 @@ test('returns 404 for unknown versions', async function () { }); test('returns a version object for known version', async function () { - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ crate, num: '1.0.0-beta.1' }); + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, num: '1.0.0-beta.1' }); let response = await fetch('/api/v1/crates/rand/1.0.0-beta.1'); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/versions/list.js b/packages/crates-io-msw/handlers/versions/list.js index f67be0ace8b..5b984a9294f 100644 --- a/packages/crates-io-msw/handlers/versions/list.js +++ b/packages/crates-io-msw/handlers/versions/list.js @@ -8,10 +8,10 @@ import { calculateReleaseTracks } from '../../utils/release-tracks.js'; export default http.get('/api/v1/crates/:name/versions', async ({ request, params }) => { let { name } = params; - let crate = db.crate.findFirst({ where: { name: { equals: name } } }); + let crate = db.crate.findFirst(q => q.where({ name })); if (!crate) return notFound(); - let versions = db.version.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let versions = db.version.findMany(q => q.where(version => version.crate.id === crate.id)); let url = new URL(request.url); let nums = url.searchParams.getAll('nums[]'); diff --git a/packages/crates-io-msw/handlers/versions/list.test.js b/packages/crates-io-msw/handlers/versions/list.test.js index 9787cc239f5..919cb5d754b 100644 --- a/packages/crates-io-msw/handlers/versions/list.test.js +++ b/packages/crates-io-msw/handlers/versions/list.test.js @@ -9,7 +9,7 @@ test('returns 404 for unknown crates', async function () { }); test('empty case', async function () { - db.crate.create({ name: 'rand' }); + await db.crate.create({ name: 'rand' }); let response = await fetch('/api/v1/crates/rand/versions'); assert.strictEqual(response.status, 200); @@ -20,14 +20,14 @@ test('empty case', async function () { }); test('returns all versions belonging to the specified crate', async function () { - let user = db.user.create(); - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ crate, num: '1.0.0' }); - db.version.create({ crate, num: '1.1.0', publishedBy: user }); - db.version.create({ crate, num: '1.2.0', rust_version: '1.69' }); + let user = await db.user.create(); + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, num: '1.0.0' }); + await db.version.create({ crate, num: '1.1.0', publishedBy: user }); + await db.version.create({ crate, num: '1.2.0', rust_version: '1.69' }); let response = await fetch('/api/v1/crates/rand/versions'); - // assert.strictEqual(response.status, 200); + assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { versions: [ { @@ -156,11 +156,11 @@ test('returns all versions belonging to the specified crate', async function () }); test('supports `sort` parameters', async function () { - let user = db.user.create(); - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ crate, num: '1.0.0' }); - db.version.create({ crate, num: '2.0.0-alpha', publishedBy: user }); - db.version.create({ crate, num: '1.1.0', rust_version: '1.69' }); + let user = await db.user.create(); + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, num: '1.0.0' }); + await db.version.create({ crate, num: '2.0.0-alpha', publishedBy: user }); + await db.version.create({ crate, num: '1.1.0', rust_version: '1.69' }); // sort by `semver` by default { @@ -195,11 +195,11 @@ test('supports `sort` parameters', async function () { }); test('supports multiple `ids[]` parameters', async function () { - let user = db.user.create(); - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ crate, num: '1.0.0' }); - db.version.create({ crate, num: '1.1.0', publishedBy: user }); - db.version.create({ crate, num: '1.2.0', rust_version: '1.69' }); + let user = await db.user.create(); + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, num: '1.0.0' }); + await db.version.create({ crate, num: '1.1.0', publishedBy: user }); + await db.version.create({ crate, num: '1.2.0', rust_version: '1.69' }); let response = await fetch('/api/v1/crates/rand/versions?nums[]=1.0.0&nums[]=1.2.0'); assert.strictEqual(response.status, 200); let json = await response.json(); @@ -210,11 +210,11 @@ test('supports multiple `ids[]` parameters', async function () { }); test('supports seek pagination', async function () { - let user = db.user.create(); - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ crate, num: '1.0.0' }); - db.version.create({ crate, num: '2.0.0-alpha', publishedBy: user }); - db.version.create({ crate, num: '1.1.0', rust_version: '1.69' }); + let user = await db.user.create(); + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, num: '1.0.0' }); + await db.version.create({ crate, num: '2.0.0-alpha', publishedBy: user }); + await db.version.create({ crate, num: '1.1.0', rust_version: '1.69' }); async function seek_forwards(queryParams) { let calls = 0; @@ -289,19 +289,19 @@ test('supports seek pagination', async function () { }); test('include `release_tracks` meta', async function () { - let user = db.user.create(); - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ crate, num: '0.0.1' }); - db.version.create({ crate, num: '0.0.2', yanked: true }); - db.version.create({ crate, num: '1.0.0' }); - db.version.create({ crate, num: '1.1.0', publishedBy: user }); - db.version.create({ crate, num: '1.2.0', rust_version: '1.69', yanked: true }); + let user = await db.user.create(); + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, num: '0.0.1' }); + await db.version.create({ crate, num: '0.0.2', yanked: true }); + await db.version.create({ crate, num: '1.0.0' }); + await db.version.create({ crate, num: '1.1.0', publishedBy: user }); + await db.version.create({ crate, num: '1.2.0', rust_version: '1.69', yanked: true }); let req = await fetch('/api/v1/crates/rand/versions'); let expected = await req.json(); let response = await fetch('/api/v1/crates/rand/versions?include=release_tracks'); - // assert.strictEqual(response.status, 200); + assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { ...expected, meta: { diff --git a/packages/crates-io-msw/handlers/versions/patch.js b/packages/crates-io-msw/handlers/versions/patch.js index efdbeb84f57..9863b37b87e 100644 --- a/packages/crates-io-msw/handlers/versions/patch.js +++ b/packages/crates-io-msw/handlers/versions/patch.js @@ -11,15 +11,12 @@ export default http.patch('/api/v1/crates/:name/:version', async ({ request, par return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 }); } - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) return notFound(); - let version = db.version.findFirst({ - where: { - crate: { id: { equals: crate.id } }, - num: { equals: params.version }, - }, - }); + let version = db.version.findFirst(q => + q.where(version => version.crate.id === crate.id && version.num === params.version), + ); if (!version) return notFound(); let body = await request.json(); @@ -27,11 +24,10 @@ export default http.patch('/api/v1/crates/:name/:version', async ({ request, par let yanked = body.version.yanked; let yankMessage = body.version.yank_message; - version = db.version.update({ - where: { id: { equals: version.id } }, - data: { - yanked: yanked, - yank_message: yanked ? yankMessage || null : null, + version = await db.version.update(q => q.where({ id: version.id }), { + data(version) { + version.yanked = yanked; + version.yank_message = yanked ? yankMessage || null : null; }, }); diff --git a/packages/crates-io-msw/handlers/versions/patch.test.js b/packages/crates-io-msw/handlers/versions/patch.test.js index c2b5531fd6e..c1154b81903 100644 --- a/packages/crates-io-msw/handlers/versions/patch.test.js +++ b/packages/crates-io-msw/handlers/versions/patch.test.js @@ -24,8 +24,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 404 for unknown crates', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: YANK_BODY }); assert.strictEqual(response.status, 404); @@ -33,10 +33,10 @@ test('returns 404 for unknown crates', async function () { }); test('returns 404 for unknown versions', async function () { - db.crate.create({ name: 'foo' }); + await db.crate.create({ name: 'foo' }); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: YANK_BODY }); assert.strictEqual(response.status, 404); @@ -44,13 +44,13 @@ test('returns 404 for unknown versions', async function () { }); test('yanks the version', async function () { - let crate = db.crate.create({ name: 'foo' }); - let version = db.version.create({ crate, num: '1.0.0', yanked: false }); + let crate = await db.crate.create({ name: 'foo' }); + let version = await db.version.create({ crate, num: '1.0.0', yanked: false }); assert.strictEqual(version.yanked, false); assert.strictEqual(version.yank_message, null); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/1.0.0', { method: 'PATCH', body: YANK_BODY }); assert.strictEqual(response.status, 200); @@ -95,7 +95,7 @@ test('yanks the version', async function () { }, }); - version = db.version.findFirst({ where: { id: { equals: version.id } } }); + version = db.version.findFirst(q => q.where({ id: version.id })); assert.strictEqual(version.yanked, true); assert.strictEqual(version.yank_message, 'some reason'); @@ -142,7 +142,7 @@ test('yanks the version', async function () { }, }); - version = db.version.findFirst({ where: { id: { equals: version.id } } }); + version = db.version.findFirst(q => q.where({ id: version.id })); assert.strictEqual(version.yanked, false); assert.strictEqual(version.yank_message, null); }); diff --git a/packages/crates-io-msw/handlers/versions/readme.js b/packages/crates-io-msw/handlers/versions/readme.js index 925f486db75..8782da55b65 100644 --- a/packages/crates-io-msw/handlers/versions/readme.js +++ b/packages/crates-io-msw/handlers/versions/readme.js @@ -3,15 +3,12 @@ import { http, HttpResponse } from 'msw'; import { db } from '../../index.js'; export default http.get('/api/v1/crates/:name/:version/readme', async ({ params }) => { - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) return HttpResponse.html('', { status: 403 }); - let version = db.version.findFirst({ - where: { - crate: { id: { equals: crate.id } }, - num: { equals: params.version }, - }, - }); + let version = db.version.findFirst(q => + q.where(version => version.crate.id === crate.id && version.num === params.version), + ); if (!version || !version.readme) return HttpResponse.html('', { status: 403 }); return HttpResponse.html(version.readme); diff --git a/packages/crates-io-msw/handlers/versions/readme.test.js b/packages/crates-io-msw/handlers/versions/readme.test.js index 3bedd28af9c..a15d957c38f 100644 --- a/packages/crates-io-msw/handlers/versions/readme.test.js +++ b/packages/crates-io-msw/handlers/versions/readme.test.js @@ -9,7 +9,7 @@ test('returns 404 for unknown crates', async function () { }); test('returns 404 for unknown versions', async function () { - db.crate.create({ name: 'rand' }); + await db.crate.create({ name: 'rand' }); let response = await fetch('/api/v1/crates/rand/1.0.0/readme'); assert.strictEqual(response.status, 403); @@ -17,8 +17,8 @@ test('returns 404 for unknown versions', async function () { }); test('returns 404 for versions without README', async function () { - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ crate, num: '1.0.0' }); + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, num: '1.0.0' }); let response = await fetch('/api/v1/crates/rand/1.0.0/readme'); assert.strictEqual(response.status, 403); @@ -28,8 +28,8 @@ test('returns 404 for versions without README', async function () { test('returns the README as raw HTML', async function () { let readme = 'lorem ipsum est dolor!'; - let crate = db.crate.create({ name: 'rand' }); - db.version.create({ crate, num: '1.0.0', readme: readme }); + let crate = await db.crate.create({ name: 'rand' }); + await db.version.create({ crate, num: '1.0.0', readme: readme }); let response = await fetch('/api/v1/crates/rand/1.0.0/readme'); assert.strictEqual(response.status, 200); diff --git a/packages/crates-io-msw/handlers/versions/rebuild-docs.js b/packages/crates-io-msw/handlers/versions/rebuild-docs.js index 658c60c8e5b..cc2aa6ac9d3 100644 --- a/packages/crates-io-msw/handlers/versions/rebuild-docs.js +++ b/packages/crates-io-msw/handlers/versions/rebuild-docs.js @@ -10,15 +10,12 @@ export default http.post('/api/v1/crates/:name/:version/rebuild_docs', async ({ return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 }); } - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) return notFound(); - let version = db.version.findFirst({ - where: { - crate: { id: { equals: crate.id } }, - num: { equals: params.version }, - }, - }); + let version = db.version.findFirst(q => + q.where(version => version.crate.id === crate.id && version.num === params.version), + ); if (!version) return notFound(); return new HttpResponse(null, { status: 201 }); diff --git a/packages/crates-io-msw/handlers/versions/rebuild-docs.test.js b/packages/crates-io-msw/handlers/versions/rebuild-docs.test.js index d9592edd088..c0b1b9095cf 100644 --- a/packages/crates-io-msw/handlers/versions/rebuild-docs.test.js +++ b/packages/crates-io-msw/handlers/versions/rebuild-docs.test.js @@ -11,8 +11,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 404 for unknown crates', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/1.0.0/rebuild_docs', { method: 'POST' }); assert.strictEqual(response.status, 404); @@ -20,10 +20,10 @@ test('returns 404 for unknown crates', async function () { }); test('returns 404 for unknown versions', async function () { - db.crate.create({ name: 'foo' }); + await db.crate.create({ name: 'foo' }); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/1.0.0/rebuild_docs', { method: 'POST' }); assert.strictEqual(response.status, 404); @@ -31,11 +31,11 @@ test('returns 404 for unknown versions', async function () { }); test('triggers a rebuild for the crate documentation', async function () { - let crate = db.crate.create({ name: 'foo' }); - db.version.create({ crate, num: '1.0.0' }); + let crate = await db.crate.create({ name: 'foo' }); + await db.version.create({ crate, num: '1.0.0' }); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/1.0.0/rebuild_docs', { method: 'POST' }); assert.strictEqual(response.status, 201); diff --git a/packages/crates-io-msw/handlers/versions/unyank.js b/packages/crates-io-msw/handlers/versions/unyank.js index 4947744c7a8..aca5d89f966 100644 --- a/packages/crates-io-msw/handlers/versions/unyank.js +++ b/packages/crates-io-msw/handlers/versions/unyank.js @@ -10,18 +10,20 @@ export default http.put('/api/v1/crates/:name/:version/unyank', async ({ params return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 }); } - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) return notFound(); - let version = db.version.findFirst({ - where: { - crate: { id: { equals: crate.id } }, - num: { equals: params.version }, - }, - }); + let version = db.version.findFirst(q => + q.where(version => version.crate.id === crate.id && version.num === params.version), + ); if (!version) return notFound(); - db.version.update({ where: { id: { equals: version.id } }, data: { yanked: false, yank_message: null } }); + await db.version.update(q => q.where({ id: version.id }), { + data(version) { + version.yanked = false; + version.yank_message = null; + }, + }); return HttpResponse.json({ ok: true }); }); diff --git a/packages/crates-io-msw/handlers/versions/unyank.test.js b/packages/crates-io-msw/handlers/versions/unyank.test.js index 0e461269a8e..4bc4dcbfaa7 100644 --- a/packages/crates-io-msw/handlers/versions/unyank.test.js +++ b/packages/crates-io-msw/handlers/versions/unyank.test.js @@ -11,8 +11,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 404 for unknown crates', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/1.0.0/unyank', { method: 'PUT' }); assert.strictEqual(response.status, 404); @@ -20,10 +20,10 @@ test('returns 404 for unknown crates', async function () { }); test('returns 404 for unknown versions', async function () { - db.crate.create({ name: 'foo' }); + await db.crate.create({ name: 'foo' }); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/1.0.0/unyank', { method: 'PUT' }); assert.strictEqual(response.status, 404); @@ -31,19 +31,19 @@ test('returns 404 for unknown versions', async function () { }); test('unyanks the version', async function () { - let crate = db.crate.create({ name: 'foo' }); - let version = db.version.create({ crate, num: '1.0.0', yanked: true, yank_message: 'some reason' }); + let crate = await db.crate.create({ name: 'foo' }); + let version = await db.version.create({ crate, num: '1.0.0', yanked: true, yank_message: 'some reason' }); assert.strictEqual(version.yanked, true); assert.strictEqual(version.yank_message, 'some reason'); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/1.0.0/unyank', { method: 'PUT' }); assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { ok: true }); - version = db.version.findFirst({ where: { id: version.id } }); + version = db.version.findFirst(q => q.where({ id: version.id })); assert.strictEqual(version.yanked, false); assert.strictEqual(version.yank_message, null); }); diff --git a/packages/crates-io-msw/handlers/versions/yank.js b/packages/crates-io-msw/handlers/versions/yank.js index e29092ebe87..6f6345794fb 100644 --- a/packages/crates-io-msw/handlers/versions/yank.js +++ b/packages/crates-io-msw/handlers/versions/yank.js @@ -10,18 +10,19 @@ export default http.delete('/api/v1/crates/:name/:version/yank', async ({ params return HttpResponse.json({ errors: [{ detail: 'must be logged in to perform that action' }] }, { status: 403 }); } - let crate = db.crate.findFirst({ where: { name: { equals: params.name } } }); + let crate = db.crate.findFirst(q => q.where({ name: params.name })); if (!crate) return notFound(); - let version = db.version.findFirst({ - where: { - crate: { id: { equals: crate.id } }, - num: { equals: params.version }, - }, - }); + let version = db.version.findFirst(q => + q.where(version => version.crate.id === crate.id && version.num === params.version), + ); if (!version) return notFound(); - db.version.update({ where: { id: { equals: version.id } }, data: { yanked: true } }); + await db.version.update(q => q.where({ id: version.id }), { + data(version) { + version.yanked = true; + }, + }); return HttpResponse.json({ ok: true }); }); diff --git a/packages/crates-io-msw/handlers/versions/yank.test.js b/packages/crates-io-msw/handlers/versions/yank.test.js index 49d8caa00ae..f4e5bb548b1 100644 --- a/packages/crates-io-msw/handlers/versions/yank.test.js +++ b/packages/crates-io-msw/handlers/versions/yank.test.js @@ -11,8 +11,8 @@ test('returns 403 if unauthenticated', async function () { }); test('returns 404 for unknown crates', async function () { - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/1.0.0/yank', { method: 'DELETE' }); assert.strictEqual(response.status, 404); @@ -20,10 +20,10 @@ test('returns 404 for unknown crates', async function () { }); test('returns 404 for unknown versions', async function () { - db.crate.create({ name: 'foo' }); + await db.crate.create({ name: 'foo' }); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/1.0.0/yank', { method: 'DELETE' }); assert.strictEqual(response.status, 404); @@ -31,17 +31,17 @@ test('returns 404 for unknown versions', async function () { }); test('yanks the version', async function () { - let crate = db.crate.create({ name: 'foo' }); - let version = db.version.create({ crate, num: '1.0.0', yanked: false }); + let crate = await db.crate.create({ name: 'foo' }); + let version = await db.version.create({ crate, num: '1.0.0', yanked: false }); assert.strictEqual(version.yanked, false); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); let response = await fetch('/api/v1/crates/foo/1.0.0/yank', { method: 'DELETE' }); assert.strictEqual(response.status, 200); assert.deepEqual(await response.json(), { ok: true }); - version = db.version.findFirst({ where: { id: version.id } }); + version = db.version.findFirst(q => q.where({ id: version.id })); assert.strictEqual(version.yanked, true); }); diff --git a/packages/crates-io-msw/models/crate-ownership.test.js b/packages/crates-io-msw/models/crate-ownership.test.js index f75ef875352..58c71acc5fa 100644 --- a/packages/crates-io-msw/models/crate-ownership.test.js +++ b/packages/crates-io-msw/models/crate-ownership.test.js @@ -4,19 +4,25 @@ import { db } from '../index.js'; test('throws if `crate` is not set', async ({ expect }) => { let user = await db.user.create(); - await expect(() => db.crateOwnership.create({ user })).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Missing \`crate\` relationship on \`crate-ownership\`]`); + await expect(() => db.crateOwnership.create({ user })).rejects.toThrowErrorMatchingInlineSnapshot( + `[Error: Missing \`crate\` relationship on \`crate-ownership\`]`, + ); }); test('throws if `team` and `user` are not set', async ({ expect }) => { let crate = await db.crate.create(); - await expect(() => db.crateOwnership.create({ crate })).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Missing \`team\` or \`user\` relationship on \`crate-ownership\`]`); + await expect(() => db.crateOwnership.create({ crate })).rejects.toThrowErrorMatchingInlineSnapshot( + `[Error: Missing \`team\` or \`user\` relationship on \`crate-ownership\`]`, + ); }); test('throws if `team` and `user` are both set', async ({ expect }) => { let crate = await db.crate.create(); let team = await db.team.create(); let user = await db.user.create(); - await expect(() => db.crateOwnership.create({ crate, team, user })).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: \`team\` and \`user\` on a \`crate-ownership\` are mutually exclusive]`); + await expect(() => db.crateOwnership.create({ crate, team, user })).rejects.toThrowErrorMatchingInlineSnapshot( + `[Error: \`team\` and \`user\` on a \`crate-ownership\` are mutually exclusive]`, + ); }); test('can set `team`', async ({ expect }) => { diff --git a/packages/crates-io-msw/models/dependency.test.js b/packages/crates-io-msw/models/dependency.test.js index 816bcdd2eec..3b5d07cefb6 100644 --- a/packages/crates-io-msw/models/dependency.test.js +++ b/packages/crates-io-msw/models/dependency.test.js @@ -4,12 +4,16 @@ import { db } from '../index.js'; test('throws if `crate` is not set', async ({ expect }) => { let version = await db.version.create({ crate: await db.crate.create() }); - await expect(() => db.dependency.create({ version })).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Missing \`crate\` relationship on \`dependency:1\`]`); + await expect(() => db.dependency.create({ version })).rejects.toThrowErrorMatchingInlineSnapshot( + `[Error: Missing \`crate\` relationship on \`dependency:1\`]`, + ); }); test('throws if `version` is not set', async ({ expect }) => { let crate = await db.crate.create(); - await expect(() => db.dependency.create({ crate })).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Missing \`version\` relationship on \`dependency:1\`]`); + await expect(() => db.dependency.create({ crate })).rejects.toThrowErrorMatchingInlineSnapshot( + `[Error: Missing \`version\` relationship on \`dependency:1\`]`, + ); }); test('happy path', async ({ expect }) => { diff --git a/packages/crates-io-msw/models/index.js b/packages/crates-io-msw/models/index.js index 10dd76184a0..c6d1c928370 100644 --- a/packages/crates-io-msw/models/index.js +++ b/packages/crates-io-msw/models/index.js @@ -14,9 +14,9 @@ import versionDownloads from './version-download.js'; import versions from './version.js'; // Define relations -users.defineRelations(({ many }) => ({ - followedCrates: many(crates), -})); +// users.defineRelations(({ many }) => ({ +// followedCrates: many(crates), +// })); crates.defineRelations(({ many }) => ({ categories: many(categories), @@ -84,7 +84,7 @@ export const db = { reset() { for (let collection of Object.values(this)) { if (collection?.deleteMany) { - collection.deleteMany(q => q.where(() => true)); + collection.deleteMany(null); } if (collection?.__counter) { diff --git a/packages/crates-io-msw/models/msw-session.test.js b/packages/crates-io-msw/models/msw-session.test.js index fd480ece1da..c2630f54aa5 100644 --- a/packages/crates-io-msw/models/msw-session.test.js +++ b/packages/crates-io-msw/models/msw-session.test.js @@ -3,7 +3,9 @@ import { test } from 'vitest'; import { db } from '../index.js'; test('throws if `user` is not set', async ({ expect }) => { - await expect(() => db.mswSession.create()).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Missing \`user\` relationship]`); + await expect(() => db.mswSession.create()).rejects.toThrowErrorMatchingInlineSnapshot( + `[Error: Missing \`user\` relationship]`, + ); }); test('happy path', async ({ expect }) => { diff --git a/packages/crates-io-msw/models/version-download.test.js b/packages/crates-io-msw/models/version-download.test.js index f6b2e3b2e19..69a8188c61c 100644 --- a/packages/crates-io-msw/models/version-download.test.js +++ b/packages/crates-io-msw/models/version-download.test.js @@ -3,7 +3,9 @@ import { test } from 'vitest'; import { db } from '../index.js'; test('throws if `version` is not set', async ({ expect }) => { - await expect(() => db.versionDownload.create()).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Missing \`version\` relationship on \`version-download\`]`); + await expect(() => db.versionDownload.create()).rejects.toThrowErrorMatchingInlineSnapshot( + `[Error: Missing \`version\` relationship on \`version-download\`]`, + ); }); test('happy path', async ({ expect }) => { diff --git a/packages/crates-io-msw/serializers/category.js b/packages/crates-io-msw/serializers/category.js index 5960b99038f..c005efba932 100644 --- a/packages/crates-io-msw/serializers/category.js +++ b/packages/crates-io-msw/serializers/category.js @@ -4,7 +4,8 @@ import { serializeModel } from '../utils/serializers.js'; export function serializeCategory(category) { let serialized = serializeModel(category); - serialized.crates_cnt ??= db.crate.count({ where: { categories: { id: { equals: category.id } } } }); + const crateCount = db.crate.findMany(q => q.where(crate => crate.categories.some(c => c.id === category.id))).length; + serialized.crates_cnt ??= crateCount; return serialized; } diff --git a/packages/crates-io-msw/serializers/crate.js b/packages/crates-io-msw/serializers/crate.js index 5b21db89192..dbb77aee268 100644 --- a/packages/crates-io-msw/serializers/crate.js +++ b/packages/crates-io-msw/serializers/crate.js @@ -9,7 +9,7 @@ export function serializeCrate( crate, { calculateVersions = true, includeCategories = false, includeKeywords = false, includeVersions = false } = {}, ) { - let versions = db.version.findMany({ where: { crate: { id: { equals: crate.id } } } }); + let versions = db.version.findMany(q => q.where({ crate: { id: crate.id } })); if (versions.length === 0) { throw new Error(`crate \`${crate.name}\` has no associated versions`); } diff --git a/packages/crates-io-msw/serializers/keyword.js b/packages/crates-io-msw/serializers/keyword.js index fce2cb0122b..d196b70f027 100644 --- a/packages/crates-io-msw/serializers/keyword.js +++ b/packages/crates-io-msw/serializers/keyword.js @@ -4,7 +4,9 @@ import { serializeModel } from '../utils/serializers.js'; export function serializeKeyword(keyword) { let serialized = serializeModel(keyword); - serialized.crates_cnt = db.crate.count({ where: { keywords: { id: { equals: keyword.id } } } }); + serialized.crates_cnt = db.crate.findMany(q => + q.where(crate => crate.keywords.some(k => k.id === keyword.id)), + ).length; return serialized; } diff --git a/packages/crates-io-msw/utils/session.js b/packages/crates-io-msw/utils/session.js index 31e0d27f77d..493ae7e981f 100644 --- a/packages/crates-io-msw/utils/session.js +++ b/packages/crates-io-msw/utils/session.js @@ -1,7 +1,7 @@ import { db } from '../index.js'; export function getSession() { - let session = db.mswSession.findFirst({}); + let session = db.mswSession.findFirst(null); if (!session) { return {}; } diff --git a/tests/acceptance/api-token-test.js b/tests/acceptance/api-token-test.js index 891b86172ba..bd49829fdc0 100644 --- a/tests/acceptance/api-token-test.js +++ b/tests/acceptance/api-token-test.js @@ -92,7 +92,11 @@ module('Acceptance | api-tokens', function (hooks) { assert.dom('[data-test-api-token]').exists({ count: 3 }); await click('[data-test-api-token="1"] [data-test-revoke-token-button]'); - assert.strictEqual(this.db.apiToken.findMany({}).length, 2, 'API token has been deleted from the backend database'); + assert.strictEqual( + this.db.apiToken.findMany(null).length, + 2, + 'API token has been deleted from the backend database', + ); assert.dom('[data-test-api-token]').exists({ count: 2 }); assert.dom('[data-test-api-token="2"]').exists(); From 55691dee5e3fa1d212ed4c78dac2321303aa3781 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 26 Nov 2025 16:06:08 +0100 Subject: [PATCH 5/6] msw: Migrate QUnit test suite to new `@msw/data` API --- tests/acceptance/api-token-test.js | 30 +-- tests/acceptance/categories-test.js | 18 +- tests/acceptance/crate-deletion-test.js | 14 +- tests/acceptance/crate-dependencies-test.js | 30 +-- tests/acceptance/crate-following-test.js | 20 +- tests/acceptance/crate-navtabs-test.js | 4 +- tests/acceptance/crate-test.js | 80 ++++---- tests/acceptance/crates-test.js | 20 +- tests/acceptance/dashboard-test.js | 48 ++--- tests/acceptance/dev-mode-test.js | 12 +- tests/acceptance/email-change-test.js | 32 ++-- tests/acceptance/email-confirmation-test.js | 10 +- tests/acceptance/front-page-test.js | 2 +- tests/acceptance/invites-test.js | 94 +++------- tests/acceptance/keyword-test.js | 2 +- tests/acceptance/login-test.js | 6 +- tests/acceptance/logout-test.js | 4 +- .../acceptance/publish-notifications-test.js | 12 +- tests/acceptance/readme-rendering-test.js | 12 +- tests/acceptance/rebuild-docs-test.js | 38 ++-- tests/acceptance/reverse-dependencies-test.js | 30 +-- tests/acceptance/search-test.js | 20 +- tests/acceptance/settings/add-owner-test.js | 38 ++-- .../acceptance/settings/remove-owner-test.js | 32 ++-- tests/acceptance/settings/settings-test.js | 28 +-- tests/acceptance/sudo-test.js | 24 +-- tests/acceptance/support-test.js | 6 +- tests/acceptance/team-page-test.js | 6 +- tests/acceptance/token-invites-test.js | 10 +- tests/acceptance/user-page-test.js | 6 +- tests/acceptance/versions-test.js | 26 +-- tests/adapters/crate-test.js | 18 +- tests/bugs/11772-test.js | 12 +- tests/bugs/4506-test.js | 16 +- tests/components/crate-row-test.gjs | 24 +-- .../crate-sidebar/playground-button-test.gjs | 16 +- .../crate-sidebar/toml-snippet-test.gjs | 12 +- tests/components/owners-list-test.gjs | 44 ++--- tests/components/privileged-action-test.gjs | 24 +-- tests/components/version-list-row-test.gjs | 24 +-- tests/helpers/setup-msw.js | 4 +- tests/models/crate-test.js | 66 +++---- tests/models/trustpub-github-config-test.js | 100 +++++----- tests/models/user-test.js | 16 +- tests/models/version-test.js | 56 +++--- tests/routes/category-test.js | 2 +- tests/routes/crate/delete-test.js | 38 ++-- tests/routes/crate/range-test.js | 64 +++---- tests/routes/crate/settings-test.js | 176 ++++++++++-------- .../settings/new-trusted-publisher-test.js | 91 ++++----- .../routes/crate/version/crate-links-test.js | 16 +- tests/routes/crate/version/docs-link-test.js | 28 +-- tests/routes/crate/version/model-test.js | 54 +++--- tests/routes/me/crates-test.js | 4 +- tests/routes/settings/tokens/index-test.js | 14 +- tests/routes/settings/tokens/new-test.js | 48 ++--- 56 files changed, 833 insertions(+), 848 deletions(-) diff --git a/tests/acceptance/api-token-test.js b/tests/acceptance/api-token-test.js index bd49829fdc0..3958907622c 100644 --- a/tests/acceptance/api-token-test.js +++ b/tests/acceptance/api-token-test.js @@ -11,22 +11,22 @@ import { visit } from '../helpers/visit-ignoring-abort'; module('Acceptance | api-tokens', function (hooks) { setupApplicationTest(hooks); - function prepare(context) { - let user = context.db.user.create({ + async function prepare(context) { + let user = await context.db.user.create({ login: 'johnnydee', name: 'John Doe', email: 'john@doe.com', avatar: 'https://avatars2.githubusercontent.com/u/1234567?v=4', }); - context.db.apiToken.create({ + await context.db.apiToken.create({ user, name: 'foo', createdAt: '2017-08-01T12:34:56', lastUsedAt: '2017-11-02T01:45:14', }); - context.db.apiToken.create({ + await context.db.apiToken.create({ user, name: 'BAR', createdAt: '2017-11-19T17:59:22', @@ -34,7 +34,7 @@ module('Acceptance | api-tokens', function (hooks) { expiredAt: '2017-12-19T17:59:22', }); - context.db.apiToken.create({ + await context.db.apiToken.create({ user, name: 'recently expired', createdAt: '2017-08-01T12:34:56', @@ -42,11 +42,11 @@ module('Acceptance | api-tokens', function (hooks) { expiredAt: '2017-11-19T17:59:22', }); - context.authenticateAs(user); + await context.authenticateAs(user); } test('/me is showing the list of active API tokens', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens'); assert.strictEqual(currentURL(), '/settings/tokens'); @@ -85,7 +85,7 @@ module('Acceptance | api-tokens', function (hooks) { }); test('API tokens can be revoked', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens'); assert.strictEqual(currentURL(), '/settings/tokens'); @@ -104,7 +104,7 @@ module('Acceptance | api-tokens', function (hooks) { }); test('API tokens can be regenerated', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens'); assert.strictEqual(currentURL(), '/settings/tokens'); @@ -124,7 +124,7 @@ module('Acceptance | api-tokens', function (hooks) { }); test('failed API tokens revocation shows an error', async function (assert) { - prepare(this); + await prepare(this); this.worker.use( http.delete('/api/v1/me/tokens/:id', function () { @@ -146,7 +146,7 @@ module('Acceptance | api-tokens', function (hooks) { }); test('new API tokens can be created', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens'); assert.strictEqual(currentURL(), '/settings/tokens'); @@ -161,7 +161,7 @@ module('Acceptance | api-tokens', function (hooks) { await click('[data-test-generate]'); - let token = this.db.apiToken.findFirst({ where: { name: { equals: 'the new token' } } }); + let token = this.db.apiToken.findFirst(q => q.where({ name: 'the new token' })); assert.ok(Boolean(token), 'API token has been created in the backend database'); assert.dom('[data-test-api-token="4"] [data-test-name]').hasText('the new token'); @@ -173,7 +173,7 @@ module('Acceptance | api-tokens', function (hooks) { }); test('API tokens are only visible in plaintext until the page is left', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens'); await click('[data-test-new-token-button]'); @@ -181,7 +181,7 @@ module('Acceptance | api-tokens', function (hooks) { await click('[data-test-scope="publish-update"]'); await click('[data-test-generate]'); - let token = this.db.apiToken.findFirst({ where: { name: { equals: 'the new token' } } }); + let token = this.db.apiToken.findFirst(q => q.where({ name: 'the new token' })); assert.dom('[data-test-token]').hasText(token.token); // leave the API tokens page @@ -193,7 +193,7 @@ module('Acceptance | api-tokens', function (hooks) { }); test('navigating away while creating a token does not keep it in the list', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens'); assert.dom('[data-test-api-token]').exists({ count: 3 }); diff --git a/tests/acceptance/categories-test.js b/tests/acceptance/categories-test.js index eb53d30d54e..01974ed31b1 100644 --- a/tests/acceptance/categories-test.js +++ b/tests/acceptance/categories-test.js @@ -14,12 +14,12 @@ module('Acceptance | categories', function (hooks) { test('listing categories', async function (assert) { this.owner.lookup('service:intl').locale = 'en'; - this.db.category.create({ category: 'API bindings' }); - let algos = this.db.category.create({ category: 'Algorithms' }); - this.db.crate.create({ categories: [algos] }); - let async = this.db.category.create({ category: 'Asynchronous' }); + await this.db.category.create({ category: 'API bindings' }); + let algos = await this.db.category.create({ category: 'Algorithms' }); + await this.db.crate.create({ categories: [algos] }); + let async = await this.db.category.create({ category: 'Asynchronous' }); Array.from({ length: 15 }, () => this.db.crate.create({ categories: [async] })); - this.db.category.create({ category: 'Everything', crates_cnt: 1234 }); + await this.db.category.create({ category: 'Everything', crates_cnt: 1234 }); await visit('/categories'); @@ -35,14 +35,14 @@ module('Acceptance | categories', function (hooks) { test('listing categories (locale: de)', async function (assert) { this.owner.lookup('service:intl').locale = 'de'; - this.db.category.create({ category: 'Everything', crates_cnt: 1234 }); + await this.db.category.create({ category: 'Everything', crates_cnt: 1234 }); await visit('/categories'); assert.dom('[data-test-category="everything"] [data-test-crate-count]').hasText('1.234 crates'); }); test('category/:category_id index default sort is recent-downloads', async function (assert) { - this.db.category.create({ category: 'Algorithms' }); + await this.db.category.create({ category: 'Algorithms' }); await visit('/categories/algorithms'); @@ -53,8 +53,8 @@ module('Acceptance | categories', function (hooks) { }); test('listing category slugs', async function (assert) { - this.db.category.create({ category: 'Algorithms', description: 'Crates for algorithms' }); - this.db.category.create({ category: 'Asynchronous', description: 'Async crates' }); + await this.db.category.create({ category: 'Algorithms', description: 'Crates for algorithms' }); + await this.db.category.create({ category: 'Asynchronous', description: 'Async crates' }); await visit('/category_slugs'); diff --git a/tests/acceptance/crate-deletion-test.js b/tests/acceptance/crate-deletion-test.js index 3fb82c2af4c..d03d0fca0df 100644 --- a/tests/acceptance/crate-deletion-test.js +++ b/tests/acceptance/crate-deletion-test.js @@ -9,12 +9,12 @@ module('Acceptance | crate deletion', function (hooks) { setupApplicationTest(hooks); test('happy path', async function (assert) { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate }); - this.db.crateOwnership.create({ crate, user }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate }); + await this.db.crateOwnership.create({ crate, user }); await visit('/crates/foo'); assert.strictEqual(currentURL(), '/crates/foo'); @@ -39,7 +39,7 @@ module('Acceptance | crate deletion', function (hooks) { let message = 'Crate foo has been successfully deleted.'; assert.dom('[data-test-notification-message="success"]').hasText(message); - crate = this.db.crate.findFirst({ where: { name: { equals: 'foo' } } }); - assert.strictEqual(crate, null); + crate = this.db.crate.findFirst(q => q.where({ name: 'foo' })); + assert.strictEqual(crate, undefined); }); }); diff --git a/tests/acceptance/crate-dependencies-test.js b/tests/acceptance/crate-dependencies-test.js index 61746a5e230..a3ee1233581 100644 --- a/tests/acceptance/crate-dependencies-test.js +++ b/tests/acceptance/crate-dependencies-test.js @@ -16,7 +16,7 @@ module('Acceptance | crate dependencies page', function (hooks) { setupApplicationTest(hooks); test('shows the lists of dependencies', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates/nanomsg/dependencies'); assert.strictEqual(currentURL(), '/crates/nanomsg/0.6.1/dependencies'); @@ -31,8 +31,8 @@ module('Acceptance | crate dependencies page', function (hooks) { }); test('empty list case', async function (assert) { - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.version.create({ crate, num: '0.6.1' }); + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.version.create({ crate, num: '0.6.1' }); await visit('/crates/nanomsg/dependencies'); @@ -63,8 +63,8 @@ module('Acceptance | crate dependencies page', function (hooks) { }); test('shows an error page if version is not found', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '2.0.0' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '2.0.0' }); await visit('/crates/foo/1.0.0/dependencies'); assert.strictEqual(currentURL(), '/crates/foo/1.0.0/dependencies'); @@ -75,8 +75,8 @@ module('Acceptance | crate dependencies page', function (hooks) { }); test('shows error message if loading of dependencies fails', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); this.worker.use( http.get('/api/v1/crates/:crate_name/:version_num/dependencies', () => HttpResponse.json({}, { status: 500 })), @@ -91,16 +91,16 @@ module('Acceptance | crate dependencies page', function (hooks) { }); test('hides description if loading of dependency details fails', async function (assert) { - let crate = this.db.crate.create({ name: 'nanomsg' }); - let version = this.db.version.create({ crate, num: '0.6.1' }); + let crate = await this.db.crate.create({ name: 'nanomsg' }); + let version = await this.db.version.create({ crate, num: '0.6.1' }); - let foo = this.db.crate.create({ name: 'foo', description: 'This is the foo crate' }); - this.db.version.create({ crate: foo, num: '1.0.0' }); - this.db.dependency.create({ crate: foo, version, req: '^1.0.0', kind: 'normal' }); + let foo = await this.db.crate.create({ name: 'foo', description: 'This is the foo crate' }); + await this.db.version.create({ crate: foo, num: '1.0.0' }); + await this.db.dependency.create({ crate: foo, version, req: '^1.0.0', kind: 'normal' }); - let bar = this.db.crate.create({ name: 'bar', description: 'This is the bar crate' }); - this.db.version.create({ crate: bar, num: '2.3.4' }); - this.db.dependency.create({ crate: bar, version, req: '^2.0.0', kind: 'normal' }); + let bar = await this.db.crate.create({ name: 'bar', description: 'This is the bar crate' }); + await this.db.version.create({ crate: bar, num: '2.3.4' }); + await this.db.dependency.create({ crate: bar, version, req: '^2.0.0', kind: 'normal' }); this.worker.use(http.get('/api/v1/crates', () => HttpResponse.json({}, { status: 500 }))); diff --git a/tests/acceptance/crate-following-test.js b/tests/acceptance/crate-following-test.js index 0583551b232..abe2f07d8fd 100644 --- a/tests/acceptance/crate-following-test.js +++ b/tests/acceptance/crate-following-test.js @@ -10,28 +10,28 @@ import { setupApplicationTest } from 'crates-io/tests/helpers'; module('Acceptance | Crate following', function (hooks) { setupApplicationTest(hooks); - function prepare(context, { loggedIn = true, following = false } = {}) { + async function prepare(context, { loggedIn = true, following = false } = {}) { let { db } = context; - let crate = db.crate.create({ name: 'nanomsg' }); - db.version.create({ crate, num: '0.6.0' }); + let crate = await db.crate.create({ name: 'nanomsg' }); + await db.version.create({ crate, num: '0.6.0' }); if (loggedIn) { let followedCrates = following ? [crate] : []; - let user = db.user.create({ followedCrates }); - context.authenticateAs(user); + let user = await db.user.create({ followedCrates }); + await context.authenticateAs(user); } } test("unauthenticated users don't see the follow button", async function (assert) { - prepare(this, { loggedIn: false }); + await prepare(this, { loggedIn: false }); await visit('/crates/nanomsg'); assert.dom('[data-test-follow-button]').doesNotExist(); }); test('authenticated users see a loading spinner and can follow/unfollow crates', async function (assert) { - prepare(this); + await prepare(this); let followingDeferred = defer(); this.worker.use(http.get('/api/v1/crates/:crate_id/following', () => followingDeferred.promise)); @@ -74,7 +74,7 @@ module('Acceptance | Crate following', function (hooks) { }); test('error handling when loading following state fails', async function (assert) { - prepare(this); + await prepare(this); this.worker.use(http.get('/api/v1/crates/:crate_id/following', () => HttpResponse.json({}, { status: 500 }))); @@ -88,7 +88,7 @@ module('Acceptance | Crate following', function (hooks) { }); test('error handling when follow fails', async function (assert) { - prepare(this); + await prepare(this); this.worker.use(http.put('/api/v1/crates/:crate_id/follow', () => HttpResponse.json({}, { status: 500 }))); @@ -100,7 +100,7 @@ module('Acceptance | Crate following', function (hooks) { }); test('error handling when unfollow fails', async function (assert) { - prepare(this, { following: true }); + await prepare(this, { following: true }); this.worker.use(http.delete('/api/v1/crates/:crate_id/follow', () => HttpResponse.json({}, { status: 500 }))); diff --git a/tests/acceptance/crate-navtabs-test.js b/tests/acceptance/crate-navtabs-test.js index f3f2e9fb545..65169bc63f3 100644 --- a/tests/acceptance/crate-navtabs-test.js +++ b/tests/acceptance/crate-navtabs-test.js @@ -13,8 +13,8 @@ module('Acceptance | crate navigation tabs', function (hooks) { setupApplicationTest(hooks); test('basic navigation between tabs works as expected', async function (assert) { - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.version.create({ crate, num: '0.6.1' }); + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.version.create({ crate, num: '0.6.1' }); await visit('/crates/nanomsg'); assert.strictEqual(currentURL(), '/crates/nanomsg'); diff --git a/tests/acceptance/crate-test.js b/tests/acceptance/crate-test.js index d2952da2678..7cd28564b1c 100644 --- a/tests/acceptance/crate-test.js +++ b/tests/acceptance/crate-test.js @@ -16,8 +16,8 @@ module('Acceptance | crate page', function (hooks) { setupApplicationTest(hooks); test('visiting a crate page from the front page', async function (assert) { - let crate = this.db.crate.create({ name: 'nanomsg', newest_version: '0.6.1' }); - this.db.version.create({ crate, num: '0.6.1' }); + let crate = await this.db.crate.create({ name: 'nanomsg', newest_version: '0.6.1' }); + await this.db.version.create({ crate, num: '0.6.1' }); await visit('/'); await click('[data-test-just-updated] [data-test-crate-link="0"]'); @@ -30,9 +30,9 @@ module('Acceptance | crate page', function (hooks) { }); test('visiting /crates/nanomsg', async function (assert) { - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.version.create({ crate, num: '0.6.0' }); - this.db.version.create({ crate, num: '0.6.1', rust_version: '1.69' }); + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.version.create({ crate, num: '0.6.0' }); + await this.db.version.create({ crate, num: '0.6.1', rust_version: '1.69' }); await visit('/crates/nanomsg'); @@ -49,9 +49,9 @@ module('Acceptance | crate page', function (hooks) { }); test('visiting /crates/nanomsg/', async function (assert) { - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.version.create({ crate, num: '0.6.0' }); - this.db.version.create({ crate, num: '0.6.1' }); + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.version.create({ crate, num: '0.6.0' }); + await this.db.version.create({ crate, num: '0.6.1' }); await visit('/crates/nanomsg/'); @@ -65,9 +65,9 @@ module('Acceptance | crate page', function (hooks) { }); test('visiting /crates/nanomsg/0.6.0', async function (assert) { - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.version.create({ crate, num: '0.6.0' }); - this.db.version.create({ crate, num: '0.6.1' }); + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.version.create({ crate, num: '0.6.0' }); + await this.db.version.create({ crate, num: '0.6.1' }); await visit('/crates/nanomsg/0.6.0'); @@ -104,9 +104,9 @@ module('Acceptance | crate page', function (hooks) { }); test('unknown versions fall back to latest version and show an error message', async function (assert) { - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.version.create({ crate, num: '0.6.0' }); - this.db.version.create({ crate, num: '0.6.1' }); + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.version.create({ crate, num: '0.6.0' }); + await this.db.version.create({ crate, num: '0.6.1' }); await visit('/crates/nanomsg/0.7.0'); @@ -118,8 +118,8 @@ module('Acceptance | crate page', function (hooks) { }); test('works for non-canonical names', async function (assert) { - let crate = this.db.crate.create({ name: 'foo-bar' }); - this.db.version.create({ crate }); + let crate = await this.db.crate.create({ name: 'foo-bar' }); + await this.db.version.create({ crate }); await visit('/crates/foo_bar'); @@ -131,7 +131,7 @@ module('Acceptance | crate page', function (hooks) { }); test('navigating to the versions page', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); // default with a page size more than 13 await visit('/crates/nanomsg'); @@ -143,7 +143,7 @@ module('Acceptance | crate page', function (hooks) { }); test('navigating to the versions page with custom per_page', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates/nanomsg/versions?per_page=10'); @@ -158,7 +158,7 @@ module('Acceptance | crate page', function (hooks) { }); test('navigating to the reverse dependencies page', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates/nanomsg'); await click('[data-test-rev-deps-tab] a'); @@ -168,7 +168,7 @@ module('Acceptance | crate page', function (hooks) { }); test('navigating to a user page', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates/nanomsg'); await click('[data-test-owners] [data-test-owner-link="blabaere"]'); @@ -178,7 +178,7 @@ module('Acceptance | crate page', function (hooks) { }); test('navigating to a team page', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates/nanomsg'); await click('[data-test-owners] [data-test-owner-link="github:org:thehydroimpulse"]'); @@ -188,7 +188,7 @@ module('Acceptance | crate page', function (hooks) { }); test('crates having user-owners', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates/nanomsg'); @@ -200,7 +200,7 @@ module('Acceptance | crate page', function (hooks) { }); test('crates having team-owners', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates/nanomsg'); @@ -209,7 +209,7 @@ module('Acceptance | crate page', function (hooks) { }); test('crates license is supplied by version', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates/nanomsg'); assert.dom('[data-test-license]').hasText('Apache-2.0'); @@ -219,10 +219,10 @@ module('Acceptance | crate page', function (hooks) { }); skip('crates can be yanked by owner', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); - let user = this.db.user.findFirst({ where: { login: { equals: 'thehydroimpulse' } } }); - this.authenticateAs(user); + let user = this.db.user.findFirst(q => q.where({ login: 'thehydroimpulse' })); + await this.authenticateAs(user); await visit('/crates/nanomsg/0.5.0'); await click('[data-test-version-yank-button="0.5.0"]'); @@ -238,7 +238,7 @@ module('Acceptance | crate page', function (hooks) { }); test('navigating to the owners page when not logged in', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates/nanomsg'); @@ -246,10 +246,10 @@ module('Acceptance | crate page', function (hooks) { }); test('navigating to the owners page when not an owner', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); - let user = this.db.user.findFirst({ where: { login: { equals: 'iain8' } } }); - this.authenticateAs(user); + let user = this.db.user.findFirst(q => q.where({ login: 'iain8' })); + await this.authenticateAs(user); await visit('/crates/nanomsg'); @@ -257,10 +257,10 @@ module('Acceptance | crate page', function (hooks) { }); test('navigating to the settings page', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); - let user = this.db.user.findFirst({ where: { login: { equals: 'thehydroimpulse' } } }); - this.authenticateAs(user); + let user = this.db.user.findFirst(q => q.where({ login: 'thehydroimpulse' })); + await this.authenticateAs(user); await visit('/crates/nanomsg'); await click('[data-test-settings-tab] a'); @@ -269,7 +269,7 @@ module('Acceptance | crate page', function (hooks) { }); test('keywords are shown when navigating from search', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/search?q=nanomsg'); await click('[data-test-crate-link]'); @@ -279,7 +279,7 @@ module('Acceptance | crate page', function (hooks) { }); test('keywords are shown when navigating from crate to keywords, and then back to crate', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates/nanomsg'); assert.dom('[data-test-keyword]').exists(); @@ -293,7 +293,7 @@ module('Acceptance | crate page', function (hooks) { }); test('keywords are shown when navigating from crate to searchs, and then back to crate', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates/nanomsg'); assert.dom('[data-test-keyword]').exists(); @@ -310,9 +310,9 @@ module('Acceptance | crate page', function (hooks) { test('sidebar shows correct information', async function (assert) { this.owner.lookup('service:intl').locale = 'en'; - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '0.5.0' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '0.5.0' }); + await this.db.version.create({ crate, num: '1.0.0' }); await visit('/crates/foo'); assert.dom('[data-test-linecounts]').hasText('1,119 SLoC'); diff --git a/tests/acceptance/crates-test.js b/tests/acceptance/crates-test.js index 71ce1a36bc2..0f547815f3e 100644 --- a/tests/acceptance/crates-test.js +++ b/tests/acceptance/crates-test.js @@ -19,7 +19,7 @@ module('Acceptance | crates page', function (hooks) { const per_page = 50; test('visiting the crates page from the front page', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/'); await click('[data-test-all-crates-link]'); @@ -32,7 +32,7 @@ module('Acceptance | crates page', function (hooks) { }); test('visiting the crates page directly', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates'); await click('[data-test-all-crates-link]'); @@ -43,8 +43,8 @@ module('Acceptance | crates page', function (hooks) { test('listing crates', async function (assert) { for (let i = 1; i <= per_page; i++) { - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); } await visit('/crates'); @@ -55,8 +55,8 @@ module('Acceptance | crates page', function (hooks) { test('navigating to next page of crates', async function (assert) { for (let i = 1; i <= per_page + 2; i++) { - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); } const page_start = per_page + 1; const total = per_page + 2; @@ -70,7 +70,7 @@ module('Acceptance | crates page', function (hooks) { }); test('crates default sort is by recent downloads', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates'); @@ -78,7 +78,7 @@ module('Acceptance | crates page', function (hooks) { }); test('downloads appears for each crate on crate list', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates'); @@ -87,7 +87,7 @@ module('Acceptance | crates page', function (hooks) { }); test('recent downloads appears for each crate on crate list', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/crates'); @@ -96,7 +96,7 @@ module('Acceptance | crates page', function (hooks) { }); test('shows error message screen', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); let detail = 'Page 1 is unavailable for performance reasons. Please take a look at https://crates.io/data-access for alternatives.'; diff --git a/tests/acceptance/dashboard-test.js b/tests/acceptance/dashboard-test.js index a905cd16985..1edb8902862 100644 --- a/tests/acceptance/dashboard-test.js +++ b/tests/acceptance/dashboard-test.js @@ -19,41 +19,43 @@ module('Acceptance | Dashboard', function (hooks) { }); test('shows the dashboard when logged in', async function (assert) { - let user = this.db.user.create({ + let user = await this.db.user.create({ login: 'johnnydee', name: 'John Doe', email: 'john@doe.com', avatar: 'https://avatars2.githubusercontent.com/u/1234567?v=4', }); - this.authenticateAs(user); + await this.authenticateAs(user); { - let crate = this.db.crate.create({ name: 'rand' }); - this.db.version.create({ crate, num: '0.5.0' }); - this.db.version.create({ crate, num: '0.6.0' }); - this.db.version.create({ crate, num: '0.7.0' }); - this.db.version.create({ crate, num: '0.7.1' }); - this.db.version.create({ crate, num: '0.7.2' }); - this.db.version.create({ crate, num: '0.7.3' }); - this.db.version.create({ crate, num: '0.8.0' }); - this.db.version.create({ crate, num: '0.8.1' }); - this.db.version.create({ crate, num: '0.9.0' }); - this.db.version.create({ crate, num: '1.0.0' }); - this.db.version.create({ crate, num: '1.1.0' }); - user = this.db.user.update({ - where: { id: { equals: user.id } }, - data: { followedCrates: [...user.followedCrates, crate] }, + let crate = await this.db.crate.create({ name: 'rand' }); + await this.db.version.create({ crate, num: '0.5.0' }); + await this.db.version.create({ crate, num: '0.6.0' }); + await this.db.version.create({ crate, num: '0.7.0' }); + await this.db.version.create({ crate, num: '0.7.1' }); + await this.db.version.create({ crate, num: '0.7.2' }); + await this.db.version.create({ crate, num: '0.7.3' }); + await this.db.version.create({ crate, num: '0.8.0' }); + await this.db.version.create({ crate, num: '0.8.1' }); + await this.db.version.create({ crate, num: '0.9.0' }); + await this.db.version.create({ crate, num: '1.0.0' }); + await this.db.version.create({ crate, num: '1.1.0' }); + user = await this.db.user.update(q => q.where({ id: user.id }), { + data(user) { + user.followedCrates = [...user.followedCrates, crate]; + }, }); } { - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.crateOwnership.create({ crate, user }); - this.db.version.create({ crate, num: '0.1.0' }); - user = this.db.user.update({ - where: { id: { equals: user.id } }, - data: { followedCrates: [...user.followedCrates, crate] }, + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.crateOwnership.create({ crate, user }); + await this.db.version.create({ crate, num: '0.1.0' }); + user = await this.db.user.update(q => q.where({ id: user.id }), { + data(user) { + user.followedCrates = [...user.followedCrates, crate]; + }, }); } diff --git a/tests/acceptance/dev-mode-test.js b/tests/acceptance/dev-mode-test.js index d9c1de81150..a8c7d43c5e7 100644 --- a/tests/acceptance/dev-mode-test.js +++ b/tests/acceptance/dev-mode-test.js @@ -14,15 +14,15 @@ if (s.has('devmode')) { setupApplicationTest(hooks); test('authenticated', async function () { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '0.1.0' }); - this.db.crateOwnership.create({ crate, user }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '0.1.0' }); + await this.db.crateOwnership.create({ crate, user }); crate = this.db.crate.create({ name: 'bar' }); - this.db.version.create({ crate, num: '1.0.0' }); + await this.db.version.create({ crate, num: '1.0.0' }); let router = this.owner.lookup('service:router'); router.on('routeDidChange', () => { diff --git a/tests/acceptance/email-change-test.js b/tests/acceptance/email-change-test.js index 285b35ecc41..c0737218a86 100644 --- a/tests/acceptance/email-change-test.js +++ b/tests/acceptance/email-change-test.js @@ -11,9 +11,9 @@ module('Acceptance | Email Change', function (hooks) { setupApplicationTest(hooks); test('happy path', async function (assert) { - let user = this.db.user.create({ email: 'old@email.com' }); + let user = await this.db.user.create({ email: 'old@email.com' }); - this.authenticateAs(user); + await this.authenticateAs(user); await visit('/settings/profile'); assert.strictEqual(currentURL(), '/settings/profile'); @@ -45,16 +45,16 @@ module('Acceptance | Email Change', function (hooks) { assert.dom('[data-test-email-input] [data-test-verification-sent]').exists(); assert.dom('[data-test-email-input] [data-test-resend-button]').isEnabled(); - user = this.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = this.db.user.findFirst(q => q.where({ id: user.id })); assert.strictEqual(user.email, 'new@email.com'); assert.false(user.emailVerified); assert.ok(user.emailVerificationToken); }); test('happy path with `email: null`', async function (assert) { - let user = this.db.user.create({ email: undefined }); + let user = await this.db.user.create({ email: null }); - this.authenticateAs(user); + await this.authenticateAs(user); await visit('/settings/profile'); assert.strictEqual(currentURL(), '/settings/profile'); @@ -82,16 +82,16 @@ module('Acceptance | Email Change', function (hooks) { assert.dom('[data-test-email-input] [data-test-verification-sent]').exists(); assert.dom('[data-test-email-input] [data-test-resend-button]').isEnabled(); - user = this.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = this.db.user.findFirst(q => q.where({ id: user.id })); assert.strictEqual(user.email, 'new@email.com'); assert.false(user.emailVerified); assert.ok(user.emailVerificationToken); }); test('cancel button', async function (assert) { - let user = this.db.user.create({ email: 'old@email.com' }); + let user = await this.db.user.create({ email: 'old@email.com' }); - this.authenticateAs(user); + await this.authenticateAs(user); await visit('/settings/profile'); await click('[data-test-email-input] [data-test-edit-button]'); @@ -104,16 +104,16 @@ module('Acceptance | Email Change', function (hooks) { assert.dom('[data-test-email-input] [data-test-not-verified]').doesNotExist(); assert.dom('[data-test-email-input] [data-test-verification-sent]').doesNotExist(); - user = this.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = this.db.user.findFirst(q => q.where({ id: user.id })); assert.strictEqual(user.email, 'old@email.com'); assert.true(user.emailVerified); assert.notOk(user.emailVerificationToken); }); test('server error', async function (assert) { - let user = this.db.user.create({ email: 'old@email.com' }); + let user = await this.db.user.create({ email: 'old@email.com' }); - this.authenticateAs(user); + await this.authenticateAs(user); this.worker.use(http.put('/api/v1/users/:user_id', () => HttpResponse.json({}, { status: 500 }))); @@ -128,7 +128,7 @@ module('Acceptance | Email Change', function (hooks) { .dom('[data-test-notification-message="error"]') .hasText('Error in saving email: An unknown error occurred while saving this email.'); - user = this.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = this.db.user.findFirst(q => q.where({ id: user.id })); assert.strictEqual(user.email, 'old@email.com'); assert.true(user.emailVerified); assert.notOk(user.emailVerificationToken); @@ -136,9 +136,9 @@ module('Acceptance | Email Change', function (hooks) { module('Resend button', function () { test('happy path', async function (assert) { - let user = this.db.user.create({ email: 'john@doe.com', emailVerificationToken: 'secret123' }); + let user = await this.db.user.create({ email: 'john@doe.com', emailVerificationToken: 'secret123' }); - this.authenticateAs(user); + await this.authenticateAs(user); await visit('/settings/profile'); assert.strictEqual(currentURL(), '/settings/profile'); @@ -154,9 +154,9 @@ module('Acceptance | Email Change', function (hooks) { }); test('server error', async function (assert) { - let user = this.db.user.create({ email: 'john@doe.com', emailVerificationToken: 'secret123' }); + let user = await this.db.user.create({ email: 'john@doe.com', emailVerificationToken: 'secret123' }); - this.authenticateAs(user); + await this.authenticateAs(user); this.worker.use(http.put('/api/v1/users/:user_id/resend', () => HttpResponse.json({}, { status: 500 }))); diff --git a/tests/acceptance/email-confirmation-test.js b/tests/acceptance/email-confirmation-test.js index 00a6f386a64..ac966a6b9b8 100644 --- a/tests/acceptance/email-confirmation-test.js +++ b/tests/acceptance/email-confirmation-test.js @@ -9,22 +9,22 @@ module('Acceptance | Email Confirmation', function (hooks) { setupApplicationTest(hooks); test('unauthenticated happy path', async function (assert) { - let user = this.db.user.create({ emailVerificationToken: 'badc0ffee' }); + let user = await this.db.user.create({ emailVerificationToken: 'badc0ffee' }); assert.false(user.emailVerified); await visit('/confirm/badc0ffee'); assert.strictEqual(currentURL(), '/'); assert.dom('[data-test-notification-message="success"]').exists(); - user = this.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = this.db.user.findFirst(q => q.where({ id: user.id })); assert.true(user.emailVerified); }); test('authenticated happy path', async function (assert) { - let user = this.db.user.create({ emailVerificationToken: 'badc0ffee' }); + let user = await this.db.user.create({ emailVerificationToken: 'badc0ffee' }); assert.false(user.emailVerified); - this.authenticateAs(user); + await this.authenticateAs(user); await visit('/confirm/badc0ffee'); assert.strictEqual(currentURL(), '/'); @@ -33,7 +33,7 @@ module('Acceptance | Email Confirmation', function (hooks) { let { currentUser } = this.owner.lookup('service:session'); assert.true(currentUser.email_verified); - user = this.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = this.db.user.findFirst(q => q.where({ id: user.id })); assert.true(user.emailVerified); }); diff --git a/tests/acceptance/front-page-test.js b/tests/acceptance/front-page-test.js index 8bf42d6a74e..41854f2d406 100644 --- a/tests/acceptance/front-page-test.js +++ b/tests/acceptance/front-page-test.js @@ -19,7 +19,7 @@ module('Acceptance | front page', function (hooks) { test('visiting /', async function (assert) { this.owner.lookup('service:intl').locale = 'en'; - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/'); diff --git a/tests/acceptance/invites-test.js b/tests/acceptance/invites-test.js index b3cff7cf93c..330b396ad72 100644 --- a/tests/acceptance/invites-test.js +++ b/tests/acceptance/invites-test.js @@ -11,31 +11,31 @@ import { visit } from '../helpers/visit-ignoring-abort'; module('Acceptance | /me/pending-invites', function (hooks) { setupApplicationTest(hooks); - function prepare(context) { - let inviter = context.db.user.create({ name: 'janed' }); - let inviter2 = context.db.user.create({ name: 'wycats' }); + async function prepare(context) { + let inviter = await context.db.user.create({ name: 'janed' }); + let inviter2 = await context.db.user.create({ name: 'wycats' }); - let user = context.db.user.create(); + let user = await context.db.user.create(); - let nanomsg = context.db.crate.create({ name: 'nanomsg' }); - context.db.version.create({ crate: nanomsg }); - context.db.crateOwnerInvitation.create({ + let nanomsg = await context.db.crate.create({ name: 'nanomsg' }); + await context.db.version.create({ crate: nanomsg }); + await context.db.crateOwnerInvitation.create({ crate: nanomsg, createdAt: '2016-12-24T12:34:56Z', invitee: user, inviter, }); - let ember = context.db.crate.create({ name: 'ember-rs' }); - context.db.version.create({ crate: ember }); - context.db.crateOwnerInvitation.create({ + let ember = await context.db.crate.create({ name: 'ember-rs' }); + await context.db.version.create({ crate: ember }); + await context.db.crateOwnerInvitation.create({ crate: ember, createdAt: '2020-12-31T12:34:56Z', invitee: user, inviter: inviter2, }); - context.authenticateAs(user); + await context.authenticateAs(user); return { nanomsg, user }; } @@ -48,7 +48,7 @@ module('Acceptance | /me/pending-invites', function (hooks) { }); test('list all pending crate owner invites', async function (assert) { - prepare(this); + await prepare(this); await visit('/me/pending-invites'); assert.strictEqual(currentURL(), '/me/pending-invites'); @@ -71,9 +71,9 @@ module('Acceptance | /me/pending-invites', function (hooks) { }); test('shows empty list message', async function (assert) { - prepare(this); + await prepare(this); - this.db.crateOwnerInvitation.deleteMany({}); + this.db.crateOwnerInvitation.deleteMany(null); await visit('/me/pending-invites'); assert.strictEqual(currentURL(), '/me/pending-invites'); @@ -82,23 +82,13 @@ module('Acceptance | /me/pending-invites', function (hooks) { }); test('invites can be declined', async function (assert) { - let { nanomsg, user } = prepare(this); + let { nanomsg, user } = await prepare(this); let { crateOwnerInvitation, crateOwnership } = this.db; - let invites = crateOwnerInvitation.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - invitee: { id: { equals: user.id } }, - }, - }); + let invites = crateOwnerInvitation.findMany(q => q.where({ crate: { id: nanomsg.id }, invitee: { id: user.id } })); assert.strictEqual(invites.length, 1); - let owners = crateOwnership.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - user: { id: { equals: user.id } }, - }, - }); + let owners = crateOwnership.findMany(q => q.where({ crate: { id: nanomsg.id }, user: { id: user.id } })); assert.strictEqual(owners.length, 0); await visit('/me/pending-invites'); @@ -113,25 +103,15 @@ module('Acceptance | /me/pending-invites', function (hooks) { assert.dom('[data-test-invite="nanomsg"] [data-test-crate-link]').doesNotExist(); assert.dom('[data-test-invite="nanomsg"] [data-test-inviter-link]').doesNotExist(); - invites = crateOwnerInvitation.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - invitee: { id: { equals: user.id } }, - }, - }); + invites = crateOwnerInvitation.findMany(q => q.where({ crate: { id: nanomsg.id }, invitee: { id: user.id } })); assert.strictEqual(invites.length, 0); - owners = crateOwnership.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - user: { id: { equals: user.id } }, - }, - }); + owners = crateOwnership.findMany(q => q.where({ crate: { id: nanomsg.id }, user: { id: user.id } })); assert.strictEqual(owners.length, 0); }); test('error message is shown if decline request fails', async function (assert) { - prepare(this); + await prepare(this); let error = HttpResponse.json({}, { status: 500 }); this.worker.use(http.put('/api/v1/me/crate_owner_invitations/:crate_id', () => error)); @@ -146,23 +126,13 @@ module('Acceptance | /me/pending-invites', function (hooks) { }); test('invites can be accepted', async function (assert) { - let { nanomsg, user } = prepare(this); + let { nanomsg, user } = await prepare(this); let { crateOwnerInvitation, crateOwnership } = this.db; - let invites = crateOwnerInvitation.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - invitee: { id: { equals: user.id } }, - }, - }); + let invites = crateOwnerInvitation.findMany(q => q.where({ crate: { id: nanomsg.id }, invitee: { id: user.id } })); assert.strictEqual(invites.length, 1); - let owners = crateOwnership.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - user: { id: { equals: user.id } }, - }, - }); + let owners = crateOwnership.findMany(q => q.where({ crate: { id: nanomsg.id }, user: { id: user.id } })); assert.strictEqual(owners.length, 0); await visit('/me/pending-invites'); @@ -179,25 +149,15 @@ module('Acceptance | /me/pending-invites', function (hooks) { await percySnapshot(assert); - invites = crateOwnerInvitation.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - invitee: { id: { equals: user.id } }, - }, - }); + invites = crateOwnerInvitation.findMany(q => q.where({ crate: { id: nanomsg.id }, invitee: { id: user.id } })); assert.strictEqual(invites.length, 0); - owners = crateOwnership.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - user: { id: { equals: user.id } }, - }, - }); + owners = crateOwnership.findMany(q => q.where({ crate: { id: nanomsg.id }, user: { id: user.id } })); assert.strictEqual(owners.length, 1); }); test('error message is shown if accept request fails', async function (assert) { - prepare(this); + await prepare(this); let error = HttpResponse.json({}, { status: 500 }); this.worker.use(http.put('/api/v1/me/crate_owner_invitations/:crate_id', () => error)); @@ -212,7 +172,7 @@ module('Acceptance | /me/pending-invites', function (hooks) { }); test('specific error message is shown if accept request fails', async function (assert) { - prepare(this); + await prepare(this); let errorMessage = 'The invitation to become an owner of the demo_crate crate expired. Please reach out to an owner of the crate to request a new invitation.'; diff --git a/tests/acceptance/keyword-test.js b/tests/acceptance/keyword-test.js index 76579c4146b..2192991c0cb 100644 --- a/tests/acceptance/keyword-test.js +++ b/tests/acceptance/keyword-test.js @@ -12,7 +12,7 @@ module('Acceptance | keywords', function (hooks) { setupApplicationTest(hooks); test('keyword/:keyword_id index default sort is recent-downloads', async function (assert) { - this.db.keyword.create({ keyword: 'network' }); + await this.db.keyword.create({ keyword: 'network' }); await visit('/keywords/network'); diff --git a/tests/acceptance/login-test.js b/tests/acceptance/login-test.js index 63dce17ddf9..4c3c76ebea6 100644 --- a/tests/acceptance/login-test.js +++ b/tests/acceptance/login-test.js @@ -30,14 +30,14 @@ module('Acceptance | Login', function (hooks) { this.worker.use( http.get('/api/private/session/begin', () => HttpResponse.json({ url: 'url-to-github-including-state-secret' })), - http.get('/api/private/session/authorize', ({ request }) => { + http.get('/api/private/session/authorize', async ({ request }) => { let url = new URL(request.url); assert.deepEqual([...url.searchParams.keys()], ['code', 'state']); assert.strictEqual(url.searchParams.get('code'), '901dd10e07c7e9fa1cd5'); assert.strictEqual(url.searchParams.get('state'), 'fYcUY3FMdUUz00FC7vLT7A'); - let user = db.user.create(); - db.mswSession.create({ user }); + let user = await db.user.create(); + await db.mswSession.create({ user }); return HttpResponse.json({ ok: true }); }), http.get('/api/v1/me', () => diff --git a/tests/acceptance/logout-test.js b/tests/acceptance/logout-test.js index b38ac1662f7..e377bc1ac9e 100644 --- a/tests/acceptance/logout-test.js +++ b/tests/acceptance/logout-test.js @@ -11,8 +11,8 @@ module('Acceptance | Logout', function (hooks) { setupWindowMock(hooks); test('successful logout', async function (assert) { - let user = this.db.user.create({ name: 'John Doe' }); - this.authenticateAs(user); + let user = await this.db.user.create({ name: 'John Doe' }); + await this.authenticateAs(user); await visit('/crates'); assert.strictEqual(currentURL(), '/crates'); diff --git a/tests/acceptance/publish-notifications-test.js b/tests/acceptance/publish-notifications-test.js index 383a1237478..980427b87dd 100644 --- a/tests/acceptance/publish-notifications-test.js +++ b/tests/acceptance/publish-notifications-test.js @@ -11,9 +11,9 @@ module('Acceptance | publish notifications', function (hooks) { setupApplicationTest(hooks); test('unsubscribe and resubscribe', async function (assert) { - let user = this.db.user.create(); + let user = await this.db.user.create(); - this.authenticateAs(user); + await this.authenticateAs(user); assert.true(user.publishNotifications); await visit('/settings/profile'); @@ -24,24 +24,24 @@ module('Acceptance | publish notifications', function (hooks) { assert.dom('[data-test-notifications] input[type=checkbox]').isNotChecked(); await click('[data-test-notifications] button'); - user = this.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = this.db.user.findFirst(q => q.where({ id: user.id })); assert.false(user.publishNotifications); await click('[data-test-notifications] input[type=checkbox]'); assert.dom('[data-test-notifications] input[type=checkbox]').isChecked(); await click('[data-test-notifications] button'); - user = this.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = this.db.user.findFirst(q => q.where({ id: user.id })); assert.true(user.publishNotifications); }); test('loading and error state', async function (assert) { - let user = this.db.user.create(); + let user = await this.db.user.create(); let deferred = defer(); this.worker.use(http.put('/api/v1/users/:user_id', () => deferred.promise)); - this.authenticateAs(user); + await this.authenticateAs(user); assert.true(user.publishNotifications); await visit('/settings/profile'); diff --git a/tests/acceptance/readme-rendering-test.js b/tests/acceptance/readme-rendering-test.js index b39bc1182ee..113e5e16523 100644 --- a/tests/acceptance/readme-rendering-test.js +++ b/tests/acceptance/readme-rendering-test.js @@ -128,8 +128,8 @@ module('Acceptance | README rendering', function (hooks) { setupApplicationTest(hooks); test('it works', async function (assert) { - let crate = this.db.crate.create({ name: 'serde' }); - this.db.version.create({ crate, num: '1.0.0', readme: README_HTML }); + let crate = await this.db.crate.create({ name: 'serde' }); + await this.db.version.create({ crate, num: '1.0.0', readme: README_HTML }); await visit('/crates/serde'); assert.dom('[data-test-readme]').exists(); @@ -141,16 +141,16 @@ module('Acceptance | README rendering', function (hooks) { }); test('it shows a fallback if no readme is available', async function (assert) { - let crate = this.db.crate.create({ name: 'serde' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'serde' }); + await this.db.version.create({ crate, num: '1.0.0' }); await visit('/crates/serde'); assert.dom('[data-test-no-readme]').exists(); }); test('it shows an error message and retry button if loading fails', async function (assert) { - let crate = this.db.crate.create({ name: 'serde' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'serde' }); + await this.db.version.create({ crate, num: '1.0.0' }); // Simulate a server error when fetching the README this.worker.use(http.get('/api/v1/crates/:name/:version/readme', () => HttpResponse.html('', { status: 500 }))); diff --git a/tests/acceptance/rebuild-docs-test.js b/tests/acceptance/rebuild-docs-test.js index 7162408a3b5..9da60a66c83 100644 --- a/tests/acceptance/rebuild-docs-test.js +++ b/tests/acceptance/rebuild-docs-test.js @@ -9,16 +9,16 @@ module('Acceptance | rebuild docs page', function (hooks) { setupApplicationTest(hooks); test('navigates to rebuild docs confirmation page', async function (assert) { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.crateOwnership.create({ crate, user }); + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.crateOwnership.create({ crate, user }); - this.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' }); - this.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' }); - this.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' }); - this.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); + await this.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' }); + await this.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' }); + await this.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' }); + await this.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); await visit('/crates/nanomsg/versions'); assert.strictEqual(currentURL(), '/crates/nanomsg/versions'); @@ -34,13 +34,13 @@ module('Acceptance | rebuild docs page', function (hooks) { }); test('rebuild docs confirmation page shows crate info and allows confirmation', async function (assert) { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.crateOwnership.create({ crate, user }); + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.crateOwnership.create({ crate, user }); - this.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); + await this.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); await visit('/crates/nanomsg/0.2.1/rebuild-docs'); assert.strictEqual(currentURL(), '/crates/nanomsg/0.2.1/rebuild-docs'); @@ -57,11 +57,11 @@ module('Acceptance | rebuild docs page', function (hooks) { }); test('rebuilds docs confirmation page redirects non-owners to error page', async function (assert) { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); await visit('/crates/nanomsg/0.2.1/rebuild-docs'); assert.dom('[data-test-title]').hasText('This page is only accessible by crate owners'); @@ -69,8 +69,8 @@ module('Acceptance | rebuild docs page', function (hooks) { }); test('rebuild docs confirmation page shows authentication error for unauthenticated users', async function (assert) { - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); await visit('/crates/nanomsg/0.2.1/rebuild-docs'); diff --git a/tests/acceptance/reverse-dependencies-test.js b/tests/acceptance/reverse-dependencies-test.js index 9e343a2cbc2..10f6d10d674 100644 --- a/tests/acceptance/reverse-dependencies-test.js +++ b/tests/acceptance/reverse-dependencies-test.js @@ -10,24 +10,24 @@ import { visit } from '../helpers/visit-ignoring-abort'; module('Acceptance | /crates/:crate_id/reverse_dependencies', function (hooks) { setupApplicationTest(hooks); - function prepare({ db }) { - let foo = db.crate.create({ name: 'foo' }); - db.version.create({ crate: foo }); + async function prepare({ db }) { + let foo = await db.crate.create({ name: 'foo' }); + await db.version.create({ crate: foo }); - let bar = db.crate.create({ name: 'bar' }); - let barVersion = db.version.create({ crate: bar }); + let bar = await db.crate.create({ name: 'bar' }); + let barVersion = await db.version.create({ crate: bar }); - let baz = db.crate.create({ name: 'baz' }); - let bazVersion = db.version.create({ crate: baz }); + let baz = await db.crate.create({ name: 'baz' }); + let bazVersion = await db.version.create({ crate: baz }); - db.dependency.create({ crate: foo, version: barVersion }); - db.dependency.create({ crate: foo, version: bazVersion }); + await db.dependency.create({ crate: foo, version: barVersion }); + await db.dependency.create({ crate: foo, version: bazVersion }); return { foo, bar, baz }; } test('shows a list of crates depending on the selected crate', async function (assert) { - let { foo, bar, baz } = prepare(this); + let { foo, bar, baz } = await prepare(this); await visit(`/crates/${foo.name}/reverse_dependencies`); assert.strictEqual(currentURL(), `/crates/${foo.name}/reverse_dependencies`); @@ -39,12 +39,12 @@ module('Acceptance | /crates/:crate_id/reverse_dependencies', function (hooks) { }); test('supports pagination', async function (assert) { - let { foo } = prepare(this); + let { foo } = await prepare(this); for (let i = 0; i < 20; i++) { - let crate = this.db.crate.create(); - let version = this.db.version.create({ crate }); - this.db.dependency.create({ crate: foo, version }); + let crate = await this.db.crate.create(); + let version = await this.db.version.create({ crate }); + await this.db.dependency.create({ crate: foo, version }); } await visit(`/crates/${foo.name}/reverse_dependencies`); @@ -67,7 +67,7 @@ module('Acceptance | /crates/:crate_id/reverse_dependencies', function (hooks) { }); test('shows error message if loading of reverse dependencies fails', async function (assert) { - let { foo } = prepare(this); + let { foo } = await prepare(this); let error = HttpResponse.json({}, { status: 500 }); this.worker.use(http.get('/api/v1/crates/:crate_id/reverse_dependencies', () => error)); diff --git a/tests/acceptance/search-test.js b/tests/acceptance/search-test.js index 80e655286f0..5203d8203cc 100644 --- a/tests/acceptance/search-test.js +++ b/tests/acceptance/search-test.js @@ -18,7 +18,7 @@ module('Acceptance | search', function (hooks) { setupApplicationTest(hooks); test('searching for "rust"', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/'); await fillIn('[data-test-search-input]', 'rust'); @@ -46,7 +46,7 @@ module('Acceptance | search', function (hooks) { }); test('searching for "rust" from query', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/search?q=rust'); @@ -59,7 +59,7 @@ module('Acceptance | search', function (hooks) { }); test('clearing search results', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/search?q=rust'); @@ -73,7 +73,7 @@ module('Acceptance | search', function (hooks) { }); test('pressing S key to focus the search bar', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/'); @@ -99,7 +99,7 @@ module('Acceptance | search', function (hooks) { }); test('check search results are by default displayed by relevance', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/'); await fillIn('[data-test-search-input]', 'rust'); @@ -109,8 +109,8 @@ module('Acceptance | search', function (hooks) { }); test('error handling when searching from the frontpage', async function (assert) { - let crate = this.db.crate.create({ name: 'rust' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'rust' }); + await this.db.version.create({ crate, num: '1.0.0' }); let error = HttpResponse.json({}, { status: 500 }); this.worker.use(http.get('/api/v1/crates', () => error)); @@ -140,8 +140,8 @@ module('Acceptance | search', function (hooks) { }); test('error handling when searching from the search page', async function (assert) { - let crate = this.db.crate.create({ name: 'rust' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'rust' }); + await this.db.version.create({ crate, num: '1.0.0' }); await visit('/search?q=rust'); assert.dom('[data-test-crate-row]').exists({ count: 1 }); @@ -239,7 +239,7 @@ module('Acceptance | search', function (hooks) { }); test('visiting without query parameters works', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/search'); diff --git a/tests/acceptance/settings/add-owner-test.js b/tests/acceptance/settings/add-owner-test.js index b7810aa0770..08d097aa3fe 100644 --- a/tests/acceptance/settings/add-owner-test.js +++ b/tests/acceptance/settings/add-owner-test.js @@ -6,28 +6,28 @@ import { setupApplicationTest } from 'crates-io/tests/helpers'; module('Acceptance | Settings | Add Owner', function (hooks) { setupApplicationTest(hooks); - function prepare(context) { + async function prepare(context) { let { db } = context; - let user1 = db.user.create({ name: 'blabaere' }); - let user2 = db.user.create({ name: 'thehydroimpulse' }); - let team1 = db.team.create({ org: 'org', name: 'blabaere' }); - let team2 = db.team.create({ org: 'org', name: 'thehydroimpulse' }); + let user1 = await db.user.create({ name: 'blabaere' }); + let user2 = await db.user.create({ name: 'thehydroimpulse' }); + let team1 = await db.team.create({ org: 'org', name: 'blabaere' }); + let team2 = await db.team.create({ org: 'org', name: 'thehydroimpulse' }); - let crate = db.crate.create({ name: 'nanomsg' }); - db.version.create({ crate, num: '1.0.0' }); - db.crateOwnership.create({ crate, user: user1 }); - db.crateOwnership.create({ crate, user: user2 }); - db.crateOwnership.create({ crate, team: team1 }); - db.crateOwnership.create({ crate, team: team2 }); + let crate = await db.crate.create({ name: 'nanomsg' }); + await db.version.create({ crate, num: '1.0.0' }); + await db.crateOwnership.create({ crate, user: user1 }); + await db.crateOwnership.create({ crate, user: user2 }); + await db.crateOwnership.create({ crate, team: team1 }); + await db.crateOwnership.create({ crate, team: team2 }); - context.authenticateAs(user1); + await context.authenticateAs(user1); return { crate, team1, team2, user1, user2 }; } test('attempting to add owner without username', async function (assert) { - prepare(this); + await prepare(this); await visit('/crates/nanomsg/settings'); await click('[data-test-add-owner-button]'); @@ -36,7 +36,7 @@ module('Acceptance | Settings | Add Owner', function (hooks) { }); test('attempting to add non-existent owner', async function (assert) { - prepare(this); + await prepare(this); await visit('/crates/nanomsg/settings'); await click('[data-test-add-owner-button]'); @@ -51,9 +51,9 @@ module('Acceptance | Settings | Add Owner', function (hooks) { }); test('add a new owner', async function (assert) { - prepare(this); + await prepare(this); - this.db.user.create({ name: 'iain8' }); + await this.db.user.create({ name: 'iain8' }); await visit('/crates/nanomsg/settings'); await click('[data-test-add-owner-button]'); @@ -66,10 +66,10 @@ module('Acceptance | Settings | Add Owner', function (hooks) { }); test('add a team owner', async function (assert) { - prepare(this); + await prepare(this); - this.db.user.create({ name: 'iain8' }); - this.db.team.create({ org: 'rust-lang', name: 'crates-io' }); + await this.db.user.create({ name: 'iain8' }); + await this.db.team.create({ org: 'rust-lang', name: 'crates-io' }); await visit('/crates/nanomsg/settings'); await click('[data-test-add-owner-button]'); diff --git a/tests/acceptance/settings/remove-owner-test.js b/tests/acceptance/settings/remove-owner-test.js index eb94920f01f..4d6c0f5b5ab 100644 --- a/tests/acceptance/settings/remove-owner-test.js +++ b/tests/acceptance/settings/remove-owner-test.js @@ -8,28 +8,28 @@ import { setupApplicationTest } from 'crates-io/tests/helpers'; module('Acceptance | Settings | Remove Owner', function (hooks) { setupApplicationTest(hooks); - function prepare(context) { + async function prepare(context) { let { db } = context; - let user1 = db.user.create({ name: 'blabaere' }); - let user2 = db.user.create({ name: 'thehydroimpulse' }); - let team1 = db.team.create({ org: 'org', name: 'blabaere' }); - let team2 = db.team.create({ org: 'org', name: 'thehydroimpulse' }); + let user1 = await db.user.create({ name: 'blabaere' }); + let user2 = await db.user.create({ name: 'thehydroimpulse' }); + let team1 = await db.team.create({ org: 'org', name: 'blabaere' }); + let team2 = await db.team.create({ org: 'org', name: 'thehydroimpulse' }); - let crate = db.crate.create({ name: 'nanomsg' }); - db.version.create({ crate, num: '1.0.0' }); - db.crateOwnership.create({ crate, user: user1 }); - db.crateOwnership.create({ crate, user: user2 }); - db.crateOwnership.create({ crate, team: team1 }); - db.crateOwnership.create({ crate, team: team2 }); + let crate = await db.crate.create({ name: 'nanomsg' }); + await db.version.create({ crate, num: '1.0.0' }); + await db.crateOwnership.create({ crate, user: user1 }); + await db.crateOwnership.create({ crate, user: user2 }); + await db.crateOwnership.create({ crate, team: team1 }); + await db.crateOwnership.create({ crate, team: team2 }); - context.authenticateAs(user1); + await context.authenticateAs(user1); return { crate, team1, team2, user1, user2 }; } test('remove a crate owner when owner is a user', async function (assert) { - prepare(this); + await prepare(this); await visit('/crates/nanomsg/settings'); await click('[data-test-owner-user="thehydroimpulse"] [data-test-remove-owner-button]'); @@ -39,7 +39,7 @@ module('Acceptance | Settings | Remove Owner', function (hooks) { }); test('remove a user crate owner (error behavior)', async function (assert) { - let { crate, user2 } = prepare(this); + let { crate, user2 } = await prepare(this); // we are intentionally returning a 200 response here, because is what // the real backend also returns due to legacy reasons @@ -57,7 +57,7 @@ module('Acceptance | Settings | Remove Owner', function (hooks) { }); test('remove a crate owner when owner is a team', async function (assert) { - prepare(this); + await prepare(this); await visit('/crates/nanomsg/settings'); await click('[data-test-owner-team="github:org:thehydroimpulse"] [data-test-remove-owner-button]'); @@ -67,7 +67,7 @@ module('Acceptance | Settings | Remove Owner', function (hooks) { }); test('remove a team crate owner (error behavior)', async function (assert) { - let { crate, team1 } = prepare(this); + let { crate, team1 } = await prepare(this); // we are intentionally returning a 200 response here, because is what // the real backend also returns due to legacy reasons diff --git a/tests/acceptance/settings/settings-test.js b/tests/acceptance/settings/settings-test.js index ae3adcce005..50cb295f22a 100644 --- a/tests/acceptance/settings/settings-test.js +++ b/tests/acceptance/settings/settings-test.js @@ -11,28 +11,28 @@ import axeConfig from '../../axe-config'; module('Acceptance | Settings', function (hooks) { setupApplicationTest(hooks); - function prepare(context) { + async function prepare(context) { let { db } = context; - let user1 = db.user.create({ name: 'blabaere' }); - let user2 = db.user.create({ name: 'thehydroimpulse' }); - let team1 = db.team.create({ org: 'org', name: 'blabaere' }); - let team2 = db.team.create({ org: 'org', name: 'thehydroimpulse' }); + let user1 = await db.user.create({ name: 'blabaere' }); + let user2 = await db.user.create({ name: 'thehydroimpulse' }); + let team1 = await db.team.create({ org: 'org', name: 'blabaere' }); + let team2 = await db.team.create({ org: 'org', name: 'thehydroimpulse' }); - let crate = db.crate.create({ name: 'nanomsg' }); - db.version.create({ crate, num: '1.0.0' }); - db.crateOwnership.create({ crate, user: user1 }); - db.crateOwnership.create({ crate, user: user2 }); - db.crateOwnership.create({ crate, team: team1 }); - db.crateOwnership.create({ crate, team: team2 }); + let crate = await db.crate.create({ name: 'nanomsg' }); + await db.version.create({ crate, num: '1.0.0' }); + await db.crateOwnership.create({ crate, user: user1 }); + await db.crateOwnership.create({ crate, user: user2 }); + await db.crateOwnership.create({ crate, team: team1 }); + await db.crateOwnership.create({ crate, team: team2 }); - context.authenticateAs(user1); + await context.authenticateAs(user1); return { crate, team1, team2, user1, user2 }; } test('listing crate owners', async function (assert) { - prepare(this); + await prepare(this); await visit('/crates/nanomsg/settings'); assert.strictEqual(currentURL(), '/crates/nanomsg/settings'); @@ -49,7 +49,7 @@ module('Acceptance | Settings', function (hooks) { }); test('/crates/:name/owners redirects to /crates/:name/settings', async function (assert) { - prepare(this); + await prepare(this); await visit('/crates/nanomsg/owners'); assert.strictEqual(currentURL(), '/crates/nanomsg/settings'); diff --git a/tests/acceptance/sudo-test.js b/tests/acceptance/sudo-test.js index 77342c5851a..ad91596142c 100644 --- a/tests/acceptance/sudo-test.js +++ b/tests/acceptance/sudo-test.js @@ -10,8 +10,8 @@ import { visit } from '../helpers/visit-ignoring-abort'; module('Acceptance | sudo', function (hooks) { setupApplicationTest(hooks); - function prepare(context, isAdmin) { - const user = context.db.user.create({ + async function prepare(context, isAdmin) { + const user = await context.db.user.create({ login: 'johnnydee', name: 'John Doe', email: 'john@doe.com', @@ -19,22 +19,22 @@ module('Acceptance | sudo', function (hooks) { isAdmin, }); - const crate = context.db.crate.create({ + const crate = await context.db.crate.create({ name: 'foo', newest_version: '0.1.0', }); - const version = context.db.version.create({ + const version = await context.db.version.create({ crate, num: '0.1.0', }); - context.authenticateAs(user); + await context.authenticateAs(user); return { user, crate, version }; } test('non-admin users do not see any controls', async function (assert) { - prepare(this, false); + await prepare(this, false); await visit('/crates/foo/versions'); @@ -50,7 +50,7 @@ module('Acceptance | sudo', function (hooks) { }); test('admin user is not initially in sudo mode', async function (assert) { - prepare(this, true); + await prepare(this, true); await visit('/crates/foo/versions'); @@ -69,7 +69,7 @@ module('Acceptance | sudo', function (hooks) { }); test('admin user can enter sudo mode', async function (assert) { - prepare(this, true); + await prepare(this, true); await visit('/crates/foo/versions'); @@ -101,7 +101,7 @@ module('Acceptance | sudo', function (hooks) { }); test('admin can yank a crate in sudo mode', async function (assert) { - prepare(this, true); + await prepare(this, true); await visit('/crates/foo/versions'); await click('[data-test-enable-admin-actions]'); @@ -111,12 +111,12 @@ module('Acceptance | sudo', function (hooks) { await click('[data-test-version-yank-button="0.1.0"]'); await waitFor('[data-test-version-unyank-button="0.1.0"]'); - const crate = this.db.crate.findFirst({ where: { name: { equals: 'foo' } } }); - const version = this.db.version.findFirst({ crate: { id: { equals: crate.id } }, num: { equals: '0.1.0' } }); + const crate = this.db.crate.findFirst(q => q.where({ name: 'foo' })); + const version = this.db.version.findFirst(q => q.where(v => v.crate.id === crate.id && v.num === '0.1.0')); assert.true(version.yanked, 'The version should be yanked'); assert.dom('[data-test-version-unyank-button="0.1.0"]').exists(); await click('[data-test-version-unyank-button="0.1.0"]'); - const updatedVersion = this.db.version.findFirst({ crate: { id: { equals: crate.id } }, num: { equals: '0.1.0' } }); + const updatedVersion = this.db.version.findFirst(q => q.where(v => v.crate.id === crate.id && v.num === '0.1.0')); assert.false(updatedVersion.yanked, 'The version should be unyanked'); await waitFor('[data-test-version-yank-button="0.1.0"]'); diff --git a/tests/acceptance/support-test.js b/tests/acceptance/support-test.js index d2d197aad9d..d48616308f1 100644 --- a/tests/acceptance/support-test.js +++ b/tests/acceptance/support-test.js @@ -15,9 +15,9 @@ module('Acceptance | support', function (hooks) { setupApplicationTest(hooks); setupWindowMock(hooks); - hooks.beforeEach(function () { - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.version.create({ crate, num: '0.6.0' }); + hooks.beforeEach(async function () { + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.version.create({ crate, num: '0.6.0' }); window.open = (url, target, features) => { window.openKwargs = { url, target, features }; diff --git a/tests/acceptance/team-page-test.js b/tests/acceptance/team-page-test.js index 619baea78cf..3b3cf58f6a0 100644 --- a/tests/acceptance/team-page-test.js +++ b/tests/acceptance/team-page-test.js @@ -13,7 +13,7 @@ module('Acceptance | team page', function (hooks) { setupApplicationTest(hooks); test('has team organization display', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/teams/github:org:thehydroimpulse'); @@ -25,7 +25,7 @@ module('Acceptance | team page', function (hooks) { }); test('has link to github in team header', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/teams/github:org:thehydroimpulse'); @@ -33,7 +33,7 @@ module('Acceptance | team page', function (hooks) { }); test('team organization details has github profile icon', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/teams/github:org:thehydroimpulse'); diff --git a/tests/acceptance/token-invites-test.js b/tests/acceptance/token-invites-test.js index 8ef9cdc2429..84174b17368 100644 --- a/tests/acceptance/token-invites-test.js +++ b/tests/acceptance/token-invites-test.js @@ -47,12 +47,12 @@ module('Acceptance | /accept-invite/:token', function (hooks) { }); test('shows success for known token', async function (assert) { - let inviter = this.db.user.create(); - let invitee = this.db.user.create(); + let inviter = await this.db.user.create(); + let invitee = await this.db.user.create(); - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.version.create({ crate }); - let invite = this.db.crateOwnerInvitation.create({ crate, invitee, inviter }); + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.version.create({ crate }); + let invite = await this.db.crateOwnerInvitation.create({ crate, invitee, inviter }); await visit(`/accept-invite/${invite.token}`); assert.strictEqual(currentURL(), `/accept-invite/${invite.token}`); diff --git a/tests/acceptance/user-page-test.js b/tests/acceptance/user-page-test.js index a924c311979..a503a646749 100644 --- a/tests/acceptance/user-page-test.js +++ b/tests/acceptance/user-page-test.js @@ -13,7 +13,7 @@ module('Acceptance | user page', function (hooks) { setupApplicationTest(hooks); test('has user display', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/users/thehydroimpulse'); @@ -24,7 +24,7 @@ module('Acceptance | user page', function (hooks) { }); test('has link to github in user header', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/users/thehydroimpulse'); @@ -32,7 +32,7 @@ module('Acceptance | user page', function (hooks) { }); test('user details has github profile icon', async function (assert) { - loadFixtures(this.db); + await loadFixtures(this.db); await visit('/users/thehydroimpulse'); diff --git a/tests/acceptance/versions-test.js b/tests/acceptance/versions-test.js index b7772d81b72..6d1f0d8dcdd 100644 --- a/tests/acceptance/versions-test.js +++ b/tests/acceptance/versions-test.js @@ -16,11 +16,11 @@ module('Acceptance | crate versions page', function (hooks) { sha: 'abcdef1234567890', }; - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' }); - this.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' }); - this.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' }); - this.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01', trustpub_data: trustpubData }); + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' }); + await this.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' }); + await this.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' }); + await this.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01', trustpub_data: trustpubData }); await visit('/crates/nanomsg/versions'); assert.strictEqual(currentURL(), '/crates/nanomsg/versions'); @@ -38,16 +38,16 @@ module('Acceptance | crate versions page', function (hooks) { }); test('shows correct release tracks label after yanking/unyanking', async function (assert) { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create({ name: 'nanomsg' }); - this.db.crateOwnership.create({ crate, user }); + let crate = await this.db.crate.create({ name: 'nanomsg' }); + await this.db.crateOwnership.create({ crate, user }); - this.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' }); - this.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' }); - this.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' }); - this.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); + await this.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' }); + await this.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' }); + await this.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' }); + await this.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); await visit('/crates/nanomsg/versions'); assert.strictEqual(currentURL(), '/crates/nanomsg/versions'); diff --git a/tests/adapters/crate-test.js b/tests/adapters/crate-test.js index 2ad6571b231..6bbed6841d0 100644 --- a/tests/adapters/crate-test.js +++ b/tests/adapters/crate-test.js @@ -10,10 +10,10 @@ module('Adapter | crate', function (hooks) { setupMsw(hooks); test('findRecord requests are coalesced', async function (assert) { - let _foo = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate: _foo }); - let _bar = this.db.crate.create({ name: 'bar' }); - this.db.version.create({ crate: _bar }); + let _foo = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate: _foo }); + let _bar = await this.db.crate.create({ name: 'bar' }); + await this.db.version.create({ crate: _bar }); // if request coalescing works correctly, then this regular API endpoint // should not be hit in this case @@ -28,12 +28,12 @@ module('Adapter | crate', function (hooks) { }); test('findRecord requests do not include versions by default', async function (assert) { - let _foo = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate: _foo, num: '0.0.1' }); - this.db.version.create({ crate: _foo, num: '0.0.2' }); - this.db.version.create({ crate: _foo, num: '0.0.3' }); + let _foo = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate: _foo, num: '0.0.1' }); + await this.db.version.create({ crate: _foo, num: '0.0.2' }); + await this.db.version.create({ crate: _foo, num: '0.0.3' }); - let versions = this.db.version.getAll().reverse(); + let versions = this.db.version.findMany(null).reverse(); let default_version = versions.find(it => it.num === '0.0.3'); let store = this.owner.lookup('service:store'); diff --git a/tests/bugs/11772-test.js b/tests/bugs/11772-test.js index eff836e4984..25e9125d0d7 100644 --- a/tests/bugs/11772-test.js +++ b/tests/bugs/11772-test.js @@ -6,16 +6,16 @@ import { setupApplicationTest } from 'crates-io/tests/helpers'; module('Bug #11772', function (hooks) { setupApplicationTest(hooks); - function prepare(context) { + async function prepare(context) { let { db } = context; // Create a crate that will appear in "New Crates" section - let newCrate = db.crate.create({ name: 'test-crate' }); - db.version.create({ crate: newCrate, num: '1.2.3' }); + let newCrate = await db.crate.create({ name: 'test-crate' }); + await db.version.create({ crate: newCrate, num: '1.2.3' }); } test('crate versions should remain correct after navigating back from crate details', async function (assert) { - prepare(this); + await prepare(this); // Visit homepage await visit('/'); @@ -42,8 +42,8 @@ module('Bug #11772', function (hooks) { let { db } = this; // Create a crate with an actual v0.0.0 version - let zeroCrate = db.crate.create({ name: 'test-zero-crate' }); - db.version.create({ crate: zeroCrate, num: '0.0.0' }); + let zeroCrate = await db.crate.create({ name: 'test-zero-crate' }); + await db.version.create({ crate: zeroCrate, num: '0.0.0' }); // Visit homepage await visit('/'); diff --git a/tests/bugs/4506-test.js b/tests/bugs/4506-test.js index 8264979ef80..3a4ad3acfa9 100644 --- a/tests/bugs/4506-test.js +++ b/tests/bugs/4506-test.js @@ -8,20 +8,20 @@ import { visit } from '../helpers/visit-ignoring-abort'; module('Bug #4506', function (hooks) { setupApplicationTest(hooks); - function prepare(context) { + async function prepare(context) { let { db } = context; - let noStd = db.keyword.create({ keyword: 'no-std' }); + let noStd = await db.keyword.create({ keyword: 'no-std' }); - let foo = db.crate.create({ name: 'foo', keywords: [noStd] }); - db.version.create({ crate: foo }); + let foo = await db.crate.create({ name: 'foo', keywords: [noStd] }); + await db.version.create({ crate: foo }); - let bar = db.crate.create({ name: 'bar', keywords: [noStd] }); - db.version.create({ crate: bar }); + let bar = await db.crate.create({ name: 'bar', keywords: [noStd] }); + await db.version.create({ crate: bar }); } test('is fixed', async function (assert) { - prepare(this); + await prepare(this); await visit('/crates/foo'); assert.dom('[data-test-keyword]').exists({ count: 1 }); @@ -32,7 +32,7 @@ module('Bug #4506', function (hooks) { }); test('is fixed for /keywords too', async function (assert) { - prepare(this); + await prepare(this); await visit('/keywords'); assert.dom('[data-test-keyword]').exists({ count: 1 }); diff --git a/tests/components/crate-row-test.gjs b/tests/components/crate-row-test.gjs index 55c434dd770..bc1825e131d 100644 --- a/tests/components/crate-row-test.gjs +++ b/tests/components/crate-row-test.gjs @@ -10,11 +10,11 @@ module('Component | CrateRow', function (hooks) { setupMsw(hooks); test('shows crate name and highest stable version', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); - this.db.version.create({ crate, num: '1.2.3', yanked: true }); - this.db.version.create({ crate, num: '2.0.0-beta.1' }); - this.db.version.create({ crate, num: '1.1.2' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); + await this.db.version.create({ crate, num: '1.2.3', yanked: true }); + await this.db.version.create({ crate, num: '2.0.0-beta.1' }); + await this.db.version.create({ crate, num: '1.1.2' }); let store = this.owner.lookup('service:store'); let crateModel = await store.findRecord('crate', crate.name); @@ -26,10 +26,10 @@ module('Component | CrateRow', function (hooks) { }); test('shows crate name and highest version, if there is no stable version available', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0-beta.1' }); - this.db.version.create({ crate, num: '1.0.0-beta.3' }); - this.db.version.create({ crate, num: '1.0.0-beta.2' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0-beta.1' }); + await this.db.version.create({ crate, num: '1.0.0-beta.3' }); + await this.db.version.create({ crate, num: '1.0.0-beta.2' }); let store = this.owner.lookup('service:store'); let crateModel = await store.findRecord('crate', crate.name); @@ -41,9 +41,9 @@ module('Component | CrateRow', function (hooks) { }); test('shows crate name and no version if all versions are yanked', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0', yanked: true }); - this.db.version.create({ crate, num: '1.2.3', yanked: true }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0', yanked: true }); + await this.db.version.create({ crate, num: '1.2.3', yanked: true }); let store = this.owner.lookup('service:store'); let crateModel = await store.findRecord('crate', crate.name); diff --git a/tests/components/crate-sidebar/playground-button-test.gjs b/tests/components/crate-sidebar/playground-button-test.gjs index b4c3f166524..a24f28d1293 100644 --- a/tests/components/crate-sidebar/playground-button-test.gjs +++ b/tests/components/crate-sidebar/playground-button-test.gjs @@ -29,8 +29,8 @@ module('Component | CrateSidebar | Playground Button', function (hooks) { }); test('button is hidden for unavailable crates', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); let store = this.owner.lookup('service:store'); let crateModel = await store.findRecord('crate', crate.name); @@ -42,8 +42,8 @@ module('Component | CrateSidebar | Playground Button', function (hooks) { }); test('button is visible for available crates', async function (assert) { - let crate = this.db.crate.create({ name: 'aho-corasick' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'aho-corasick' }); + await this.db.version.create({ crate, num: '1.0.0' }); let store = this.owner.lookup('service:store'); let crateModel = await store.findRecord('crate', crate.name); @@ -58,8 +58,8 @@ module('Component | CrateSidebar | Playground Button', function (hooks) { }); test('button is hidden while Playground request is pending', async function (assert) { - let crate = this.db.crate.create({ name: 'aho-corasick' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'aho-corasick' }); + await this.db.version.create({ crate, num: '1.0.0' }); let deferred = defer(); this.worker.use(http.get('https://play.rust-lang.org/meta/crates', () => deferred.promise)); @@ -78,8 +78,8 @@ module('Component | CrateSidebar | Playground Button', function (hooks) { }); test('button is hidden if the Playground request fails', async function (assert) { - let crate = this.db.crate.create({ name: 'aho-corasick' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'aho-corasick' }); + await this.db.version.create({ crate, num: '1.0.0' }); let error = HttpResponse.json({}, { status: 500 }); this.worker.use(http.get('https://play.rust-lang.org/meta/crates', () => error)); diff --git a/tests/components/crate-sidebar/toml-snippet-test.gjs b/tests/components/crate-sidebar/toml-snippet-test.gjs index df404202d48..f82ca1871a8 100644 --- a/tests/components/crate-sidebar/toml-snippet-test.gjs +++ b/tests/components/crate-sidebar/toml-snippet-test.gjs @@ -10,8 +10,8 @@ module('Component | CrateSidebar | toml snippet', function (hooks) { setupMsw(hooks); test('show version number with `=` prefix', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); let store = this.owner.lookup('service:store'); let crateModel = await store.findRecord('crate', crate.name); @@ -30,8 +30,8 @@ module('Component | CrateSidebar | toml snippet', function (hooks) { }); test('show version number without build metadata', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0+abcdef' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0+abcdef' }); let store = this.owner.lookup('service:store'); let crateModel = await store.findRecord('crate', crate.name); @@ -43,8 +43,8 @@ module('Component | CrateSidebar | toml snippet', function (hooks) { }); test('show pre-release version number without build', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0-alpha+abcdef' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0-alpha+abcdef' }); let store = this.owner.lookup('service:store'); let crateModel = await store.findRecord('crate', crate.name); diff --git a/tests/components/owners-list-test.gjs b/tests/components/owners-list-test.gjs index fa59d595773..ca2ab52a210 100644 --- a/tests/components/owners-list-test.gjs +++ b/tests/components/owners-list-test.gjs @@ -10,11 +10,11 @@ module('Component | OwnersList', function (hooks) { setupMsw(hooks); test('single user', async function (assert) { - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); - let user = this.db.user.create(); - this.db.crateOwnership.create({ crate, user }); + let user = await this.db.user.create(); + await this.db.crateOwnership.create({ crate, user }); let store = this.owner.lookup('service:store'); let crateModel = await store.findRecord('crate', crate.name); @@ -33,11 +33,11 @@ module('Component | OwnersList', function (hooks) { }); test('user without `name`', async function (assert) { - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); - let user = this.db.user.create({ name: null, login: 'anonymous' }); - this.db.crateOwnership.create({ crate, user }); + let user = await this.db.user.create({ name: null, login: 'anonymous' }); + await this.db.crateOwnership.create({ crate, user }); let store = this.owner.lookup('service:store'); let crateModel = await store.findRecord('crate', crate.name); @@ -56,12 +56,12 @@ module('Component | OwnersList', function (hooks) { }); test('five users', async function (assert) { - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); for (let i = 0; i < 5; i++) { - let user = this.db.user.create(); - this.db.crateOwnership.create({ crate, user }); + let user = await this.db.user.create(); + await this.db.crateOwnership.create({ crate, user }); } let store = this.owner.lookup('service:store'); @@ -78,12 +78,12 @@ module('Component | OwnersList', function (hooks) { }); test('six users', async function (assert) { - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); for (let i = 0; i < 6; i++) { - let user = this.db.user.create(); - this.db.crateOwnership.create({ crate, user }); + let user = await this.db.user.create(); + await this.db.crateOwnership.create({ crate, user }); } let store = this.owner.lookup('service:store'); @@ -100,16 +100,16 @@ module('Component | OwnersList', function (hooks) { }); test('teams mixed with users', async function (assert) { - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); for (let i = 0; i < 3; i++) { - let user = this.db.user.create(); - this.db.crateOwnership.create({ crate, user }); + let user = await this.db.user.create(); + await this.db.crateOwnership.create({ crate, user }); } for (let i = 0; i < 2; i++) { - let team = this.db.team.create({ org: 'crates-io' }); - this.db.crateOwnership.create({ crate, team }); + let team = await this.db.team.create({ org: 'crates-io' }); + await this.db.crateOwnership.create({ crate, team }); } let store = this.owner.lookup('service:store'); diff --git a/tests/components/privileged-action-test.gjs b/tests/components/privileged-action-test.gjs index ad10b8943c7..5ec30c12903 100644 --- a/tests/components/privileged-action-test.gjs +++ b/tests/components/privileged-action-test.gjs @@ -33,8 +33,8 @@ module('Component | PrivilegedAction', hooks => { }); test('unprivileged block is shown to a logged in user without access', async function (assert) { - const user = this.db.user.create(); - this.authenticateAs(user); + const user = await this.db.user.create(); + await this.authenticateAs(user); await this.renderComponent(false); assert.dom('[data-test-privileged]').doesNotExist(); @@ -43,8 +43,8 @@ module('Component | PrivilegedAction', hooks => { }); test('privileged block is shown to a logged in user with access', async function (assert) { - const user = this.db.user.create(); - this.authenticateAs(user); + const user = await this.db.user.create(); + await this.authenticateAs(user); await this.renderComponent(true); assert.dom('[data-test-privileged]').exists(); @@ -53,8 +53,8 @@ module('Component | PrivilegedAction', hooks => { }); test('placeholder block is shown to a logged in admin without sudo', async function (assert) { - const user = this.db.user.create({ isAdmin: true }); - this.authenticateAs(user); + const user = await this.db.user.create({ isAdmin: true }); + await this.authenticateAs(user); const session = this.owner.lookup('service:session'); let { currentUser } = await session.loadUserTask.perform(); @@ -68,8 +68,8 @@ module('Component | PrivilegedAction', hooks => { }); test('privileged block is shown to a logged in admin without sudo with access', async function (assert) { - const user = this.db.user.create({ isAdmin: true }); - this.authenticateAs(user); + const user = await this.db.user.create({ isAdmin: true }); + await this.authenticateAs(user); const session = this.owner.lookup('service:session'); let { currentUser } = await session.loadUserTask.perform(); @@ -83,8 +83,8 @@ module('Component | PrivilegedAction', hooks => { }); test('privileged block is shown to a logged in admin with sudo', async function (assert) { - const user = this.db.user.create({ isAdmin: true }); - this.authenticateAs(user); + const user = await this.db.user.create({ isAdmin: true }); + await this.authenticateAs(user); const session = this.owner.lookup('service:session'); let { currentUser } = await session.loadUserTask.perform(); @@ -99,8 +99,8 @@ module('Component | PrivilegedAction', hooks => { }); test('automatic placeholder block', async function (assert) { - const user = this.db.user.create({ isAdmin: true }); - this.authenticateAs(user); + const user = await this.db.user.create({ isAdmin: true }); + await this.authenticateAs(user); const session = this.owner.lookup('service:session'); let { currentUser } = await session.loadUserTask.perform(); diff --git a/tests/components/version-list-row-test.gjs b/tests/components/version-list-row-test.gjs index 590cb5e3136..20f513b1221 100644 --- a/tests/components/version-list-row-test.gjs +++ b/tests/components/version-list-row-test.gjs @@ -10,9 +10,9 @@ module('Component | VersionList::Row', function (hooks) { setupMsw(hooks); test('handle non-standard semver strings', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '0.4.0-alpha.01', created_at: Date.now(), updated_at: Date.now() }); - this.db.version.create({ crate, num: '0.3.0-alpha.01', created_at: Date.now(), updated_at: Date.now() }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '0.4.0-alpha.01' }); + await this.db.version.create({ crate, num: '0.3.0-alpha.01' }); let store = this.owner.lookup('service:store'); let crateRecord = await store.findRecord('crate', crate.name); @@ -31,9 +31,9 @@ module('Component | VersionList::Row', function (hooks) { }); test('handle node-semver parsing errors', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); + let crate = await this.db.crate.create({ name: 'foo' }); let version = '18446744073709551615.18446744073709551615.18446744073709551615'; - this.db.version.create({ crate, num: version }); + await this.db.version.create({ crate, num: version }); let store = this.owner.lookup('service:store'); let crateRecord = await store.findRecord('crate', crate.name); @@ -46,27 +46,21 @@ module('Component | VersionList::Row', function (hooks) { }); test('pluralize "feature" only when appropriate', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '0.1.0', features: {}, - created_at: Date.now(), - updated_at: Date.now(), }); - this.db.version.create({ + await this.db.version.create({ crate, num: '0.2.0', features: { one: [] }, - created_at: Date.now(), - updated_at: Date.now(), }); - this.db.version.create({ + await this.db.version.create({ crate, num: '0.3.0', features: { one: [], two: [] }, - created_at: Date.now(), - updated_at: Date.now(), }); let store = this.owner.lookup('service:store'); diff --git a/tests/helpers/setup-msw.js b/tests/helpers/setup-msw.js index ea0211b8e87..0914b522c9c 100644 --- a/tests/helpers/setup-msw.js +++ b/tests/helpers/setup-msw.js @@ -28,8 +28,8 @@ export default function (hooks) { this.worker = worker; this.db = db; - this.authenticateAs = user => { - db.mswSession.create({ user }); + this.authenticateAs = async user => { + await db.mswSession.create({ user }); window.localStorage.setItem('isLoggedIn', '1'); }; }); diff --git a/tests/models/crate-test.js b/tests/models/crate-test.js index 211edf5e490..c020613b8cf 100644 --- a/tests/models/crate-test.js +++ b/tests/models/crate-test.js @@ -15,40 +15,40 @@ module('Model | Crate', function (hooks) { module('setTrustpubOnlyTask', function () { test('enables trustpub_only', async function (assert) { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create({ trustpubOnly: false }); - this.db.version.create({ crate }); + let crate = await this.db.crate.create({ trustpubOnly: false }); + await this.db.version.create({ crate }); let crateRecord = await this.store.findRecord('crate', crate.name); assert.false(crateRecord.trustpub_only); - assert.false(this.db.crate.findFirst({ where: { id: { equals: crate.id } } }).trustpubOnly); + assert.false(this.db.crate.findFirst(q => q.where({ id: crate.id })).trustpubOnly); await crateRecord.setTrustpubOnlyTask.perform(true); assert.true(crateRecord.trustpub_only); - assert.true(this.db.crate.findFirst({ where: { id: { equals: crate.id } } }).trustpubOnly); + assert.true(this.db.crate.findFirst(q => q.where({ id: crate.id })).trustpubOnly); }); test('disables trustpub_only', async function (assert) { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create({ trustpubOnly: true }); - this.db.version.create({ crate }); + let crate = await this.db.crate.create({ trustpubOnly: true }); + await this.db.version.create({ crate }); let crateRecord = await this.store.findRecord('crate', crate.name); assert.true(crateRecord.trustpub_only); - assert.true(this.db.crate.findFirst({ where: { id: { equals: crate.id } } }).trustpubOnly); + assert.true(this.db.crate.findFirst(q => q.where({ id: crate.id })).trustpubOnly); await crateRecord.setTrustpubOnlyTask.perform(false); assert.false(crateRecord.trustpub_only); - assert.false(this.db.crate.findFirst({ where: { id: { equals: crate.id } } }).trustpubOnly); + assert.false(this.db.crate.findFirst(q => q.where({ id: crate.id })).trustpubOnly); }); test('requires authentication', async function (assert) { - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); let crateRecord = await this.store.findRecord('crate', crate.name); @@ -61,13 +61,13 @@ module('Model | Crate', function (hooks) { module('inviteOwner()', function () { test('happy path', async function (assert) { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); - let user2 = this.db.user.create(); + let user2 = await this.db.user.create(); let crateRecord = await this.store.findRecord('crate', crate.name); @@ -76,11 +76,11 @@ module('Model | Crate', function (hooks) { }); test('error handling', async function (assert) { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); let crateRecord = await this.store.findRecord('crate', crate.name); @@ -93,14 +93,14 @@ module('Model | Crate', function (hooks) { module('removeOwner()', function () { test('happy path', async function (assert) { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); - let user2 = this.db.user.create(); - this.db.crateOwnership.create({ crate, user: user2 }); + let user2 = await this.db.user.create(); + await this.db.crateOwnership.create({ crate, user: user2 }); let crateRecord = await this.store.findRecord('crate', crate.name); @@ -109,11 +109,11 @@ module('Model | Crate', function (hooks) { }); test('error handling', async function (assert) { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); let crateRecord = await this.store.findRecord('crate', crate.name); diff --git a/tests/models/trustpub-github-config-test.js b/tests/models/trustpub-github-config-test.js index 249c0ee2c41..e3a4d818ee2 100644 --- a/tests/models/trustpub-github-config-test.js +++ b/tests/models/trustpub-github-config-test.js @@ -15,14 +15,14 @@ module('Model | TrustpubGitHubConfig', function (hooks) { module('query()', function () { test('fetches GitHub configs for a crate', async function (assert) { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create(); - this.db.version.create({ crate }); - this.db.crateOwnership.create({ crate, user }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); + await this.db.crateOwnership.create({ crate, user }); - let config = this.db.trustpubGithubConfig.create({ + let config = await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -39,8 +39,8 @@ module('Model | TrustpubGitHubConfig', function (hooks) { }); test('returns an error if the user is not authenticated', async function (assert) { - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); await assert.rejects(this.store.query('trustpub-github-config', { crate: crate.name }), function (error) { assert.deepEqual(error.errors, [{ detail: 'must be logged in to perform that action' }]); @@ -49,11 +49,11 @@ module('Model | TrustpubGitHubConfig', function (hooks) { }); test('returns an error if the user is not an owner of the crate', async function (assert) { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); await assert.rejects(this.store.query('trustpub-github-config', { crate: crate.name }), function (error) { assert.deepEqual(error.errors, [{ detail: 'You are not an owner of this crate' }]); @@ -64,12 +64,12 @@ module('Model | TrustpubGitHubConfig', function (hooks) { module('createRecord()', function () { test('creates a new GitHub config', async function (assert) { - let user = this.db.user.create({ emailVerified: true }); - this.authenticateAs(user); + let user = await this.db.user.create({ emailVerified: true }); + await this.authenticateAs(user); - let crate = this.db.crate.create(); - this.db.version.create({ crate }); - this.db.crateOwnership.create({ crate, user }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); + await this.db.crateOwnership.create({ crate, user }); let config = this.store.createRecord('trustpub-github-config', { crate: await this.store.findRecord('crate', crate.name), @@ -86,8 +86,8 @@ module('Model | TrustpubGitHubConfig', function (hooks) { }); test('returns an error if the user is not authenticated', async function (assert) { - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); let config = this.store.createRecord('trustpub-github-config', { crate: await this.store.findRecord('crate', crate.name), @@ -103,11 +103,11 @@ module('Model | TrustpubGitHubConfig', function (hooks) { }); test('returns an error if the user is not an owner of the crate', async function (assert) { - let user = this.db.user.create({ emailVerified: true }); - this.authenticateAs(user); + let user = await this.db.user.create({ emailVerified: true }); + await this.authenticateAs(user); - let crate = this.db.crate.create(); - this.db.version.create({ crate }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); let config = this.store.createRecord('trustpub-github-config', { crate: await this.store.findRecord('crate', crate.name), @@ -123,12 +123,12 @@ module('Model | TrustpubGitHubConfig', function (hooks) { }); test('returns an error if the user does not have a verified email', async function (assert) { - let user = this.db.user.create({ emailVerified: false }); - this.authenticateAs(user); + let user = await this.db.user.create({ emailVerified: false }); + await this.authenticateAs(user); - let crate = this.db.crate.create(); - this.db.version.create({ crate }); - this.db.crateOwnership.create({ crate, user }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); + await this.db.crateOwnership.create({ crate, user }); let config = this.store.createRecord('trustpub-github-config', { crate: await this.store.findRecord('crate', crate.name), @@ -147,15 +147,15 @@ module('Model | TrustpubGitHubConfig', function (hooks) { module('deleteRecord()', function () { test('deletes a GitHub config', async function (assert) { - let user = this.db.user.create(); - this.authenticateAs(user); + let user = await this.db.user.create(); + await this.authenticateAs(user); - let crate = this.db.crate.create(); - this.db.version.create({ crate }); - this.db.crateOwnership.create({ crate, user }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); + await this.db.crateOwnership.create({ crate, user }); // Create a config in the database that will be queried later - this.db.trustpubGithubConfig.create({ + await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -172,25 +172,25 @@ module('Model | TrustpubGitHubConfig', function (hooks) { }); test('returns an error if the user is not authenticated', async function (assert) { - let user = this.db.user.create(); + let user = await this.db.user.create(); - let crate = this.db.crate.create(); - this.db.version.create({ crate }); - this.db.crateOwnership.create({ crate, user }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); + await this.db.crateOwnership.create({ crate, user }); // Create a config in the database that will be queried later - this.db.trustpubGithubConfig.create({ + await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', workflow_filename: 'ci.yml', }); - this.authenticateAs(user); + await this.authenticateAs(user); let configs = await this.store.query('trustpub-github-config', { crate: crate.name }); assert.strictEqual(configs.length, 1); - db.mswSession.deleteMany({}); + db.mswSession.deleteMany(null); await assert.rejects(configs[0].destroyRecord(), function (error) { assert.deepEqual(error.errors, [{ detail: 'must be logged in to perform that action' }]); @@ -199,27 +199,27 @@ module('Model | TrustpubGitHubConfig', function (hooks) { }); test('returns an error if the user is not an owner of the crate', async function (assert) { - let user1 = this.db.user.create(); - let user2 = this.db.user.create(); + let user1 = await this.db.user.create(); + let user2 = await this.db.user.create(); - let crate = this.db.crate.create(); - this.db.version.create({ crate }); - this.db.crateOwnership.create({ crate, user: user1 }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate }); + await this.db.crateOwnership.create({ crate, user: user1 }); // Create a config in the database that will be queried later - this.db.trustpubGithubConfig.create({ + await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', workflow_filename: 'ci.yml', }); - this.authenticateAs(user1); + await this.authenticateAs(user1); let configs = await this.store.query('trustpub-github-config', { crate: crate.name }); assert.strictEqual(configs.length, 1); - db.mswSession.deleteMany({}); - this.authenticateAs(user2); + db.mswSession.deleteMany(null); + await this.authenticateAs(user2); await assert.rejects(configs[0].destroyRecord(), function (error) { assert.deepEqual(error.errors, [{ detail: 'You are not an owner of this crate' }]); diff --git a/tests/models/user-test.js b/tests/models/user-test.js index be4bd853ee7..5cd854e3376 100644 --- a/tests/models/user-test.js +++ b/tests/models/user-test.js @@ -15,9 +15,9 @@ module('Model | User', function (hooks) { module('changeEmail()', function () { test('happy path', async function (assert) { - let user = this.db.user.create({ email: 'old@email.com' }); + let user = await this.db.user.create({ email: 'old@email.com' }); - this.authenticateAs(user); + await this.authenticateAs(user); let { currentUser } = await this.owner.lookup('service:session').loadUserTask.perform(); assert.strictEqual(currentUser.email, 'old@email.com'); @@ -31,9 +31,9 @@ module('Model | User', function (hooks) { }); test('error handling', async function (assert) { - let user = this.db.user.create({ email: 'old@email.com' }); + let user = await this.db.user.create({ email: 'old@email.com' }); - this.authenticateAs(user); + await this.authenticateAs(user); let error = HttpResponse.json({}, { status: 500 }); this.worker.use(http.put('/api/v1/users/:user_id', () => error)); @@ -57,8 +57,8 @@ module('Model | User', function (hooks) { test('happy path', async function (assert) { assert.expect(0); - let user = this.db.user.create({ emailVerificationToken: 'secret123' }); - this.authenticateAs(user); + let user = await this.db.user.create({ emailVerificationToken: 'secret123' }); + await this.authenticateAs(user); let { currentUser } = await this.owner.lookup('service:session').loadUserTask.perform(); @@ -66,8 +66,8 @@ module('Model | User', function (hooks) { }); test('error handling', async function (assert) { - let user = this.db.user.create({ emailVerificationToken: 'secret123' }); - this.authenticateAs(user); + let user = await this.db.user.create({ emailVerificationToken: 'secret123' }); + await this.authenticateAs(user); let error = HttpResponse.json({}, { status: 500 }); this.worker.use(http.put('/api/v1/users/:user_id/resend', () => error)); diff --git a/tests/models/version-test.js b/tests/models/version-test.js index ef6e4d52611..b26b4c52b7b 100644 --- a/tests/models/version-test.js +++ b/tests/models/version-test.js @@ -19,22 +19,22 @@ module('Model | Version', function (hooks) { test('isNew', async function (assert) { let { db, store } = this; - let crate = db.crate.create(); - db.version.create({ crate, created_at: '2010-06-16T21:30:45Z' }); + let crate = await db.crate.create(); + await db.version.create({ crate, created_at: '2010-06-16T21:30:45Z' }); let crateRecord = await store.findRecord('crate', crate.name); let versions = (await crateRecord.versions).slice(); - this.clock.setSystemTime(new Date('2010-06-16T21:40:45Z')); + await this.clock.setSystemTime(new Date('2010-06-16T21:40:45Z')); assert.true(versions[0].isNew); - this.clock.setSystemTime(new Date('2010-06-23T21:40:45Z')); + await this.clock.setSystemTime(new Date('2010-06-23T21:40:45Z')); assert.true(versions[0].isNew); - this.clock.setSystemTime(new Date('2010-06-24T21:40:45Z')); + await this.clock.setSystemTime(new Date('2010-06-24T21:40:45Z')); assert.false(versions[0].isNew); - this.clock.setSystemTime(new Date('2014-06-24T21:40:45Z')); + await this.clock.setSystemTime(new Date('2014-06-24T21:40:45Z')); assert.false(versions[0].isNew); }); @@ -77,8 +77,8 @@ module('Model | Version', function (hooks) { async function prepare(context, { num }) { let { db, store } = context; - let crate = db.crate.create(); - db.version.create({ crate, num }); + let crate = await db.crate.create(); + await db.version.create({ crate, num }); let crateRecord = await store.findRecord('crate', crate.name); let versions = (await crateRecord.versions).slice(); @@ -167,9 +167,9 @@ module('Model | Version', function (hooks) { '0.1.1', ]; - let crate = this.db.crate.create(); + let crate = await this.db.crate.create(); for (let num of nums.toReversed()) { - this.db.version.create({ crate, num }); + await this.db.version.create({ crate, num }); } let crateRecord = await this.store.findRecord('crate', crate.name); @@ -199,10 +199,10 @@ module('Model | Version', function (hooks) { }); test('ignores yanked versions', async function (assert) { - let crate = this.db.crate.create(); - this.db.version.create({ crate, num: '0.4.0' }); - this.db.version.create({ crate, num: '0.4.1' }); - this.db.version.create({ crate, num: '0.4.2', yanked: true }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate, num: '0.4.0' }); + await this.db.version.create({ crate, num: '0.4.1' }); + await this.db.version.create({ crate, num: '0.4.2', yanked: true }); let crateRecord = await this.store.findRecord('crate', crate.name); let versions = (await crateRecord.loadVersionsTask.perform()).slice(); @@ -219,9 +219,9 @@ module('Model | Version', function (hooks) { }); test('handles newly released versions correctly', async function (assert) { - let crate = this.db.crate.create(); - this.db.version.create({ crate, num: '0.4.0' }); - this.db.version.create({ crate, num: '0.4.1' }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate, num: '0.4.0' }); + await this.db.version.create({ crate, num: '0.4.1' }); let crateRecord = await this.store.findRecord('crate', crate.name); let versions = (await crateRecord.loadVersionsTask.perform()).slice(); @@ -235,8 +235,8 @@ module('Model | Version', function (hooks) { ], ); - this.db.version.create({ crate, num: '0.4.2' }); - this.db.version.create({ crate, num: '0.4.3', yanked: true }); + await this.db.version.create({ crate, num: '0.4.2' }); + await this.db.version.create({ crate, num: '0.4.3', yanked: true }); crateRecord = await this.store.findRecord('crate', crate.name, { reload: true }); versions = (await crateRecord.loadVersionsTask.perform({ reload: true })).slice(); crateRecord.release_tracks = calculateReleaseTracks(versions); @@ -257,8 +257,8 @@ module('Model | Version', function (hooks) { async function prepare(context, { features }) { let { db, store } = context; - let crate = db.crate.create(); - db.version.create({ crate, features }); + let crate = await db.crate.create(); + await db.version.create({ crate, features }); let crateRecord = await store.findRecord('crate', crate.name); let versions = (await crateRecord.versions).slice(); @@ -335,10 +335,10 @@ module('Model | Version', function (hooks) { }); test('`published_by` relationship is assigned correctly', async function (assert) { - let user = this.db.user.create({ name: 'JD' }); + let user = await this.db.user.create({ name: 'JD' }); - let crate = this.db.crate.create(); - this.db.version.create({ crate, publishedBy: user }); + let crate = await this.db.crate.create(); + await this.db.version.create({ crate, publishedBy: user }); let crateRecord = await this.store.findRecord('crate', crate.name); assert.ok(crateRecord); @@ -355,8 +355,8 @@ module('Model | Version', function (hooks) { window.location = 'https://crates.io'; - let crate = db.crate.create({ name: 'serde' }); - db.version.create({ crate, num: '1.0.136' }); + let crate = await db.crate.create({ name: 'serde' }); + await db.version.create({ crate, num: '1.0.136' }); let crateRecord = await store.findRecord('crate', crate.name); let versions = (await crateRecord.versions).slice(); @@ -370,8 +370,8 @@ module('Model | Version', function (hooks) { window.location = 'https://staging.crates.io'; - let crate = db.crate.create({ name: 'test-crate' }); - db.version.create({ crate, num: '2.5.0' }); + let crate = await db.crate.create({ name: 'test-crate' }); + await db.version.create({ crate, num: '2.5.0' }); let crateRecord = await store.findRecord('crate', crate.name); let versions = (await crateRecord.versions).slice(); diff --git a/tests/routes/category-test.js b/tests/routes/category-test.js index 4339db3392f..bccb18aee0d 100644 --- a/tests/routes/category-test.js +++ b/tests/routes/category-test.js @@ -32,7 +32,7 @@ module('Route | category', function (hooks) { }); test('updates the search field when the categories route is accessed', async function (assert) { - this.db.category.create({ category: 'foo' }); + await this.db.category.create({ category: 'foo' }); await visit('/'); assert.dom('[data-test-search-input]').hasValue(''); diff --git a/tests/routes/crate/delete-test.js b/tests/routes/crate/delete-test.js index ecab91686f1..6a3bf612b59 100644 --- a/tests/routes/crate/delete-test.js +++ b/tests/routes/crate/delete-test.js @@ -13,21 +13,21 @@ import { visit } from '../../helpers/visit-ignoring-abort'; module('Route: crate.delete', function (hooks) { setupApplicationTest(hooks); - function prepare(context) { - let user = context.db.user.create(); + async function prepare(context) { + let user = await context.db.user.create(); - let crate = context.db.crate.create({ name: 'foo' }); - context.db.version.create({ crate }); - context.db.crateOwnership.create({ crate, user }); + let crate = await context.db.crate.create({ name: 'foo' }); + await context.db.version.create({ crate }); + await context.db.crateOwnership.create({ crate, user }); - context.authenticateAs(user); + await context.authenticateAs(user); return { user }; } test('unauthenticated', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate }); await visit('/crates/foo/delete'); assert.strictEqual(currentURL(), '/crates/foo/delete'); @@ -36,13 +36,13 @@ module('Route: crate.delete', function (hooks) { }); test('not an owner', async function (assert) { - let user1 = this.db.user.create(); - this.authenticateAs(user1); + let user1 = await this.db.user.create(); + await this.authenticateAs(user1); - let user2 = this.db.user.create(); - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate }); - this.db.crateOwnership.create({ crate, user: user2 }); + let user2 = await this.db.user.create(); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate }); + await this.db.crateOwnership.create({ crate, user: user2 }); await visit('/crates/foo/delete'); assert.strictEqual(currentURL(), '/crates/foo/delete'); @@ -51,7 +51,7 @@ module('Route: crate.delete', function (hooks) { }); test('happy path', async function (assert) { - prepare(this); + await prepare(this); await visit('/crates/foo/delete'); assert.strictEqual(currentURL(), '/crates/foo/delete'); @@ -69,12 +69,12 @@ module('Route: crate.delete', function (hooks) { let message = 'Crate foo has been successfully deleted.'; assert.dom('[data-test-notification-message="success"]').hasText(message); - let crate = this.db.crate.findFirst({ where: { name: { equals: 'foo' } } }); - assert.strictEqual(crate, null); + let crate = this.db.crate.findFirst(q => q.where({ name: 'foo' })); + assert.strictEqual(crate, undefined); }); test('loading state', async function (assert) { - prepare(this); + await prepare(this); let deferred = defer(); this.worker.use(http.delete('/api/v1/crates/foo', () => deferred.promise)); @@ -94,7 +94,7 @@ module('Route: crate.delete', function (hooks) { }); test('error state', async function (assert) { - prepare(this); + await prepare(this); let payload = { errors: [{ detail: 'only crates without reverse dependencies can be deleted after 72 hours' }] }; let error = HttpResponse.json(payload, { status: 422 }); diff --git a/tests/routes/crate/range-test.js b/tests/routes/crate/range-test.js index fd7c7a13fca..596b22699ae 100644 --- a/tests/routes/crate/range-test.js +++ b/tests/routes/crate/range-test.js @@ -11,11 +11,11 @@ module('Route | crate.range', function (hooks) { setupApplicationTest(hooks); test('happy path', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); - this.db.version.create({ crate, num: '1.1.0' }); - this.db.version.create({ crate, num: '1.2.0' }); - this.db.version.create({ crate, num: '1.2.3' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); + await this.db.version.create({ crate, num: '1.1.0' }); + await this.db.version.create({ crate, num: '1.2.0' }); + await this.db.version.create({ crate, num: '1.2.3' }); await visit('/crates/foo/range/^1.1.0'); assert.strictEqual(currentURL(), `/crates/foo/1.2.3`); @@ -25,11 +25,11 @@ module('Route | crate.range', function (hooks) { }); test('happy path with tilde range', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); - this.db.version.create({ crate, num: '1.1.0' }); - this.db.version.create({ crate, num: '1.1.1' }); - this.db.version.create({ crate, num: '1.2.0' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); + await this.db.version.create({ crate, num: '1.1.0' }); + await this.db.version.create({ crate, num: '1.1.1' }); + await this.db.version.create({ crate, num: '1.2.0' }); await visit('/crates/foo/range/~1.1.0'); assert.strictEqual(currentURL(), `/crates/foo/1.1.1`); @@ -39,11 +39,11 @@ module('Route | crate.range', function (hooks) { }); test('happy path with cargo style and', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.4.2' }); - this.db.version.create({ crate, num: '1.3.4' }); - this.db.version.create({ crate, num: '1.3.3' }); - this.db.version.create({ crate, num: '1.2.6' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.4.2' }); + await this.db.version.create({ crate, num: '1.3.4' }); + await this.db.version.create({ crate, num: '1.3.3' }); + await this.db.version.create({ crate, num: '1.2.6' }); await visit('/crates/foo/range/>=1.3.0, <1.4.0'); assert.strictEqual(currentURL(), `/crates/foo/1.3.4`); @@ -53,11 +53,11 @@ module('Route | crate.range', function (hooks) { }); test('ignores yanked versions if possible', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); - this.db.version.create({ crate, num: '1.1.0' }); - this.db.version.create({ crate, num: '1.1.1' }); - this.db.version.create({ crate, num: '1.2.0', yanked: true }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); + await this.db.version.create({ crate, num: '1.1.0' }); + await this.db.version.create({ crate, num: '1.1.1' }); + await this.db.version.create({ crate, num: '1.2.0', yanked: true }); await visit('/crates/foo/range/^1.0.0'); assert.strictEqual(currentURL(), `/crates/foo/1.1.1`); @@ -67,11 +67,11 @@ module('Route | crate.range', function (hooks) { }); test('falls back to yanked version if necessary', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0', yanked: true }); - this.db.version.create({ crate, num: '1.1.0', yanked: true }); - this.db.version.create({ crate, num: '1.1.1', yanked: true }); - this.db.version.create({ crate, num: '2.0.0' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0', yanked: true }); + await this.db.version.create({ crate, num: '1.1.0', yanked: true }); + await this.db.version.create({ crate, num: '1.1.1', yanked: true }); + await this.db.version.create({ crate, num: '2.0.0' }); await visit('/crates/foo/range/^1.0.0'); assert.strictEqual(currentURL(), `/crates/foo/1.1.1`); @@ -102,11 +102,11 @@ module('Route | crate.range', function (hooks) { }); test('shows an error page if no match found', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); - this.db.version.create({ crate, num: '1.1.0' }); - this.db.version.create({ crate, num: '1.1.1' }); - this.db.version.create({ crate, num: '2.0.0' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); + await this.db.version.create({ crate, num: '1.1.0' }); + await this.db.version.create({ crate, num: '1.1.1' }); + await this.db.version.create({ crate, num: '2.0.0' }); await visit('/crates/foo/range/^3'); assert.strictEqual(currentURL(), '/crates/foo/range/%5E3'); @@ -117,8 +117,8 @@ module('Route | crate.range', function (hooks) { }); test('shows an error page if versions fail to load', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '3.2.1' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '3.2.1' }); let error = HttpResponse.json({}, { status: 500 }); this.worker.use(http.get('/api/v1/crates/:crate_name/versions', () => error)); diff --git a/tests/routes/crate/settings-test.js b/tests/routes/crate/settings-test.js index 1f50dd70ea8..624e8afa4c7 100644 --- a/tests/routes/crate/settings-test.js +++ b/tests/routes/crate/settings-test.js @@ -13,19 +13,19 @@ import { visit } from '../../helpers/visit-ignoring-abort'; module('Route | crate.settings', hooks => { setupApplicationTest(hooks); - function prepare(context) { - const user = context.db.user.create(); + async function prepare(context) { + const user = await context.db.user.create(); - const crate = context.db.crate.create({ name: 'foo' }); - context.db.version.create({ crate }); - context.db.crateOwnership.create({ crate, user }); + const crate = await context.db.crate.create({ name: 'foo' }); + await context.db.version.create({ crate }); + await context.db.crateOwnership.create({ crate, user }); return { crate, user }; } test('unauthenticated', async function (assert) { - const crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate }); + const crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate }); await visit('/crates/foo/settings'); assert.strictEqual(currentURL(), '/crates/foo/settings'); @@ -34,10 +34,10 @@ module('Route | crate.settings', hooks => { }); test('not an owner', async function (assert) { - const { crate } = prepare(this); + const { crate } = await prepare(this); - const otherUser = this.db.user.create(); - this.authenticateAs(otherUser); + const otherUser = await this.db.user.create(); + await this.authenticateAs(otherUser); await visit(`/crates/${crate.name}/settings`); assert.strictEqual(currentURL(), `/crates/${crate.name}/settings`); @@ -46,8 +46,8 @@ module('Route | crate.settings', hooks => { }); test('happy path', async function (assert) { - const { crate, user } = prepare(this); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.authenticateAs(user); await visit(`/crates/${crate.name}/settings`); assert.strictEqual(currentURL(), `/crates/${crate.name}/settings`); @@ -66,11 +66,11 @@ module('Route | crate.settings', hooks => { module('Trusted Publishing', function () { test('mixed GitHub and GitLab configs', async function (assert) { - const { crate, user } = prepare(this); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.authenticateAs(user); // Create GitHub configs - this.db.trustpubGithubConfig.create({ + await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -78,7 +78,7 @@ module('Route | crate.settings', hooks => { }); // Create GitLab configs - this.db.trustpubGitlabConfig.create({ + await this.db.trustpubGitlabConfig.create({ crate, namespace: 'johndoe', namespace_id: '1234', @@ -114,18 +114,18 @@ module('Route | crate.settings', hooks => { module('GitHub', function () { test('happy path', async function (assert) { - const { crate, user } = prepare(this); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.authenticateAs(user); // Create two GitHub configs for the crate - this.db.trustpubGithubConfig.create({ + await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', workflow_filename: 'ci.yml', }); - this.db.trustpubGithubConfig.create({ + await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'johndoe', repository_name: 'crates.io', @@ -161,11 +161,11 @@ module('Route | crate.settings', hooks => { }); test('deletion failure', async function (assert) { - let { crate, user } = prepare(this); - this.authenticateAs(user); + let { crate, user } = await prepare(this); + await this.authenticateAs(user); // Create a GitHub config for the crate - let config = this.db.trustpubGithubConfig.create({ + let config = await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -194,18 +194,18 @@ module('Route | crate.settings', hooks => { module('GitLab', function () { test('happy path', async function (assert) { - const { crate, user } = prepare(this); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.authenticateAs(user); // Create two GitLab configs for the crate - this.db.trustpubGitlabConfig.create({ + await this.db.trustpubGitlabConfig.create({ crate, namespace: 'rust-lang', project: 'crates.io', workflow_filepath: '.gitlab-ci.yml', }); - this.db.trustpubGitlabConfig.create({ + await this.db.trustpubGitlabConfig.create({ crate, namespace: 'johndoe', namespace_id: '1234', @@ -244,11 +244,11 @@ module('Route | crate.settings', hooks => { }); test('deletion failure', async function (assert) { - let { crate, user } = prepare(this); - this.authenticateAs(user); + let { crate, user } = await prepare(this); + await this.authenticateAs(user); // Create a GitLab config for the crate - let config = this.db.trustpubGitlabConfig.create({ + let config = await this.db.trustpubGitlabConfig.create({ crate, namespace: 'rust-lang', namespace_id: '1234', @@ -279,8 +279,8 @@ module('Route | crate.settings', hooks => { module('trustpub_only warning banner', function () { test('hidden when flag is false', async function (assert) { - const { crate, user } = prepare(this); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.authenticateAs(user); await visit(`/crates/${crate.name}/settings`); @@ -288,11 +288,15 @@ module('Route | crate.settings', hooks => { }); test('hidden when flag is true and configs exist', async function (assert) { - const { crate, user } = prepare(this); - this.db.crate.update({ where: { id: { equals: crate.id } }, data: { trustpubOnly: true } }); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.trustpubOnly = true; + }, + }); + await this.authenticateAs(user); - this.db.trustpubGithubConfig.create({ + await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -305,9 +309,13 @@ module('Route | crate.settings', hooks => { }); test('shown when flag is true but no configs exist', async function (assert) { - const { crate, user } = prepare(this); - this.db.crate.update({ where: { id: { equals: crate.id } }, data: { trustpubOnly: true } }); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.trustpubOnly = true; + }, + }); + await this.authenticateAs(user); await visit(`/crates/${crate.name}/settings`); @@ -320,9 +328,13 @@ module('Route | crate.settings', hooks => { }); test('disappears when checkbox is unchecked', async function (assert) { - const { crate, user } = prepare(this); - this.db.crate.update({ where: { id: { equals: crate.id } }, data: { trustpubOnly: true } }); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.trustpubOnly = true; + }, + }); + await this.authenticateAs(user); await visit(`/crates/${crate.name}/settings`); @@ -334,11 +346,15 @@ module('Route | crate.settings', hooks => { }); test('appears when checkbox is checked with no configs', async function (assert) { - const { crate, user } = prepare(this); - this.db.crate.update({ where: { id: { equals: crate.id } }, data: { trustpubOnly: true } }); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.trustpubOnly = true; + }, + }); + await this.authenticateAs(user); - this.db.trustpubGithubConfig.create({ + await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -359,8 +375,8 @@ module('Route | crate.settings', hooks => { module('trustpub_only checkbox', function () { test('hidden when no configs and flag is false', async function (assert) { - const { crate, user } = prepare(this); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.authenticateAs(user); await visit(`/crates/${crate.name}/settings`); @@ -368,10 +384,10 @@ module('Route | crate.settings', hooks => { }); test('visible when GitHub configs exist', async function (assert) { - const { crate, user } = prepare(this); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.authenticateAs(user); - this.db.trustpubGithubConfig.create({ + await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -385,10 +401,10 @@ module('Route | crate.settings', hooks => { }); test('visible when GitLab configs exist', async function (assert) { - const { crate, user } = prepare(this); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.authenticateAs(user); - this.db.trustpubGitlabConfig.create({ + await this.db.trustpubGitlabConfig.create({ crate, namespace: 'rust-lang', project: 'crates.io', @@ -402,9 +418,13 @@ module('Route | crate.settings', hooks => { }); test('visible when flag is true but no configs', async function (assert) { - const { crate, user } = prepare(this); - this.db.crate.update({ where: { id: { equals: crate.id } }, data: { trustpubOnly: true } }); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.trustpubOnly = true; + }, + }); + await this.authenticateAs(user); await visit(`/crates/${crate.name}/settings`); @@ -413,9 +433,13 @@ module('Route | crate.settings', hooks => { }); test('stays visible after disabling when no configs exist', async function (assert) { - const { crate, user } = prepare(this); - this.db.crate.update({ where: { id: { equals: crate.id } }, data: { trustpubOnly: true } }); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.trustpubOnly = true; + }, + }); + await this.authenticateAs(user); await visit(`/crates/${crate.name}/settings`); @@ -436,10 +460,10 @@ module('Route | crate.settings', hooks => { }); test('enabling trustpub_only', async function (assert) { - const { crate, user } = prepare(this); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.authenticateAs(user); - this.db.trustpubGithubConfig.create({ + await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -449,20 +473,24 @@ module('Route | crate.settings', hooks => { await visit(`/crates/${crate.name}/settings`); assert.dom('[data-test-trustpub-only-checkbox] [data-test-checkbox]').isNotChecked(); - assert.false(this.db.crate.findFirst({ where: { name: { equals: crate.name } } }).trustpubOnly); + assert.false(this.db.crate.findFirst(q => q.where({ name: crate.name })).trustpubOnly); await click('[data-test-trustpub-only-checkbox] [data-test-checkbox]'); assert.dom('[data-test-trustpub-only-checkbox] [data-test-checkbox]').isChecked(); - assert.true(this.db.crate.findFirst({ where: { name: { equals: crate.name } } }).trustpubOnly); + assert.true(this.db.crate.findFirst(q => q.where({ name: crate.name })).trustpubOnly); }); test('disabling trustpub_only', async function (assert) { - const { crate, user } = prepare(this); - this.db.crate.update({ where: { id: { equals: crate.id } }, data: { trustpubOnly: true } }); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.trustpubOnly = true; + }, + }); + await this.authenticateAs(user); - this.db.trustpubGithubConfig.create({ + await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -472,19 +500,19 @@ module('Route | crate.settings', hooks => { await visit(`/crates/${crate.name}/settings`); assert.dom('[data-test-trustpub-only-checkbox] [data-test-checkbox]').isChecked(); - assert.true(this.db.crate.findFirst({ where: { name: { equals: crate.name } } }).trustpubOnly); + assert.true(this.db.crate.findFirst(q => q.where({ name: crate.name })).trustpubOnly); await click('[data-test-trustpub-only-checkbox] [data-test-checkbox]'); assert.dom('[data-test-trustpub-only-checkbox] [data-test-checkbox]').isNotChecked(); - assert.false(this.db.crate.findFirst({ where: { name: { equals: crate.name } } }).trustpubOnly); + assert.false(this.db.crate.findFirst(q => q.where({ name: crate.name })).trustpubOnly); }); test('loading and error state', async function (assert) { - const { crate, user } = prepare(this); - this.authenticateAs(user); + const { crate, user } = await prepare(this); + await this.authenticateAs(user); - this.db.trustpubGithubConfig.create({ + await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', diff --git a/tests/routes/crate/settings/new-trusted-publisher-test.js b/tests/routes/crate/settings/new-trusted-publisher-test.js index f562c23bff6..ddf64f8b690 100644 --- a/tests/routes/crate/settings/new-trusted-publisher-test.js +++ b/tests/routes/crate/settings/new-trusted-publisher-test.js @@ -13,22 +13,22 @@ import { visit } from '../../../helpers/visit-ignoring-abort'; module('Route | crate.settings.new-trusted-publisher', hooks => { setupApplicationTest(hooks); - function prepare(context) { - let user = context.db.user.create(); + async function prepare(context) { + let user = await context.db.user.create(); - let crate = context.db.crate.create({ name: 'foo' }); - context.db.version.create({ crate }); - context.db.crateOwnership.create({ crate, user }); + let crate = await context.db.crate.create({ name: 'foo' }); + await context.db.version.create({ crate }); + await context.db.crateOwnership.create({ crate, user }); - context.authenticateAs(user); + await context.authenticateAs(user); return { crate, user }; } test('unauthenticated', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); - this.db.mswSession.deleteMany({}); + this.db.mswSession.deleteMany(null); await visit(`/crates/${crate.name}/settings/new-trusted-publisher`); assert.strictEqual(currentURL(), `/crates/${crate.name}/settings/new-trusted-publisher`); @@ -37,9 +37,9 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { }); test('not an owner', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); - this.db.crateOwnership.deleteMany({}); + this.db.crateOwnership.deleteMany(null); await visit(`/crates/${crate.name}/settings/new-trusted-publisher`); assert.strictEqual(currentURL(), `/crates/${crate.name}/settings/new-trusted-publisher`); @@ -48,7 +48,7 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { }); test('cancel button', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); await visit(`/crates/${crate.name}/settings/new-trusted-publisher`); assert.strictEqual(currentURL(), `/crates/${crate.name}/settings/new-trusted-publisher`); @@ -143,10 +143,11 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { for (let { name, url, publisher, owner, repo } of testCases) { test(name, async function (assert) { - let { crate } = prepare(this); - this.db.crate.update({ - where: { id: { equals: crate.id } }, - data: { repository: url }, + let { crate } = await prepare(this); + await this.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.repository = url; + }, }); await visit(`/crates/${crate.name}/settings/new-trusted-publisher`); @@ -160,9 +161,9 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { module('GitHub', function () { test('happy path', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); - this.db.trustpubGithubConfig.create({ + await this.db.trustpubGithubConfig.create({ crate, repository_owner: 'johndoe', repository_name: 'crates.io', @@ -197,14 +198,14 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { assert.strictEqual(currentURL(), `/crates/${crate.name}/settings`); // Check that the config was created - let config = this.db.trustpubGithubConfig.findFirst({ - where: { - repository_owner: { equals: 'rust-lang' }, - repository_name: { equals: 'crates.io' }, - workflow_filename: { equals: 'ci.yml' }, - environment: { equals: 'release' }, - }, - }); + let config = this.db.trustpubGithubConfig.findFirst(q => + q.where({ + repository_owner: 'rust-lang', + repository_name: 'crates.io', + workflow_filename: 'ci.yml', + environment: 'release', + }), + ); assert.ok(config, 'Config was created'); // Check that the success notification is displayed @@ -219,7 +220,7 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { }); test('validation errors', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); await visit(`/crates/${crate.name}/settings/new-trusted-publisher`); assert.strictEqual(currentURL(), `/crates/${crate.name}/settings/new-trusted-publisher`); @@ -245,7 +246,7 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { }); test('loading and error state', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); // Mock the server to return an error let deferred = defer(); @@ -292,7 +293,7 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { module('workflow verification', function () { test('success case (200 OK)', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); await visit(`/crates/${crate.name}/settings/new-trusted-publisher`); assert.strictEqual(currentURL(), `/crates/${crate.name}/settings/new-trusted-publisher`); @@ -319,7 +320,7 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { }); test('not found case (404)', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); await visit(`/crates/${crate.name}/settings/new-trusted-publisher`); assert.strictEqual(currentURL(), `/crates/${crate.name}/settings/new-trusted-publisher`); @@ -346,7 +347,7 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { }); test('server error (5xx)', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); await visit(`/crates/${crate.name}/settings/new-trusted-publisher`); assert.strictEqual(currentURL(), `/crates/${crate.name}/settings/new-trusted-publisher`); @@ -372,9 +373,9 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { module('GitLab', function () { test('happy path', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); - this.db.trustpubGitlabConfig.create({ + await this.db.trustpubGitlabConfig.create({ crate, namespace: 'johndoe', project: 'crates.io', @@ -415,14 +416,14 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { assert.strictEqual(currentURL(), `/crates/${crate.name}/settings`); // Check that the config was created - let config = this.db.trustpubGitlabConfig.findFirst({ - where: { - namespace: { equals: 'rust-lang' }, - project: { equals: 'crates.io' }, - workflow_filepath: { equals: '.gitlab-ci.yml' }, - environment: { equals: 'production' }, - }, - }); + let config = this.db.trustpubGitlabConfig.findFirst(q => + q.where({ + namespace: 'rust-lang', + project: 'crates.io', + workflow_filepath: '.gitlab-ci.yml', + environment: 'production', + }), + ); assert.ok(config, 'Config was created'); // Check that the success notification is displayed @@ -437,7 +438,7 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { }); test('validation errors', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); await visit(`/crates/${crate.name}/settings/new-trusted-publisher`); assert.strictEqual(currentURL(), `/crates/${crate.name}/settings/new-trusted-publisher`); @@ -466,7 +467,7 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { }); test('loading and error state', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); // Mock the server to return an error let deferred = defer(); @@ -516,7 +517,7 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { module('workflow verification', function () { test('success case (200 OK)', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); await visit(`/crates/${crate.name}/settings/new-trusted-publisher`); assert.strictEqual(currentURL(), `/crates/${crate.name}/settings/new-trusted-publisher`); @@ -545,7 +546,7 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { }); test('not found case (404)', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); await visit(`/crates/${crate.name}/settings/new-trusted-publisher`); assert.strictEqual(currentURL(), `/crates/${crate.name}/settings/new-trusted-publisher`); @@ -574,7 +575,7 @@ module('Route | crate.settings.new-trusted-publisher', hooks => { }); test('server error (5xx)', async function (assert) { - let { crate } = prepare(this); + let { crate } = await prepare(this); await visit(`/crates/${crate.name}/settings/new-trusted-publisher`); assert.strictEqual(currentURL(), `/crates/${crate.name}/settings/new-trusted-publisher`); diff --git a/tests/routes/crate/version/crate-links-test.js b/tests/routes/crate/version/crate-links-test.js index 326039f8579..e6866d7661d 100644 --- a/tests/routes/crate/version/crate-links-test.js +++ b/tests/routes/crate/version/crate-links-test.js @@ -7,13 +7,13 @@ module('Route | crate.version | crate links', function (hooks) { setupApplicationTest(hooks); test('shows all external crate links', async function (assert) { - let crate = this.db.crate.create({ + let crate = await this.db.crate.create({ name: 'foo', homepage: 'https://crates.io/', documentation: 'https://doc.rust-lang.org/cargo/getting-started/', repository: 'https://github.com/rust-lang/crates.io.git', }); - this.db.version.create({ crate, num: '1.0.0' }); + await this.db.version.create({ crate, num: '1.0.0' }); await visit('/crates/foo'); @@ -31,8 +31,8 @@ module('Route | crate.version | crate links', function (hooks) { }); test('shows no external crate links if none are set', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); await visit('/crates/foo'); @@ -42,12 +42,12 @@ module('Route | crate.version | crate links', function (hooks) { }); test('hide the homepage link if it is the same as the repository', async function (assert) { - let crate = this.db.crate.create({ + let crate = await this.db.crate.create({ name: 'foo', homepage: 'https://github.com/rust-lang/crates.io', repository: 'https://github.com/rust-lang/crates.io', }); - this.db.version.create({ crate, num: '1.0.0' }); + await this.db.version.create({ crate, num: '1.0.0' }); await visit('/crates/foo'); @@ -61,12 +61,12 @@ module('Route | crate.version | crate links', function (hooks) { }); test('hide the homepage link if it is the same as the repository plus `.git`', async function (assert) { - let crate = this.db.crate.create({ + let crate = await this.db.crate.create({ name: 'foo', homepage: 'https://github.com/rust-lang/crates.io/', repository: 'https://github.com/rust-lang/crates.io.git', }); - this.db.version.create({ crate, num: '1.0.0' }); + await this.db.version.create({ crate, num: '1.0.0' }); await visit('/crates/foo'); diff --git a/tests/routes/crate/version/docs-link-test.js b/tests/routes/crate/version/docs-link-test.js index 20414341884..cdcdb9a3537 100644 --- a/tests/routes/crate/version/docs-link-test.js +++ b/tests/routes/crate/version/docs-link-test.js @@ -9,16 +9,16 @@ module('Route | crate.version | docs link', function (hooks) { setupApplicationTest(hooks); test('shows regular documentation link', async function (assert) { - let crate = this.db.crate.create({ name: 'foo', documentation: 'https://foo.io/docs' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'foo', documentation: 'https://foo.io/docs' }); + await this.db.version.create({ crate, num: '1.0.0' }); await visit('/crates/foo'); assert.dom('[data-test-docs-link] a').hasAttribute('href', 'https://foo.io/docs'); }); test('show no docs link if `documentation` is unspecified and there are no related docs.rs builds', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); let error = HttpResponse.text('not found', { status: 404 }); this.worker.use(http.get('https://docs.rs/crate/:crate/:version/status.json', () => error)); @@ -28,8 +28,8 @@ module('Route | crate.version | docs link', function (hooks) { }); test('show docs link if `documentation` is unspecified and there are related docs.rs builds', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); let response = HttpResponse.json({ doc_status: true, version: '1.0.0' }); this.worker.use(http.get('https://docs.rs/crate/:crate/:version/status.json', () => response)); @@ -39,8 +39,8 @@ module('Route | crate.version | docs link', function (hooks) { }); test('show original docs link if `documentation` points to docs.rs and there are no related docs.rs builds', async function (assert) { - let crate = this.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); + await this.db.version.create({ crate, num: '1.0.0' }); let error = HttpResponse.text('not found', { status: 404 }); this.worker.use(http.get('https://docs.rs/crate/:crate/:version/status.json', () => error)); @@ -50,8 +50,8 @@ module('Route | crate.version | docs link', function (hooks) { }); test('show updated docs link if `documentation` points to docs.rs and there are related docs.rs builds', async function (assert) { - let crate = this.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); + await this.db.version.create({ crate, num: '1.0.0' }); let response = HttpResponse.json({ doc_status: true, version: '1.0.0' }); this.worker.use(http.get('https://docs.rs/crate/:crate/:version/status.json', () => response)); @@ -61,8 +61,8 @@ module('Route | crate.version | docs link', function (hooks) { }); test('ajax errors are ignored', async function (assert) { - let crate = this.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); - this.db.version.create({ crate, num: '1.0.0' }); + let crate = await this.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); + await this.db.version.create({ crate, num: '1.0.0' }); let error = HttpResponse.text('error', { status: 500 }); this.worker.use(http.get('https://docs.rs/crate/:crate/:version/status.json', () => error)); @@ -72,8 +72,8 @@ module('Route | crate.version | docs link', function (hooks) { }); test('empty docs.rs responses are ignored', async function (assert) { - let crate = this.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); - this.db.version.create({ crate, num: '0.6.2' }); + let crate = await this.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); + await this.db.version.create({ crate, num: '0.6.2' }); let response = HttpResponse.json({}); this.worker.use(http.get('https://docs.rs/crate/:crate/:version/status.json', () => response)); diff --git a/tests/routes/crate/version/model-test.js b/tests/routes/crate/version/model-test.js index a46c8451b2e..78c4bded2d8 100644 --- a/tests/routes/crate/version/model-test.js +++ b/tests/routes/crate/version/model-test.js @@ -10,10 +10,10 @@ module('Route | crate.version | model() hook', function (hooks) { module('with explicit version number in the URL', function () { test('shows yanked versions', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); - this.db.version.create({ crate, num: '1.2.3', yanked: true }); - this.db.version.create({ crate, num: '2.0.0-beta.1' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); + await this.db.version.create({ crate, num: '1.2.3', yanked: true }); + await this.db.version.create({ crate, num: '2.0.0-beta.1' }); await visit('/crates/foo/1.2.3'); assert.strictEqual(currentURL(), `/crates/foo/1.2.3`); @@ -26,10 +26,10 @@ module('Route | crate.version | model() hook', function (hooks) { }); test('shows error page for unknown versions', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); - this.db.version.create({ crate, num: '1.2.3', yanked: true }); - this.db.version.create({ crate, num: '2.0.0-beta.1' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); + await this.db.version.create({ crate, num: '1.2.3', yanked: true }); + await this.db.version.create({ crate, num: '2.0.0-beta.1' }); await visit('/crates/foo/2.0.0'); assert.strictEqual(currentURL(), `/crates/foo/2.0.0`); @@ -42,11 +42,11 @@ module('Route | crate.version | model() hook', function (hooks) { module('without version number in the URL', function () { test('defaults to the highest stable version', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); - this.db.version.create({ crate, num: '1.2.3', yanked: true }); - this.db.version.create({ crate, num: '2.0.0-beta.1' }); - this.db.version.create({ crate, num: '2.0.0' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); + await this.db.version.create({ crate, num: '1.2.3', yanked: true }); + await this.db.version.create({ crate, num: '2.0.0-beta.1' }); + await this.db.version.create({ crate, num: '2.0.0' }); await visit('/crates/foo'); assert.strictEqual(currentURL(), `/crates/foo`); @@ -59,10 +59,10 @@ module('Route | crate.version | model() hook', function (hooks) { }); test('defaults to the highest stable version, even if there are higher prereleases', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0' }); - this.db.version.create({ crate, num: '1.2.3', yanked: true }); - this.db.version.create({ crate, num: '2.0.0-beta.1' }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0' }); + await this.db.version.create({ crate, num: '1.2.3', yanked: true }); + await this.db.version.create({ crate, num: '2.0.0-beta.1' }); await visit('/crates/foo'); assert.strictEqual(currentURL(), `/crates/foo`); @@ -75,12 +75,12 @@ module('Route | crate.version | model() hook', function (hooks) { }); test('defaults to the highest not-yanked version', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0', yanked: true }); - this.db.version.create({ crate, num: '1.2.3', yanked: true }); - this.db.version.create({ crate, num: '2.0.0-beta.1' }); - this.db.version.create({ crate, num: '2.0.0-beta.2' }); - this.db.version.create({ crate, num: '2.0.0', yanked: true }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0', yanked: true }); + await this.db.version.create({ crate, num: '1.2.3', yanked: true }); + await this.db.version.create({ crate, num: '2.0.0-beta.1' }); + await this.db.version.create({ crate, num: '2.0.0-beta.2' }); + await this.db.version.create({ crate, num: '2.0.0', yanked: true }); await visit('/crates/foo'); assert.strictEqual(currentURL(), `/crates/foo`); @@ -93,10 +93,10 @@ module('Route | crate.version | model() hook', function (hooks) { }); test('if there are only yanked versions, it defaults to the latest version', async function (assert) { - let crate = this.db.crate.create({ name: 'foo' }); - this.db.version.create({ crate, num: '1.0.0', yanked: true }); - this.db.version.create({ crate, num: '1.2.3', yanked: true }); - this.db.version.create({ crate, num: '2.0.0-beta.1', yanked: true }); + let crate = await this.db.crate.create({ name: 'foo' }); + await this.db.version.create({ crate, num: '1.0.0', yanked: true }); + await this.db.version.create({ crate, num: '1.2.3', yanked: true }); + await this.db.version.create({ crate, num: '2.0.0-beta.1', yanked: true }); await visit('/crates/foo'); assert.strictEqual(currentURL(), `/crates/foo`); diff --git a/tests/routes/me/crates-test.js b/tests/routes/me/crates-test.js index f3fa0dbceb2..a4306d86276 100644 --- a/tests/routes/me/crates-test.js +++ b/tests/routes/me/crates-test.js @@ -9,8 +9,8 @@ module('Route | me/crates', function (hooks) { setupApplicationTest(hooks); test('redirects to user profile page', async function (assert) { - let user = this.db.user.create({ login: 'johnnydee' }); - this.authenticateAs(user); + let user = await this.db.user.create({ login: 'johnnydee' }); + await this.authenticateAs(user); await visit('/me/crates?page=2&sort=downloads'); assert.strictEqual(currentURL(), '/users/johnnydee?page=2&sort=downloads'); diff --git a/tests/routes/settings/tokens/index-test.js b/tests/routes/settings/tokens/index-test.js index 0e17c79da6e..447244b4481 100644 --- a/tests/routes/settings/tokens/index-test.js +++ b/tests/routes/settings/tokens/index-test.js @@ -8,23 +8,23 @@ import { visit } from '../../../helpers/visit-ignoring-abort'; module('/settings/tokens', function (hooks) { setupApplicationTest(hooks); - function prepare(context) { - let user = context.db.user.create({ + async function prepare(context) { + let user = await context.db.user.create({ login: 'johnnydee', name: 'John Doe', email: 'john@doe.com', avatar: 'https://avatars2.githubusercontent.com/u/1234567?v=4', }); - context.authenticateAs(user); + await context.authenticateAs(user); return { user }; } test('reloads all tokens from the server', async function (assert) { - let { user } = prepare(this); + let { user } = await prepare(this); - this.db.apiToken.create({ user, name: 'token-1' }); + await this.db.apiToken.create({ user, name: 'token-1' }); await visit('/settings/tokens/new'); assert.strictEqual(currentURL(), '/settings/tokens/new'); @@ -43,9 +43,9 @@ module('/settings/tokens', function (hooks) { }); test('scope formatting', async function (assert) { - let { user } = prepare(this); + let { user } = await prepare(this); - this.db.apiToken.create({ + await this.db.apiToken.create({ user, endpointScopes: ['publish-new', 'publish-update', 'yank'], crateScopes: ['serde', 'serde-*', 'serde_*'], diff --git a/tests/routes/settings/tokens/new-test.js b/tests/routes/settings/tokens/new-test.js index ec3eedbebd8..978679afbe9 100644 --- a/tests/routes/settings/tokens/new-test.js +++ b/tests/routes/settings/tokens/new-test.js @@ -12,21 +12,21 @@ import { visit } from '../../../helpers/visit-ignoring-abort'; module('/settings/tokens/new', function (hooks) { setupApplicationTest(hooks); - function prepare(context) { - let user = context.db.user.create({ + async function prepare(context) { + let user = await context.db.user.create({ login: 'johnnydee', name: 'John Doe', email: 'john@doe.com', avatar: 'https://avatars2.githubusercontent.com/u/1234567?v=4', }); - context.authenticateAs(user); + await context.authenticateAs(user); return { user }; } test('can navigate to the route', async function (assert) { - prepare(this); + await prepare(this); await visit('/'); assert.strictEqual(currentURL(), '/'); @@ -50,7 +50,7 @@ module('/settings/tokens/new', function (hooks) { }); test('happy path', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens/new'); assert.strictEqual(currentURL(), '/settings/tokens/new'); @@ -60,7 +60,7 @@ module('/settings/tokens/new', function (hooks) { await click('[data-test-scope="publish-update"]'); await click('[data-test-generate]'); - let token = this.db.apiToken.findFirst({ where: { name: { equals: 'token-name' } } }); + let token = this.db.apiToken.findFirst(q => q.where({ name: 'token-name' })); assert.ok(Boolean(token), 'API token has been created in the backend database'); assert.strictEqual(token.name, 'token-name'); assert.strictEqual(token.expiredAt, null); @@ -76,7 +76,7 @@ module('/settings/tokens/new', function (hooks) { }); test('crate scopes', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens/new'); assert.strictEqual(currentURL(), '/settings/tokens/new'); @@ -133,7 +133,7 @@ module('/settings/tokens/new', function (hooks) { await click('[data-test-generate]'); - let token = this.db.apiToken.findFirst({ where: { name: { equals: 'token-name' } } }); + let token = this.db.apiToken.findFirst(q => q.where({ name: 'token-name' })); assert.ok(Boolean(token), 'API token has been created in the backend database'); assert.strictEqual(token.name, 'token-name'); assert.deepEqual(token.crateScopes, ['serde-*', 'serde']); @@ -148,7 +148,7 @@ module('/settings/tokens/new', function (hooks) { }); test('token expiry', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens/new'); assert.strictEqual(currentURL(), '/settings/tokens/new'); @@ -173,7 +173,7 @@ module('/settings/tokens/new', function (hooks) { await click('[data-test-scope="publish-update"]'); await click('[data-test-generate]'); - let token = this.db.apiToken.findFirst({ where: { name: { equals: 'token-name' } } }); + let token = this.db.apiToken.findFirst(q => q.where({ name: 'token-name' })); assert.ok(Boolean(token), 'API token has been created in the backend database'); assert.strictEqual(token.name, 'token-name'); assert.strictEqual(token.expiredAt.slice(0, 10), '2017-12-20'); @@ -189,7 +189,7 @@ module('/settings/tokens/new', function (hooks) { }); test('token expiry with custom date', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens/new'); assert.strictEqual(currentURL(), '/settings/tokens/new'); @@ -209,7 +209,7 @@ module('/settings/tokens/new', function (hooks) { await click('[data-test-generate]'); - let token = this.db.apiToken.findFirst({ where: { name: { equals: 'token-name' } } }); + let token = this.db.apiToken.findFirst(q => q.where({ name: 'token-name' })); assert.ok(Boolean(token), 'API token has been created in the backend database'); assert.strictEqual(token.name, 'token-name'); assert.strictEqual(token.expiredAt.slice(0, 10), '2024-05-04'); @@ -225,7 +225,7 @@ module('/settings/tokens/new', function (hooks) { }); test('loading and error state', async function (assert) { - prepare(this); + await prepare(this); let deferred = defer(); this.worker.use(http.put('/api/v1/me/tokens', () => deferred.promise)); @@ -250,7 +250,7 @@ module('/settings/tokens/new', function (hooks) { }); test('cancel button navigates back to the token list', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens/new'); assert.strictEqual(currentURL(), '/settings/tokens/new'); @@ -260,7 +260,7 @@ module('/settings/tokens/new', function (hooks) { }); test('empty name shows an error', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens/new'); assert.strictEqual(currentURL(), '/settings/tokens/new'); @@ -274,7 +274,7 @@ module('/settings/tokens/new', function (hooks) { }); test('no scopes selected shows an error', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens/new'); assert.strictEqual(currentURL(), '/settings/tokens/new'); @@ -287,9 +287,9 @@ module('/settings/tokens/new', function (hooks) { }); test('prefill with the exist token', async function (assert) { - let { user } = prepare(this); + let { user } = await prepare(this); - let token = this.db.apiToken.create({ + let token = await this.db.apiToken.create({ user, name: 'foo', createdAt: '2017-08-01T12:34:56', @@ -310,7 +310,7 @@ module('/settings/tokens/new', function (hooks) { await click('[data-test-generate]'); assert.strictEqual(currentURL(), '/settings/tokens'); - let tokens = this.db.apiToken.findMany({ where: { name: { equals: 'foo' } } }); + let tokens = this.db.apiToken.findMany(q => q.where({ name: 'foo' })); assert.strictEqual(tokens.length, 2, 'New API token has been created in the backend database'); // It should reset the token ID query parameter. @@ -319,9 +319,9 @@ module('/settings/tokens/new', function (hooks) { }); test('prefilled: crate scoped can be added', async function (assert) { - let { user } = prepare(this); + let { user } = await prepare(this); - let token = this.db.apiToken.create({ + let token = await this.db.apiToken.create({ user, name: 'serde', crateScopes: ['serde', 'serde-*'], @@ -340,7 +340,7 @@ module('/settings/tokens/new', function (hooks) { }); test('token not found', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens/new?from=1'); assert.strictEqual(currentURL(), '/settings/tokens/new?from=1'); @@ -348,7 +348,7 @@ module('/settings/tokens/new', function (hooks) { }); test('trusted-publishing scope', async function (assert) { - prepare(this); + await prepare(this); await visit('/settings/tokens/new'); assert.strictEqual(currentURL(), '/settings/tokens/new'); @@ -358,7 +358,7 @@ module('/settings/tokens/new', function (hooks) { await click('[data-test-scope="trusted-publishing"]'); await click('[data-test-generate]'); - let token = this.db.apiToken.findFirst({ where: { name: { equals: 'trusted-publishing-token' } } }); + let token = this.db.apiToken.findFirst(q => q.where({ name: 'trusted-publishing-token' })); assert.ok(Boolean(token), 'API token has been created in the backend database'); assert.strictEqual(token.name, 'trusted-publishing-token'); assert.strictEqual(token.expiredAt, null); From c05f2aadda7acbc16c007e72a0a375b73d46c057 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 26 Nov 2025 17:21:17 +0100 Subject: [PATCH 6/6] msw: Migrate Playwright test suite to new `@msw/data` API --- e2e/acceptance/api-token.spec.ts | 14 +-- e2e/acceptance/categories.spec.ts | 22 ++-- e2e/acceptance/crate-deletion.spec.ts | 12 +-- e2e/acceptance/crate-dependencies.spec.ts | 30 +++--- e2e/acceptance/crate-following.spec.ts | 6 +- e2e/acceptance/crate-navtabs.spec.ts | 4 +- e2e/acceptance/crate.spec.ts | 74 ++++++------- e2e/acceptance/crates.spec.ts | 20 ++-- e2e/acceptance/dashboard.spec.ts | 46 ++++---- e2e/acceptance/email-change.spec.ts | 20 ++-- e2e/acceptance/email-confirmation.spec.ts | 8 +- e2e/acceptance/front-page.spec.ts | 2 +- e2e/acceptance/invites.spec.ts | 92 ++++++---------- e2e/acceptance/keyword.spec.ts | 2 +- e2e/acceptance/login.spec.ts | 6 +- e2e/acceptance/logout.spec.ts | 2 +- e2e/acceptance/publish-notifications.spec.ts | 10 +- e2e/acceptance/readme-rendering.spec.ts | 12 +-- e2e/acceptance/rebuild-docs.spec.ts | 32 +++--- e2e/acceptance/reverse-dependencies.spec.ts | 30 +++--- e2e/acceptance/search.spec.ts | 20 ++-- e2e/acceptance/settings/add-owner.spec.ts | 26 ++--- e2e/acceptance/settings/remove-owner.spec.ts | 20 ++-- e2e/acceptance/settings/settings.spec.ts | 20 ++-- e2e/acceptance/sudo.spec.ts | 10 +- e2e/acceptance/support.spec.ts | 4 +- e2e/acceptance/team-page.spec.ts | 2 +- e2e/acceptance/token-invites.spec.ts | 10 +- e2e/acceptance/user-page.spec.ts | 2 +- e2e/acceptance/versions.spec.ts | 24 ++--- e2e/bugs/11772.spec.ts | 12 +-- e2e/bugs/4506.spec.ts | 10 +- e2e/helper.ts | 4 +- e2e/routes/category.spec.ts | 2 +- e2e/routes/crate/delete.spec.ts | 26 ++--- e2e/routes/crate/range.spec.ts | 64 +++++------ e2e/routes/crate/settings.spec.ts | 102 +++++++++++------- .../settings/new-trusted-publisher.spec.ts | 57 +++++----- e2e/routes/crate/version/crate-links.spec.ts | 16 +-- e2e/routes/crate/version/docs-link.spec.ts | 28 ++--- e2e/routes/crate/version/model.spec.ts | 54 +++++----- e2e/routes/me/crates.spec.ts | 2 +- e2e/routes/settings/tokens/index.spec.ts | 8 +- e2e/routes/settings/tokens/new.spec.ts | 16 +-- 44 files changed, 497 insertions(+), 486 deletions(-) diff --git a/e2e/acceptance/api-token.spec.ts b/e2e/acceptance/api-token.spec.ts index c7a3f2827df..d432c73fefa 100644 --- a/e2e/acceptance/api-token.spec.ts +++ b/e2e/acceptance/api-token.spec.ts @@ -3,21 +3,21 @@ import { http, HttpResponse } from 'msw'; test.describe('Acceptance | api-tokens', { tag: '@acceptance' }, () => { test.beforeEach(async ({ msw }) => { - let user = msw.db.user.create({ + let user = await msw.db.user.create({ login: 'johnnydee', name: 'John Doe', email: 'john@doe.com', avatar: 'https://avatars2.githubusercontent.com/u/1234567?v=4', }); - msw.db.apiToken.create({ + await msw.db.apiToken.create({ user, name: 'foo', createdAt: '2017-08-01T12:34:56', lastUsedAt: '2017-11-02T01:45:14', }); - msw.db.apiToken.create({ + await msw.db.apiToken.create({ user, name: 'BAR', createdAt: '2017-11-19T17:59:22', @@ -25,7 +25,7 @@ test.describe('Acceptance | api-tokens', { tag: '@acceptance' }, () => { expiredAt: '2017-12-19T17:59:22', }); - msw.db.apiToken.create({ + await msw.db.apiToken.create({ user, name: 'recently expired', createdAt: '2017-08-01T12:34:56', @@ -79,7 +79,7 @@ test.describe('Acceptance | api-tokens', { tag: '@acceptance' }, () => { await expect(page.locator('[data-test-api-token]')).toHaveCount(3); await page.click('[data-test-api-token="1"] [data-test-revoke-token-button]'); - expect(msw.db.apiToken.findMany({}).length, 'API token has been deleted from the backend database').toBe(2); + expect(msw.db.apiToken.findMany(null).length, 'API token has been deleted from the backend database').toBe(2); await expect(page.locator('[data-test-api-token]')).toHaveCount(2); await expect(page.locator('[data-test-api-token="2"]')).toBeVisible(); @@ -134,7 +134,7 @@ test.describe('Acceptance | api-tokens', { tag: '@acceptance' }, () => { await page.click('[data-test-generate]'); - let token = msw.db.apiToken.findFirst({ where: { name: { equals: 'the new token' } } })?.token; + let token = msw.db.apiToken.findFirst(q => q.where({ name: 'the new token' }))?.token; expect(token, 'API token has been created in the backend database').toBeTruthy(); await expect(page.locator('[data-test-api-token="4"] [data-test-name]')).toHaveText('the new token'); @@ -152,7 +152,7 @@ test.describe('Acceptance | api-tokens', { tag: '@acceptance' }, () => { await page.click('[data-test-scope="publish-update"]'); await page.click('[data-test-generate]'); - let token = msw.db.apiToken.findFirst({ where: { name: { equals: 'the new token' } } })?.token; + let token = msw.db.apiToken.findFirst(q => q.where({ name: 'the new token' }))?.token; await expect(page.locator('[data-test-token]')).toHaveText(token); // leave the API tokens page diff --git a/e2e/acceptance/categories.spec.ts b/e2e/acceptance/categories.spec.ts index be2537e31df..bf6dc00265a 100644 --- a/e2e/acceptance/categories.spec.ts +++ b/e2e/acceptance/categories.spec.ts @@ -2,12 +2,14 @@ import { expect, test } from '@/e2e/helper'; test.describe('Acceptance | categories', { tag: '@acceptance' }, () => { test('listing categories', async ({ page, msw, percy, a11y }) => { - msw.db.category.create({ category: 'API bindings' }); - let algos = msw.db.category.create({ category: 'Algorithms' }); - msw.db.crate.create({ categories: [algos] }); - let async = msw.db.category.create({ category: 'Asynchronous' }); - Array.from({ length: 15 }).forEach(() => msw.db.crate.create({ categories: [async] })); - msw.db.category.create({ category: 'Everything', crates_cnt: 1234 }); + await msw.db.category.create({ category: 'API bindings' }); + let algos = await msw.db.category.create({ category: 'Algorithms' }); + await msw.db.crate.create({ categories: [algos] }); + let async = await msw.db.category.create({ category: 'Asynchronous' }); + for (let i = 0; i < 15; i++) { + await msw.db.crate.create({ categories: [async] }); + } + await msw.db.category.create({ category: 'Everything', crates_cnt: 1234 }); await page.goto('/categories'); @@ -21,7 +23,7 @@ test.describe('Acceptance | categories', { tag: '@acceptance' }, () => { }); test('category/:category_id index default sort is recent-downloads', async ({ page, msw, percy, a11y }) => { - msw.db.category.create({ category: 'Algorithms' }); + await msw.db.category.create({ category: 'Algorithms' }); await page.goto('/categories/algorithms'); await expect(page.locator('[data-test-category-sort] [data-test-current-order]')).toHaveText('Recent Downloads'); @@ -31,8 +33,8 @@ test.describe('Acceptance | categories', { tag: '@acceptance' }, () => { }); test('listing category slugs', async ({ page, msw }) => { - msw.db.category.create({ category: 'Algorithms', description: 'Crates for algorithms' }); - msw.db.category.create({ category: 'Asynchronous', description: 'Async crates' }); + await msw.db.category.create({ category: 'Algorithms', description: 'Crates for algorithms' }); + await msw.db.category.create({ category: 'Asynchronous', description: 'Async crates' }); await page.goto('/category_slugs'); await expect(page.locator('[data-test-category-slug="algorithms"]')).toHaveText('algorithms'); @@ -45,7 +47,7 @@ test.describe('Acceptance | categories', { tag: '@acceptance' }, () => { test.describe('Acceptance | categories (locale: de)', { tag: '@acceptance' }, () => { test.use({ locale: 'de' }); test('listing categories', async ({ page, msw }) => { - msw.db.category.create({ category: 'Everything', crates_cnt: 1234 }); + await msw.db.category.create({ category: 'Everything', crates_cnt: 1234 }); await page.goto('categories'); await expect(page.locator('[data-test-category="everything"] [data-test-crate-count]')).toHaveText('1.234 crates'); diff --git a/e2e/acceptance/crate-deletion.spec.ts b/e2e/acceptance/crate-deletion.spec.ts index 0fa4de33711..72782fbd220 100644 --- a/e2e/acceptance/crate-deletion.spec.ts +++ b/e2e/acceptance/crate-deletion.spec.ts @@ -2,12 +2,12 @@ import { expect, test } from '@/e2e/helper'; test.describe('Acceptance | crate deletion', { tag: '@acceptance' }, () => { test('happy path', async ({ page, msw }) => { - let user = msw.db.user.create(); + let user = await msw.db.user.create(); await msw.authenticateAs(user); - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate }); - msw.db.crateOwnership.create({ crate, user }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate }); + await msw.db.crateOwnership.create({ crate, user }); await page.goto('/crates/foo'); await expect(page).toHaveURL('/crates/foo'); @@ -32,7 +32,7 @@ test.describe('Acceptance | crate deletion', { tag: '@acceptance' }, () => { let message = 'Crate foo has been successfully deleted.'; await expect(page.locator('[data-test-notification-message="success"]')).toHaveText(message); - crate = msw.db.crate.findFirst({ where: { name: { equals: 'foo' } } }); - expect(crate).toBeNull(); + crate = msw.db.crate.findFirst(q => q.where({ name: 'foo' })); + expect(crate).toBeUndefined(); }); }); diff --git a/e2e/acceptance/crate-dependencies.spec.ts b/e2e/acceptance/crate-dependencies.spec.ts index 28eda45c3e8..85350912dcf 100644 --- a/e2e/acceptance/crate-dependencies.spec.ts +++ b/e2e/acceptance/crate-dependencies.spec.ts @@ -4,7 +4,7 @@ import { http, HttpResponse } from 'msw'; test.describe('Acceptance | crate dependencies page', { tag: '@acceptance' }, () => { test('shows the lists of dependencies', async ({ page, msw, percy, a11y }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates/nanomsg/dependencies'); await expect(page).toHaveURL('/crates/nanomsg/0.6.1/dependencies'); @@ -19,8 +19,8 @@ test.describe('Acceptance | crate dependencies page', { tag: '@acceptance' }, () }); test('empty list case', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate, num: '0.6.1' }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate, num: '0.6.1' }); await page.goto('/crates/nanomsg/dependencies'); @@ -51,8 +51,8 @@ test.describe('Acceptance | crate dependencies page', { tag: '@acceptance' }, () }); test('shows an error page if version is not found', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '2.0.0' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '2.0.0' }); await page.goto('/crates/foo/1.0.0/dependencies'); await expect(page).toHaveURL('/crates/foo/1.0.0/dependencies'); @@ -63,8 +63,8 @@ test.describe('Acceptance | crate dependencies page', { tag: '@acceptance' }, () }); test('shows error message if loading of dependencies fails', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0' }); let error = HttpResponse.json({}, { status: 500 }); await msw.worker.use(http.get('/api/v1/crates/:crate_name/:version_num/dependencies', () => error)); @@ -78,16 +78,16 @@ test.describe('Acceptance | crate dependencies page', { tag: '@acceptance' }, () }); test('hides description if loading of dependency details fails', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'nanomsg' }); - let version = msw.db.version.create({ crate, num: '0.6.1' }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + let version = await msw.db.version.create({ crate, num: '0.6.1' }); - let foo = msw.db.crate.create({ name: 'foo', description: 'This is the foo crate' }); - msw.db.version.create({ crate: foo, num: '1.0.0' }); - msw.db.dependency.create({ crate: foo, version, req: '^1.0.0', kind: 'normal' }); + let foo = await msw.db.crate.create({ name: 'foo', description: 'This is the foo crate' }); + await msw.db.version.create({ crate: foo, num: '1.0.0' }); + await msw.db.dependency.create({ crate: foo, version, req: '^1.0.0', kind: 'normal' }); - let bar = msw.db.crate.create({ name: 'bar', description: 'This is the bar crate' }); - msw.db.version.create({ crate: bar, num: '2.3.4' }); - msw.db.dependency.create({ crate: bar, version, req: '^2.0.0', kind: 'normal' }); + let bar = await msw.db.crate.create({ name: 'bar', description: 'This is the bar crate' }); + await msw.db.version.create({ crate: bar, num: '2.3.4' }); + await msw.db.dependency.create({ crate: bar, version, req: '^2.0.0', kind: 'normal' }); let error = HttpResponse.json({}, { status: 500 }); await msw.worker.use(http.get('/api/v1/crates', () => error)); diff --git a/e2e/acceptance/crate-following.spec.ts b/e2e/acceptance/crate-following.spec.ts index f6b02e43dd7..50326a03172 100644 --- a/e2e/acceptance/crate-following.spec.ts +++ b/e2e/acceptance/crate-following.spec.ts @@ -4,13 +4,13 @@ import { http, HttpResponse } from 'msw'; test.describe('Acceptance | Crate following', { tag: '@acceptance' }, () => { async function prepare(msw, { skipLogin = false, following = false } = {}) { - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate, num: '0.6.0' }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate, num: '0.6.0' }); let loggedIn = !skipLogin; if (loggedIn) { let followedCrates = following ? [crate] : []; - let user = msw.db.user.create({ followedCrates }); + let user = await msw.db.user.create({ followedCrates }); await msw.authenticateAs(user); } } diff --git a/e2e/acceptance/crate-navtabs.spec.ts b/e2e/acceptance/crate-navtabs.spec.ts index 2fb880b23f7..16c23c5186d 100644 --- a/e2e/acceptance/crate-navtabs.spec.ts +++ b/e2e/acceptance/crate-navtabs.spec.ts @@ -3,8 +3,8 @@ import { Locator } from '@playwright/test'; test.describe('Acceptance | crate navigation tabs', { tag: '@acceptance' }, () => { test('basic navigation between tabs works as expected', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate, num: '0.6.1' }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate, num: '0.6.1' }); const tabReadme = page.locator('[data-test-readme-tab] a'); const tabVersions = page.locator('[data-test-versions-tab] a'); diff --git a/e2e/acceptance/crate.spec.ts b/e2e/acceptance/crate.spec.ts index 59daa2badf6..f0ad722c552 100644 --- a/e2e/acceptance/crate.spec.ts +++ b/e2e/acceptance/crate.spec.ts @@ -4,8 +4,8 @@ import { http, HttpResponse } from 'msw'; test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { test('visiting a crate page from the front page', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'nanomsg', newest_version: '0.6.1' }); - msw.db.version.create({ crate, num: '0.6.1' }); + let crate = await msw.db.crate.create({ name: 'nanomsg', newest_version: '0.6.1' }); + await msw.db.version.create({ crate, num: '0.6.1' }); await page.goto('/'); await page.click('[data-test-just-updated] [data-test-crate-link="0"]'); @@ -18,9 +18,9 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('visiting /crates/nanomsg', async ({ page, msw, ember, percy, a11y }) => { - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate, num: '0.6.0' }); - msw.db.version.create({ crate, num: '0.6.1', rust_version: '1.69' }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate, num: '0.6.0' }); + await msw.db.version.create({ crate, num: '0.6.1', rust_version: '1.69' }); await page.goto('/crates/nanomsg'); @@ -39,9 +39,9 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('visiting /crates/nanomsg/', async ({ page, msw, ember }) => { - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate, num: '0.6.0' }); - msw.db.version.create({ crate, num: '0.6.1' }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate, num: '0.6.0' }); + await msw.db.version.create({ crate, num: '0.6.1' }); await page.goto('/crates/nanomsg/'); @@ -57,9 +57,9 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('visiting /crates/nanomsg/0.6.0', async ({ page, msw, ember, percy, a11y }) => { - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate, num: '0.6.0' }); - msw.db.version.create({ crate, num: '0.6.1' }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate, num: '0.6.0' }); + await msw.db.version.create({ crate, num: '0.6.1' }); await page.goto('/crates/nanomsg/0.6.0'); @@ -98,9 +98,9 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('unknown versions fall back to latest version and show an error message', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate, num: '0.6.0' }); - msw.db.version.create({ crate, num: '0.6.1' }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate, num: '0.6.0' }); + await msw.db.version.create({ crate, num: '0.6.1' }); await page.goto('/crates/nanomsg/0.7.0'); @@ -112,8 +112,8 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('works for non-canonical names', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo-bar' }); - msw.db.version.create({ crate }); + let crate = await msw.db.crate.create({ name: 'foo-bar' }); + await msw.db.version.create({ crate }); await page.goto('/crates/foo_bar'); @@ -124,7 +124,7 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('navigating to the versions page', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); // default with a page size more than 13 await page.goto('/crates/nanomsg'); @@ -136,7 +136,7 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('navigating to the versions page with custom per_page', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates/nanomsg/versions?per_page=10'); await expect(page.locator('[data-test-page-description]')).toHaveText( @@ -150,7 +150,7 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('navigating to the reverse dependencies page', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates/nanomsg'); await page.click('[data-test-rev-deps-tab] a'); @@ -160,7 +160,7 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('navigating to a user page', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates/nanomsg'); await page.click('[data-test-owners] [data-test-owner-link="blabaere"]'); @@ -170,7 +170,7 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('navigating to a team page', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates/nanomsg'); await page.click('[data-test-owners] [data-test-owner-link="github:org:thehydroimpulse"]'); @@ -180,7 +180,7 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('crates having user-owners', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates/nanomsg'); @@ -192,7 +192,7 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('crates having team-owners', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates/nanomsg'); @@ -201,7 +201,7 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('crates license is supplied by version', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates/nanomsg'); await expect(page.locator('[data-test-license]')).toHaveText('Apache-2.0'); @@ -211,9 +211,9 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('sidebar shows correct information', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '0.5.0' }); - msw.db.version.create({ crate, num: '1.0.0' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '0.5.0' }); + await msw.db.version.create({ crate, num: '1.0.0' }); await page.goto('/crates/foo'); await expect(page.locator('[data-test-linecounts]')).toHaveText('1,119 SLoC'); @@ -223,9 +223,9 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test.skip('crates can be yanked by owner', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); - let user = msw.db.user.findFirst({ where: { login: { equals: 'thehydroimpulse' } } }); + let user = msw.db.user.findFirst(q => q.where({ login: 'thehydroimpulse' })); await msw.authenticateAs(user); await page.goto('/crates/nanomsg/0.5.0'); @@ -243,7 +243,7 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('navigating to the owners page when not logged in', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates/nanomsg'); @@ -251,9 +251,9 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('navigating to the owners page when not an owner', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); - let user = msw.db.user.findFirst({ where: { login: { equals: 'iain8' } } }); + let user = msw.db.user.findFirst(q => q.where({ login: 'iain8' })); await msw.authenticateAs(user); await page.goto('/crates/nanomsg'); @@ -262,9 +262,9 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('navigating to the settings page', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); - let user = msw.db.user.findFirst({ where: { login: { equals: 'thehydroimpulse' } } }); + let user = msw.db.user.findFirst(q => q.where({ login: 'thehydroimpulse' })); await msw.authenticateAs(user); await page.goto('/crates/nanomsg'); @@ -274,7 +274,7 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('keywords are shown when navigating from search', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/search?q=nanomsg'); await page.getByRole('link', { name: 'nanomsg', exact: true }).click(); @@ -284,7 +284,7 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('keywords are shown when navigating from crate to keywords, and then back to crate', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates/nanomsg'); await expect(page.locator('[data-test-keyword]')).toBeVisible(); @@ -298,7 +298,7 @@ test.describe('Acceptance | crate page', { tag: '@acceptance' }, () => { }); test('keywords are shown when navigating from crate to searchs, and then back to crate', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates/nanomsg'); await expect(page.locator('[data-test-keyword]')).toBeVisible(); diff --git a/e2e/acceptance/crates.spec.ts b/e2e/acceptance/crates.spec.ts index 36eeddbdebd..37cd41e9d80 100644 --- a/e2e/acceptance/crates.spec.ts +++ b/e2e/acceptance/crates.spec.ts @@ -7,7 +7,7 @@ test.describe('Acceptance | crates page', { tag: '@acceptance' }, () => { const per_page = 50; test('visiting the crates page from the front page', async ({ page, msw, percy, a11y }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/'); await page.click('[data-test-all-crates-link]'); @@ -20,7 +20,7 @@ test.describe('Acceptance | crates page', { tag: '@acceptance' }, () => { }); test('visiting the crates page directly', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates'); await page.click('[data-test-all-crates-link]'); @@ -32,8 +32,8 @@ test.describe('Acceptance | crates page', { tag: '@acceptance' }, () => { test('listing crates', async ({ page, msw }) => { const per_page = 50; for (let i = 1; i <= per_page; i++) { - let crate = msw.db.crate.create(); - msw.db.version.create({ crate }); + let crate = await msw.db.crate.create(); + await msw.db.version.create({ crate }); } await page.goto('/crates'); @@ -45,8 +45,8 @@ test.describe('Acceptance | crates page', { tag: '@acceptance' }, () => { test('navigating to next page of crates', async ({ page, msw }) => { const per_page = 50; for (let i = 1; i <= per_page + 2; i++) { - let crate = msw.db.crate.create(); - msw.db.version.create({ crate }); + let crate = await msw.db.crate.create(); + await msw.db.version.create({ crate }); } const page_start = per_page + 1; const total = per_page + 2; @@ -60,7 +60,7 @@ test.describe('Acceptance | crates page', { tag: '@acceptance' }, () => { }); test('crates default sort is alphabetical', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates'); @@ -68,21 +68,21 @@ test.describe('Acceptance | crates page', { tag: '@acceptance' }, () => { }); test('downloads appears for each crate on crate list', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates'); await expect(page.locator('[data-test-crate-row="0"] [data-test-downloads]')).toHaveText('All-Time: 21,573'); }); test('recent downloads appears for each crate on crate list', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/crates'); await expect(page.locator('[data-test-crate-row="0"] [data-test-recent-downloads]')).toHaveText('Recent: 2,000'); }); test('shows error message screen', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); let detail = 'Page 1 is unavailable for performance reasons. Please take a look at https://crates.io/data-access for alternatives.'; diff --git a/e2e/acceptance/dashboard.spec.ts b/e2e/acceptance/dashboard.spec.ts index 1baefd56928..3fa4bc359ae 100644 --- a/e2e/acceptance/dashboard.spec.ts +++ b/e2e/acceptance/dashboard.spec.ts @@ -10,7 +10,7 @@ test.describe('Acceptance | Dashboard', { tag: '@acceptance' }, () => { }); test('shows the dashboard when logged in', async ({ page, msw, percy }) => { - let user = msw.db.user.create({ + let user = await msw.db.user.create({ login: 'johnnydee', name: 'John Doe', email: 'john@doe.com', @@ -20,31 +20,33 @@ test.describe('Acceptance | Dashboard', { tag: '@acceptance' }, () => { await msw.authenticateAs(user); { - let crate = msw.db.crate.create({ name: 'rand' }); - msw.db.version.create({ crate, num: '0.5.0' }); - msw.db.version.create({ crate, num: '0.6.0' }); - msw.db.version.create({ crate, num: '0.7.0' }); - msw.db.version.create({ crate, num: '0.7.1' }); - msw.db.version.create({ crate, num: '0.7.2' }); - msw.db.version.create({ crate, num: '0.7.3' }); - msw.db.version.create({ crate, num: '0.8.0' }); - msw.db.version.create({ crate, num: '0.8.1' }); - msw.db.version.create({ crate, num: '0.9.0' }); - msw.db.version.create({ crate, num: '1.0.0' }); - msw.db.version.create({ crate, num: '1.1.0' }); - user = msw.db.user.update({ - where: { id: { equals: user.id } }, - data: { followedCrates: [...user.followedCrates, crate] }, + let crate = await msw.db.crate.create({ name: 'rand' }); + await msw.db.version.create({ crate, num: '0.5.0' }); + await msw.db.version.create({ crate, num: '0.6.0' }); + await msw.db.version.create({ crate, num: '0.7.0' }); + await msw.db.version.create({ crate, num: '0.7.1' }); + await msw.db.version.create({ crate, num: '0.7.2' }); + await msw.db.version.create({ crate, num: '0.7.3' }); + await msw.db.version.create({ crate, num: '0.8.0' }); + await msw.db.version.create({ crate, num: '0.8.1' }); + await msw.db.version.create({ crate, num: '0.9.0' }); + await msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.version.create({ crate, num: '1.1.0' }); + user = await msw.db.user.update(q => q.where({ id: user.id }), { + data(u) { + u.followedCrates = [...u.followedCrates, crate]; + }, }); } { - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.crateOwnership.create({ crate, user }); - msw.db.version.create({ crate, num: '0.1.0' }); - user = msw.db.user.update({ - where: { id: { equals: user.id } }, - data: { followedCrates: [...user.followedCrates, crate] }, + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.crateOwnership.create({ crate, user }); + await msw.db.version.create({ crate, num: '0.1.0' }); + user = await msw.db.user.update(q => q.where({ id: user.id }), { + data(u) { + u.followedCrates = [...u.followedCrates, crate]; + }, }); } diff --git a/e2e/acceptance/email-change.spec.ts b/e2e/acceptance/email-change.spec.ts index b152bf2bf12..3bab6ea36a3 100644 --- a/e2e/acceptance/email-change.spec.ts +++ b/e2e/acceptance/email-change.spec.ts @@ -3,7 +3,7 @@ import { http, HttpResponse } from 'msw'; test.describe('Acceptance | Email Change', { tag: '@acceptance' }, () => { test('happy path', async ({ page, msw }) => { - let user = msw.db.user.create({ email: 'old@email.com' }); + let user = await msw.db.user.create({ email: 'old@email.com' }); await msw.authenticateAs(user); await page.goto('/settings/profile'); @@ -37,14 +37,14 @@ test.describe('Acceptance | Email Change', { tag: '@acceptance' }, () => { await expect(emailInput.locator('[data-test-verification-sent]')).toBeVisible(); await expect(emailInput.locator('[data-test-resend-button]')).toBeEnabled(); - user = msw.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = msw.db.user.findFirst(q => q.where({ id: user.id })); await expect(user.email).toBe('new@email.com'); await expect(user.emailVerified).toBe(false); await expect(user.emailVerificationToken).toBeDefined(); }); test('happy path with `email: null`', async ({ page, msw }) => { - let user = msw.db.user.create({ email: undefined }); + let user = await msw.db.user.create({ email: null }); await msw.authenticateAs(user); await page.goto('/settings/profile'); @@ -74,14 +74,14 @@ test.describe('Acceptance | Email Change', { tag: '@acceptance' }, () => { await expect(emailInput.locator('[data-test-verification-sent]')).toBeVisible(); await expect(emailInput.locator('[data-test-resend-button]')).toBeEnabled(); - user = msw.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = msw.db.user.findFirst(q => q.where({ id: user.id })); await expect(user.email).toBe('new@email.com'); await expect(user.emailVerified).toBe(false); await expect(user.emailVerificationToken).toBeDefined(); }); test('cancel button', async ({ page, msw }) => { - let user = msw.db.user.create({ email: 'old@email.com' }); + let user = await msw.db.user.create({ email: 'old@email.com' }); await msw.authenticateAs(user); await page.goto('/settings/profile'); @@ -96,14 +96,14 @@ test.describe('Acceptance | Email Change', { tag: '@acceptance' }, () => { await expect(emailInput.locator('[data-test-not-verified]')).toHaveCount(0); await expect(emailInput.locator('[data-test-verification-sent]')).toHaveCount(0); - user = msw.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = msw.db.user.findFirst(q => q.where({ id: user.id })); await expect(user.email).toBe('old@email.com'); await expect(user.emailVerified).toBe(true); await expect(user.emailVerificationToken).toBe(null); }); test('server error', async ({ page, msw }) => { - let user = msw.db.user.create({ email: 'old@email.com' }); + let user = await msw.db.user.create({ email: 'old@email.com' }); await msw.authenticateAs(user); let error = HttpResponse.json({}, { status: 500 }); @@ -121,7 +121,7 @@ test.describe('Acceptance | Email Change', { tag: '@acceptance' }, () => { 'Error in saving email: An unknown error occurred while saving this email.', ); - user = msw.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = msw.db.user.findFirst(q => q.where({ id: user.id })); await expect(user.email).toBe('old@email.com'); await expect(user.emailVerified).toBe(true); await expect(user.emailVerificationToken).toBe(null); @@ -129,7 +129,7 @@ test.describe('Acceptance | Email Change', { tag: '@acceptance' }, () => { test.describe('Resend button', function () { test('happy path', async ({ page, msw }) => { - let user = msw.db.user.create({ email: 'john@doe.com', emailVerificationToken: 'secret123' }); + let user = await msw.db.user.create({ email: 'john@doe.com', emailVerificationToken: 'secret123' }); await msw.authenticateAs(user); await page.goto('/settings/profile'); @@ -150,7 +150,7 @@ test.describe('Acceptance | Email Change', { tag: '@acceptance' }, () => { }); test('server error', async ({ page, msw }) => { - let user = msw.db.user.create({ email: 'john@doe.com', emailVerificationToken: 'secret123' }); + let user = await msw.db.user.create({ email: 'john@doe.com', emailVerificationToken: 'secret123' }); await msw.authenticateAs(user); let error = HttpResponse.json({}, { status: 500 }); diff --git a/e2e/acceptance/email-confirmation.spec.ts b/e2e/acceptance/email-confirmation.spec.ts index 034a5d144dc..8dfc8ff2faa 100644 --- a/e2e/acceptance/email-confirmation.spec.ts +++ b/e2e/acceptance/email-confirmation.spec.ts @@ -2,19 +2,19 @@ import { expect, test } from '@/e2e/helper'; test.describe('Acceptance | Email Confirmation', { tag: '@acceptance' }, () => { test('unauthenticated happy path', async ({ page, msw }) => { - let user = msw.db.user.create({ emailVerificationToken: 'badc0ffee' }); + let user = await msw.db.user.create({ emailVerificationToken: 'badc0ffee' }); await page.goto('/confirm/badc0ffee'); await expect(user.emailVerified).toBe(false); await expect(page).toHaveURL('/'); await expect(page.locator('[data-test-notification-message="success"]')).toBeVisible(); - user = msw.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = msw.db.user.findFirst(q => q.where({ id: user.id })); await expect(user.emailVerified).toBe(true); }); test('authenticated happy path', async ({ page, msw, ember }) => { - let user = msw.db.user.create({ emailVerificationToken: 'badc0ffee' }); + let user = await msw.db.user.create({ emailVerificationToken: 'badc0ffee' }); await msw.authenticateAs(user); @@ -29,7 +29,7 @@ test.describe('Acceptance | Email Confirmation', { tag: '@acceptance' }, () => { }); expect(emailVerified).toBe(true); - user = msw.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = msw.db.user.findFirst(q => q.where({ id: user.id })); await expect(user.emailVerified).toBe(true); }); diff --git a/e2e/acceptance/front-page.spec.ts b/e2e/acceptance/front-page.spec.ts index 64b30387a39..9db3f49c8af 100644 --- a/e2e/acceptance/front-page.spec.ts +++ b/e2e/acceptance/front-page.spec.ts @@ -6,7 +6,7 @@ import { http, HttpResponse } from 'msw'; test.describe('Acceptance | front page', { tag: '@acceptance' }, () => { test.use({ locale: 'en' }); test('visiting /', async ({ page, msw, percy, a11y }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/'); diff --git a/e2e/acceptance/invites.spec.ts b/e2e/acceptance/invites.spec.ts index 55f3d1888a8..b06f9d18003 100644 --- a/e2e/acceptance/invites.spec.ts +++ b/e2e/acceptance/invites.spec.ts @@ -12,23 +12,23 @@ test.describe('Acceptance | /me/pending-invites', { tag: '@acceptance' }, () => test.describe('Acceptance | /me/pending-invites', { tag: '@acceptance' }, () => { async function prepare(msw) { - let inviter = msw.db.user.create({ name: 'janed' }); - let inviter2 = msw.db.user.create({ name: 'wycats' }); + let inviter = await msw.db.user.create({ name: 'janed' }); + let inviter2 = await msw.db.user.create({ name: 'wycats' }); - let user = msw.db.user.create(); + let user = await msw.db.user.create(); - let nanomsg = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate: nanomsg }); - msw.db.crateOwnerInvitation.create({ + let nanomsg = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate: nanomsg }); + await msw.db.crateOwnerInvitation.create({ crate: nanomsg, createdAt: '2016-12-24T12:34:56Z', invitee: user, inviter, }); - let ember = msw.db.crate.create({ name: 'ember-rs' }); - msw.db.version.create({ crate: ember }); - msw.db.crateOwnerInvitation.create({ + let ember = await msw.db.crate.create({ name: 'ember-rs' }); + await msw.db.version.create({ crate: ember }); + await msw.db.crateOwnerInvitation.create({ crate: ember, createdAt: '2020-12-31T12:34:56Z', invitee: user, @@ -70,7 +70,7 @@ test.describe('Acceptance | /me/pending-invites', { tag: '@acceptance' }, () => test('shows empty list message', async ({ page, msw }) => { await prepare(msw); - msw.db.crateOwnerInvitation.deleteMany({}); + msw.db.crateOwnerInvitation.deleteMany(null); await page.goto('/me/pending-invites'); await expect(page).toHaveURL('/me/pending-invites'); @@ -81,20 +81,14 @@ test.describe('Acceptance | /me/pending-invites', { tag: '@acceptance' }, () => test('invites can be declined', async ({ page, msw }) => { let { nanomsg, user } = await prepare(msw); - let invites = msw.db.crateOwnerInvitation.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - invitee: { id: { equals: user.id } }, - }, - }); + let invites = msw.db.crateOwnerInvitation.findMany(q => + q.where(inv => inv.crate.id === nanomsg.id && inv.invitee.id === user.id), + ); expect(invites.length).toBe(1); - let owners = msw.db.crateOwnership.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - user: { id: { equals: user.id } }, - }, - }); + let owners = msw.db.crateOwnership.findMany(q => + q.where(ownership => ownership.crate.id === nanomsg.id && ownership.user.id === user.id), + ); expect(owners.length).toBe(0); await page.goto('/me/pending-invites'); @@ -111,20 +105,14 @@ test.describe('Acceptance | /me/pending-invites', { tag: '@acceptance' }, () => await expect(page.locator('[data-test-error-message]')).toHaveCount(0); await expect(page.locator('[data-test-accepted-message]')).toHaveCount(0); - invites = msw.db.crateOwnerInvitation.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - invitee: { id: { equals: user.id } }, - }, - }); + invites = msw.db.crateOwnerInvitation.findMany(q => + q.where(inv => inv.crate.id === nanomsg.id && inv.invitee.id === user.id), + ); expect(invites.length).toBe(0); - owners = msw.db.crateOwnership.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - user: { id: { equals: user.id } }, - }, - }); + owners = msw.db.crateOwnership.findMany(q => + q.where(ownership => ownership.crate.id === nanomsg.id && ownership.user.id === user.id), + ); expect(owners.length).toBe(0); }); @@ -146,20 +134,14 @@ test.describe('Acceptance | /me/pending-invites', { tag: '@acceptance' }, () => test('invites can be accepted', async ({ page, percy, msw }) => { let { nanomsg, user } = await prepare(msw); - let invites = msw.db.crateOwnerInvitation.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - invitee: { id: { equals: user.id } }, - }, - }); + let invites = msw.db.crateOwnerInvitation.findMany(q => + q.where(inv => inv.crate.id === nanomsg.id && inv.invitee.id === user.id), + ); expect(invites.length).toBe(1); - let owners = msw.db.crateOwnership.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - user: { id: { equals: user.id } }, - }, - }); + let owners = msw.db.crateOwnership.findMany(q => + q.where(ownership => ownership.crate.id === nanomsg.id && ownership.user.id === user.id), + ); expect(owners.length).toBe(0); await page.goto('/me/pending-invites'); @@ -176,20 +158,14 @@ test.describe('Acceptance | /me/pending-invites', { tag: '@acceptance' }, () => await percy.snapshot(); - invites = msw.db.crateOwnerInvitation.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - invitee: { id: { equals: user.id } }, - }, - }); + invites = msw.db.crateOwnerInvitation.findMany(q => + q.where(inv => inv.crate.id === nanomsg.id && inv.invitee.id === user.id), + ); expect(invites.length).toBe(0); - owners = msw.db.crateOwnership.findMany({ - where: { - crate: { id: { equals: nanomsg.id } }, - user: { id: { equals: user.id } }, - }, - }); + owners = msw.db.crateOwnership.findMany(q => + q.where(ownership => ownership.crate.id === nanomsg.id && ownership.user.id === user.id), + ); expect(owners.length).toBe(1); }); diff --git a/e2e/acceptance/keyword.spec.ts b/e2e/acceptance/keyword.spec.ts index 357b9d77f6c..fcc055313fc 100644 --- a/e2e/acceptance/keyword.spec.ts +++ b/e2e/acceptance/keyword.spec.ts @@ -2,7 +2,7 @@ import { expect, test } from '@/e2e/helper'; test.describe('Acceptance | keywords', { tag: '@acceptance' }, () => { test('keyword/:keyword_id index default sort is recent-downloads', async ({ page, msw, percy, a11y }) => { - msw.db.keyword.create({ keyword: 'network' }); + await msw.db.keyword.create({ keyword: 'network' }); await page.goto('/keywords/network'); diff --git a/e2e/acceptance/login.spec.ts b/e2e/acceptance/login.spec.ts index aaeb9704747..2035a28e577 100644 --- a/e2e/acceptance/login.spec.ts +++ b/e2e/acceptance/login.spec.ts @@ -13,14 +13,14 @@ test.describe('Acceptance | Login', { tag: '@acceptance' }, () => { msw.worker.use( http.get('/api/private/session/begin', () => HttpResponse.json({ url: 'url-to-github-including-state-secret' })), - http.get('/api/private/session/authorize', ({ request }) => { + http.get('/api/private/session/authorize', async ({ request }) => { let url = new URL(request.url); expect([...url.searchParams.keys()]).toEqual(['code', 'state']); expect(url.searchParams.get('code')).toBe('901dd10e07c7e9fa1cd5'); expect(url.searchParams.get('state')).toBe('fYcUY3FMdUUz00FC7vLT7A'); - let user = msw.db.user.create(); - msw.db.mswSession.create({ user }); + let user = await msw.db.user.create(); + await msw.db.mswSession.create({ user }); return HttpResponse.json({ ok: true }); }), http.get('/api/v1/me', () => diff --git a/e2e/acceptance/logout.spec.ts b/e2e/acceptance/logout.spec.ts index f4f281b9784..2700fdf3fb9 100644 --- a/e2e/acceptance/logout.spec.ts +++ b/e2e/acceptance/logout.spec.ts @@ -2,7 +2,7 @@ import { expect, test } from '@/e2e/helper'; test.describe('Acceptance | Logout', { tag: '@acceptance' }, () => { test('successful logout', async ({ page, msw }) => { - let user = msw.db.user.create({ name: 'John Doe' }); + let user = await msw.db.user.create({ name: 'John Doe' }); await msw.authenticateAs(user); await page.goto('/crates'); diff --git a/e2e/acceptance/publish-notifications.spec.ts b/e2e/acceptance/publish-notifications.spec.ts index 2d801fff89c..bdc7fbb4d7c 100644 --- a/e2e/acceptance/publish-notifications.spec.ts +++ b/e2e/acceptance/publish-notifications.spec.ts @@ -4,7 +4,7 @@ import { http, HttpResponse } from 'msw'; test.describe('Acceptance | publish notifications', { tag: '@acceptance' }, () => { test('unsubscribe and resubscribe', async ({ page, msw }) => { - let user = msw.db.user.create(); + let user = await msw.db.user.create(); await msw.authenticateAs(user); await page.goto('/settings/profile'); @@ -15,19 +15,19 @@ test.describe('Acceptance | publish notifications', { tag: '@acceptance' }, () = await expect(page.locator('[data-test-notifications] input[type=checkbox]')).not.toBeChecked(); await page.click('[data-test-notifications] button'); - user = msw.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = msw.db.user.findFirst(q => q.where({ id: user.id })); expect(user.publishNotifications).toBe(false); await page.click('[data-test-notifications] input[type=checkbox]'); await expect(page.locator('[data-test-notifications] input[type=checkbox]')).toBeChecked(); await page.click('[data-test-notifications] button'); - user = msw.db.user.findFirst({ where: { id: { equals: user.id } } }); + user = msw.db.user.findFirst(q => q.where({ id: user.id })); expect(user.publishNotifications).toBe(true); }); test('loading state', async ({ page, msw }) => { - let user = msw.db.user.create(); + let user = await msw.db.user.create(); await msw.authenticateAs(user); let deferred = defer(); @@ -48,7 +48,7 @@ test.describe('Acceptance | publish notifications', { tag: '@acceptance' }, () = }); test('error state', async ({ page, msw }) => { - let user = msw.db.user.create(); + let user = await msw.db.user.create(); await msw.authenticateAs(user); msw.worker.use(http.put('/api/v1/users/:user_id', () => HttpResponse.text('', { status: 500 }))); diff --git a/e2e/acceptance/readme-rendering.spec.ts b/e2e/acceptance/readme-rendering.spec.ts index 80ecf826b21..63e51224159 100644 --- a/e2e/acceptance/readme-rendering.spec.ts +++ b/e2e/acceptance/readme-rendering.spec.ts @@ -119,8 +119,8 @@ graph TD; test.describe('Acceptance | README rendering', { tag: '@acceptance' }, () => { test('it works', async ({ page, msw, percy }) => { - let crate = msw.db.crate.create({ name: 'serde' }); - msw.db.version.create({ crate, num: '1.0.0', readme: README_HTML }); + let crate = await msw.db.crate.create({ name: 'serde' }); + await msw.db.version.create({ crate, num: '1.0.0', readme: README_HTML }); await page.goto('/crates/serde'); const readme = page.locator('[data-test-readme]'); @@ -134,16 +134,16 @@ test.describe('Acceptance | README rendering', { tag: '@acceptance' }, () => { }); test('it shows a fallback if no readme is available', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'serde' }); - msw.db.version.create({ crate, num: '1.0.0' }); + let crate = await msw.db.crate.create({ name: 'serde' }); + await msw.db.version.create({ crate, num: '1.0.0' }); await page.goto('/crates/serde'); await expect(page.locator('[data-test-no-readme]')).toBeVisible(); }); test('it shows an error message and retry button if loading fails', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'serde' }); - msw.db.version.create({ crate, num: '1.0.0', readme: 'foo' }); + let crate = await msw.db.crate.create({ name: 'serde' }); + await msw.db.version.create({ crate, num: '1.0.0', readme: 'foo' }); // Simulate a server error when fetching the README msw.worker.use(http.get('/api/v1/crates/:name/:version/readme', () => HttpResponse.html('', { status: 500 }))); diff --git a/e2e/acceptance/rebuild-docs.spec.ts b/e2e/acceptance/rebuild-docs.spec.ts index f9bd14b49d8..4094bede9b8 100644 --- a/e2e/acceptance/rebuild-docs.spec.ts +++ b/e2e/acceptance/rebuild-docs.spec.ts @@ -2,16 +2,16 @@ import { expect, test } from '@/e2e/helper'; test.describe('Acceptance | rebuild docs page', { tag: '@acceptance' }, () => { test('navigates to rebuild docs confirmation page', async ({ page, msw }) => { - let user = msw.db.user.create(); + let user = await msw.db.user.create(); await msw.authenticateAs(user); - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.crateOwnership.create({ crate, user }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.crateOwnership.create({ crate, user }); - msw.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' }); - msw.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' }); - msw.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' }); - msw.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); + await msw.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' }); + await msw.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' }); + await msw.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' }); + await msw.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); await page.goto('/crates/nanomsg/versions'); await expect(page).toHaveURL('/crates/nanomsg/versions'); @@ -29,13 +29,13 @@ test.describe('Acceptance | rebuild docs page', { tag: '@acceptance' }, () => { }); test('rebuild docs confirmation page shows crate info and allows confirmation', async ({ page, msw }) => { - let user = msw.db.user.create(); + let user = await msw.db.user.create(); await msw.authenticateAs(user); - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.crateOwnership.create({ crate, user }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.crateOwnership.create({ crate, user }); - msw.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); + await msw.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); await page.goto('/crates/nanomsg/0.2.1/rebuild-docs'); await expect(page).toHaveURL('/crates/nanomsg/0.2.1/rebuild-docs'); @@ -52,11 +52,11 @@ test.describe('Acceptance | rebuild docs page', { tag: '@acceptance' }, () => { }); test('rebuild docs confirmation page redirects non-owners to error page', async ({ page, msw }) => { - let user = msw.db.user.create(); + let user = await msw.db.user.create(); await msw.authenticateAs(user); - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); await page.goto('/crates/nanomsg/0.2.1/rebuild-docs'); @@ -65,8 +65,8 @@ test.describe('Acceptance | rebuild docs page', { tag: '@acceptance' }, () => { }); test('rebuild docs confirmation page shows authentication error for unauthenticated users', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); await page.goto('/crates/nanomsg/0.2.1/rebuild-docs'); diff --git a/e2e/acceptance/reverse-dependencies.spec.ts b/e2e/acceptance/reverse-dependencies.spec.ts index 27a8262d7ac..e3eed696d21 100644 --- a/e2e/acceptance/reverse-dependencies.spec.ts +++ b/e2e/acceptance/reverse-dependencies.spec.ts @@ -2,24 +2,24 @@ import { expect, test } from '@/e2e/helper'; import { http, HttpResponse } from 'msw'; test.describe('Acceptance | /crates/:crate_id/reverse_dependencies', { tag: '@acceptance' }, () => { - function prepare(msw) { - let foo = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate: foo }); + async function prepare(msw) { + let foo = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate: foo }); - let bar = msw.db.crate.create({ name: 'bar' }); - let barV = msw.db.version.create({ crate: bar }); + let bar = await msw.db.crate.create({ name: 'bar' }); + let barV = await msw.db.version.create({ crate: bar }); - let baz = msw.db.crate.create({ name: 'baz' }); - let bazV = msw.db.version.create({ crate: baz }); + let baz = await msw.db.crate.create({ name: 'baz' }); + let bazV = await msw.db.version.create({ crate: baz }); - msw.db.dependency.create({ crate: foo, version: barV }); - msw.db.dependency.create({ crate: foo, version: bazV }); + await msw.db.dependency.create({ crate: foo, version: barV }); + await msw.db.dependency.create({ crate: foo, version: bazV }); return { foo, bar, baz }; } test('shows a list of crates depending on the selected crate', async ({ page, msw }) => { - let { foo, bar, baz } = prepare(msw); + let { foo, bar, baz } = await prepare(msw); await page.goto(`/crates/${foo.name}/reverse_dependencies`); await expect(page).toHaveURL(`/crates/${foo.name}/reverse_dependencies`); @@ -34,12 +34,12 @@ test.describe('Acceptance | /crates/:crate_id/reverse_dependencies', { tag: '@ac }); test('supports pagination', async ({ page, msw }) => { - let { foo } = prepare(msw); + let { foo } = await prepare(msw); for (let i = 0; i < 20; i++) { - let crate = msw.db.crate.create(); - let version = msw.db.version.create({ crate }); - msw.db.dependency.create({ crate: foo, version }); + let crate = await msw.db.crate.create(); + let version = await msw.db.version.create({ crate }); + await msw.db.dependency.create({ crate: foo, version }); } const row = page.locator('[data-test-row]'); @@ -66,7 +66,7 @@ test.describe('Acceptance | /crates/:crate_id/reverse_dependencies', { tag: '@ac }); test('shows error message if loading of reverse dependencies fails', async ({ page, msw }) => { - let { foo } = prepare(msw); + let { foo } = await prepare(msw); let error = HttpResponse.json({}, { status: 500 }); await msw.worker.use(http.get('/api/v1/crates/:crate_id/reverse_dependencies', () => error)); diff --git a/e2e/acceptance/search.spec.ts b/e2e/acceptance/search.spec.ts index 64a3021ac4a..49b52bac34b 100644 --- a/e2e/acceptance/search.spec.ts +++ b/e2e/acceptance/search.spec.ts @@ -5,7 +5,7 @@ import { http, HttpResponse } from 'msw'; test.describe('Acceptance | search', { tag: '@acceptance' }, () => { test('searching for "rust"', async ({ page, msw, percy, a11y }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/'); await page.fill('[data-test-search-input]', 'rust'); @@ -34,7 +34,7 @@ test.describe('Acceptance | search', { tag: '@acceptance' }, () => { }); test('searching for "rust" from query', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/search?q=rust'); @@ -47,7 +47,7 @@ test.describe('Acceptance | search', { tag: '@acceptance' }, () => { }); test('clearing search results', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/search?q=rust'); @@ -62,7 +62,7 @@ test.describe('Acceptance | search', { tag: '@acceptance' }, () => { }); test('pressing S key to focus the search bar', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/'); @@ -91,7 +91,7 @@ test.describe('Acceptance | search', { tag: '@acceptance' }, () => { }); test('check search results are by default displayed by relevance', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/'); await page.fill('[data-test-search-input]', 'rust'); @@ -101,8 +101,8 @@ test.describe('Acceptance | search', { tag: '@acceptance' }, () => { }); test('error handling when searching from the frontpage', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'rust' }); - msw.db.version.create({ crate, num: '1.0.0' }); + let crate = await msw.db.crate.create({ name: 'rust' }); + await msw.db.version.create({ crate, num: '1.0.0' }); let error = HttpResponse.json({}, { status: 500 }); await msw.worker.use(http.get('/api/v1/crates', () => error)); @@ -131,8 +131,8 @@ test.describe('Acceptance | search', { tag: '@acceptance' }, () => { }); test('error handling when searching from the search page', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'rust' }); - msw.db.version.create({ crate, num: '1.0.0' }); + let crate = await msw.db.crate.create({ name: 'rust' }); + await msw.db.version.create({ crate, num: '1.0.0' }); await page.goto('/search?q=rust'); await expect(page.locator('[data-test-crate-row]')).toHaveCount(1); @@ -220,7 +220,7 @@ test.describe('Acceptance | search', { tag: '@acceptance' }, () => { }); test('visiting without query parameters works', async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/search'); diff --git a/e2e/acceptance/settings/add-owner.spec.ts b/e2e/acceptance/settings/add-owner.spec.ts index fb975266dc3..f528ae3d64f 100644 --- a/e2e/acceptance/settings/add-owner.spec.ts +++ b/e2e/acceptance/settings/add-owner.spec.ts @@ -2,17 +2,17 @@ import { expect, test } from '@/e2e/helper'; test.describe('Acceptance | Settings | Add Owner', { tag: '@acceptance' }, () => { test.beforeEach(async ({ msw }) => { - let user1 = msw.db.user.create({ name: 'blabaere' }); - let user2 = msw.db.user.create({ name: 'thehydroimpulse' }); - let team1 = msw.db.team.create({ org: 'org', name: 'blabaere' }); - let team2 = msw.db.team.create({ org: 'org', name: 'thehydroimpulse' }); + let user1 = await msw.db.user.create({ name: 'blabaere' }); + let user2 = await msw.db.user.create({ name: 'thehydroimpulse' }); + let team1 = await msw.db.team.create({ org: 'org', name: 'blabaere' }); + let team2 = await msw.db.team.create({ org: 'org', name: 'thehydroimpulse' }); - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate, num: '1.0.0' }); - msw.db.crateOwnership.create({ crate, user: user1 }); - msw.db.crateOwnership.create({ crate, user: user2 }); - msw.db.crateOwnership.create({ crate, team: team1 }); - msw.db.crateOwnership.create({ crate, team: team2 }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.crateOwnership.create({ crate, user: user1 }); + await msw.db.crateOwnership.create({ crate, user: user2 }); + await msw.db.crateOwnership.create({ crate, team: team1 }); + await msw.db.crateOwnership.create({ crate, team: team2 }); await msw.authenticateAs(user1); }); @@ -38,7 +38,7 @@ test.describe('Acceptance | Settings | Add Owner', { tag: '@acceptance' }, () => }); test('add a new owner', async ({ page, msw }) => { - msw.db.user.create({ name: 'iain8' }); + await msw.db.user.create({ name: 'iain8' }); await page.goto('/crates/nanomsg/settings'); await page.click('[data-test-add-owner-button]'); @@ -53,8 +53,8 @@ test.describe('Acceptance | Settings | Add Owner', { tag: '@acceptance' }, () => }); test('add a team owner', async ({ page, msw }) => { - msw.db.user.create({ name: 'iain8' }); - msw.db.team.create({ org: 'rust-lang', name: 'crates-io' }); + await msw.db.user.create({ name: 'iain8' }); + await msw.db.team.create({ org: 'rust-lang', name: 'crates-io' }); await page.goto('/crates/nanomsg/settings'); await page.click('[data-test-add-owner-button]'); diff --git a/e2e/acceptance/settings/remove-owner.spec.ts b/e2e/acceptance/settings/remove-owner.spec.ts index f767ed711c4..106206e2d24 100644 --- a/e2e/acceptance/settings/remove-owner.spec.ts +++ b/e2e/acceptance/settings/remove-owner.spec.ts @@ -5,17 +5,17 @@ test.describe('Acceptance | Settings | Remove Owner', { tag: '@acceptance' }, () let user1, user2, team1, team2, crate; test.beforeEach(async ({ msw }) => { - user1 = msw.db.user.create({ name: 'blabaere' }); - user2 = msw.db.user.create({ name: 'thehydroimpulse' }); - team1 = msw.db.team.create({ org: 'org', name: 'blabaere' }); - team2 = msw.db.team.create({ org: 'org', name: 'thehydroimpulse' }); + user1 = await msw.db.user.create({ name: 'blabaere' }); + user2 = await msw.db.user.create({ name: 'thehydroimpulse' }); + team1 = await msw.db.team.create({ org: 'org', name: 'blabaere' }); + team2 = await msw.db.team.create({ org: 'org', name: 'thehydroimpulse' }); - crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate, num: '1.0.0' }); - msw.db.crateOwnership.create({ crate, user: user1 }); - msw.db.crateOwnership.create({ crate, user: user2 }); - msw.db.crateOwnership.create({ crate, team: team1 }); - msw.db.crateOwnership.create({ crate, team: team2 }); + crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.crateOwnership.create({ crate, user: user1 }); + await msw.db.crateOwnership.create({ crate, user: user2 }); + await msw.db.crateOwnership.create({ crate, team: team1 }); + await msw.db.crateOwnership.create({ crate, team: team2 }); await msw.authenticateAs(user1); }); diff --git a/e2e/acceptance/settings/settings.spec.ts b/e2e/acceptance/settings/settings.spec.ts index dbf0880ce28..cbd73147612 100644 --- a/e2e/acceptance/settings/settings.spec.ts +++ b/e2e/acceptance/settings/settings.spec.ts @@ -2,17 +2,17 @@ import { expect, test } from '@/e2e/helper'; test.describe('Acceptance | Settings', { tag: '@acceptance' }, () => { test.beforeEach(async ({ msw }) => { - let user1 = msw.db.user.create({ name: 'blabaere' }); - let user2 = msw.db.user.create({ name: 'thehydroimpulse' }); - let team1 = msw.db.team.create({ org: 'org', name: 'blabaere' }); - let team2 = msw.db.team.create({ org: 'org', name: 'thehydroimpulse' }); + let user1 = await msw.db.user.create({ name: 'blabaere' }); + let user2 = await msw.db.user.create({ name: 'thehydroimpulse' }); + let team1 = await msw.db.team.create({ org: 'org', name: 'blabaere' }); + let team2 = await msw.db.team.create({ org: 'org', name: 'thehydroimpulse' }); - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate, num: '1.0.0' }); - msw.db.crateOwnership.create({ crate, user: user1 }); - msw.db.crateOwnership.create({ crate, user: user2 }); - msw.db.crateOwnership.create({ crate, team: team1 }); - msw.db.crateOwnership.create({ crate, team: team2 }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.crateOwnership.create({ crate, user: user1 }); + await msw.db.crateOwnership.create({ crate, user: user2 }); + await msw.db.crateOwnership.create({ crate, team: team1 }); + await msw.db.crateOwnership.create({ crate, team: team2 }); await msw.authenticateAs(user1); }); diff --git a/e2e/acceptance/sudo.spec.ts b/e2e/acceptance/sudo.spec.ts index 6503488bd6c..c60b23915c0 100644 --- a/e2e/acceptance/sudo.spec.ts +++ b/e2e/acceptance/sudo.spec.ts @@ -3,7 +3,7 @@ import { format } from 'date-fns/format'; test.describe('Acceptance | sudo', { tag: '@acceptance' }, () => { async function prepare(msw, { isAdmin = false } = {}) { - let user = msw.db.user.create({ + let user = await msw.db.user.create({ login: 'johnnydee', name: 'John Doe', email: 'john@doe.com', @@ -11,12 +11,12 @@ test.describe('Acceptance | sudo', { tag: '@acceptance' }, () => { isAdmin, }); - let crate = msw.db.crate.create({ + let crate = await msw.db.crate.create({ name: 'foo', newest_version: '0.1.0', }); - let version = msw.db.version.create({ + let version = await msw.db.version.create({ crate, num: '0.1.0', }); @@ -117,14 +117,14 @@ test.describe('Acceptance | sudo', { tag: '@acceptance' }, () => { await yankButton.click(); // Verify backend state after yanking - version = msw.db.version.findFirst({ where: { id: { equals: version.id } } }); + version = msw.db.version.findFirst(q => q.where({ id: version.id })); expect(version.yanked, 'The version should be yanked').toBe(true); await expect(unyankButton).toBeVisible(); await unyankButton.click(); // Verify backend state after unyanking - version = msw.db.version.findFirst({ where: { id: { equals: version.id } } }); + version = msw.db.version.findFirst(q => q.where({ id: version.id })); expect(version.yanked, 'The version should be unyanked').toBe(false); await expect(yankButton).toBeVisible(); diff --git a/e2e/acceptance/support.spec.ts b/e2e/acceptance/support.spec.ts index 5c810498d38..ba12b2df8fa 100644 --- a/e2e/acceptance/support.spec.ts +++ b/e2e/acceptance/support.spec.ts @@ -2,8 +2,8 @@ import { test, expect } from '@/e2e/helper'; test.describe('Acceptance | support page', { tag: '@acceptance' }, () => { test.beforeEach(async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate, num: '0.6.0' }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate, num: '0.6.0' }); // mock `window.open()` await page.addInitScript(() => { diff --git a/e2e/acceptance/team-page.spec.ts b/e2e/acceptance/team-page.spec.ts index 24c4c47e6e7..c75175dfb02 100644 --- a/e2e/acceptance/team-page.spec.ts +++ b/e2e/acceptance/team-page.spec.ts @@ -3,7 +3,7 @@ import { loadFixtures } from '@crates-io/msw/fixtures'; test.describe('Acceptance | team page', { tag: '@acceptance' }, () => { test.beforeEach(async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/teams/github:org:thehydroimpulse'); }); diff --git a/e2e/acceptance/token-invites.spec.ts b/e2e/acceptance/token-invites.spec.ts index a1cec381125..9d91757d8ee 100644 --- a/e2e/acceptance/token-invites.spec.ts +++ b/e2e/acceptance/token-invites.spec.ts @@ -36,11 +36,11 @@ test.describe('Acceptance | /accept-invite/:token', { tag: '@acceptance' }, () = }); test('shows success for known token', async ({ page, msw, percy }) => { - let inviter = msw.db.user.create(); - let invitee = msw.db.user.create(); - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate }); - let invite = msw.db.crateOwnerInvitation.create({ crate, invitee, inviter }); + let inviter = await msw.db.user.create(); + let invitee = await msw.db.user.create(); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate }); + let invite = await msw.db.crateOwnerInvitation.create({ crate, invitee, inviter }); await page.goto(`/accept-invite/${invite.token}`); await expect(page).toHaveURL(`/accept-invite/${invite.token}`); diff --git a/e2e/acceptance/user-page.spec.ts b/e2e/acceptance/user-page.spec.ts index 636dc455af6..1b265c2cf1d 100644 --- a/e2e/acceptance/user-page.spec.ts +++ b/e2e/acceptance/user-page.spec.ts @@ -3,7 +3,7 @@ import { loadFixtures } from '@crates-io/msw/fixtures'; test.describe('Acceptance | user page', { tag: '@acceptance' }, () => { test.beforeEach(async ({ page, msw }) => { - loadFixtures(msw.db); + await loadFixtures(msw.db); await page.goto('/users/thehydroimpulse'); }); diff --git a/e2e/acceptance/versions.spec.ts b/e2e/acceptance/versions.spec.ts index 622b56a9e71..d04bd128e98 100644 --- a/e2e/acceptance/versions.spec.ts +++ b/e2e/acceptance/versions.spec.ts @@ -9,11 +9,11 @@ test.describe('Acceptance | crate versions page', { tag: '@acceptance' }, () => sha: 'abcdef1234567890', }; - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' }); - msw.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' }); - msw.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' }); - msw.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01', trustpub_data: trustpubData }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' }); + await msw.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' }); + await msw.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' }); + await msw.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01', trustpub_data: trustpubData }); await page.goto('/crates/nanomsg/versions'); await expect(page).toHaveURL('/crates/nanomsg/versions'); @@ -33,16 +33,16 @@ test.describe('Acceptance | crate versions page', { tag: '@acceptance' }, () => }); test('shows correct release tracks label after yanking/unyanking', async ({ page, msw, percy }) => { - let user = msw.db.user.create(); + let user = await msw.db.user.create(); await msw.authenticateAs(user); - let crate = msw.db.crate.create({ name: 'nanomsg' }); - msw.db.crateOwnership.create({ crate, user }); + let crate = await msw.db.crate.create({ name: 'nanomsg' }); + await msw.db.crateOwnership.create({ crate, user }); - msw.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' }); - msw.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' }); - msw.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' }); - msw.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); + await msw.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' }); + await msw.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' }); + await msw.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' }); + await msw.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' }); await page.goto('/crates/nanomsg/versions'); await expect(page).toHaveURL('/crates/nanomsg/versions'); diff --git a/e2e/bugs/11772.spec.ts b/e2e/bugs/11772.spec.ts index e6c38593a92..442a1c5956f 100644 --- a/e2e/bugs/11772.spec.ts +++ b/e2e/bugs/11772.spec.ts @@ -1,14 +1,14 @@ import { test, expect } from '@/e2e/helper'; test.describe('Bug #11772', { tag: '@bugs' }, () => { - function prepare(msw: any) { + async function prepare(msw: any) { // Create a crate that will appear in "New Crates" section - let newCrate = msw.db.crate.create({ name: 'test-crate' }); - msw.db.version.create({ crate: newCrate, num: '1.2.3' }); + let newCrate = await msw.db.crate.create({ name: 'test-crate' }); + await msw.db.version.create({ crate: newCrate, num: '1.2.3' }); } test('crate versions should remain correct after navigating back from crate details', async ({ page, msw }) => { - prepare(msw); + await prepare(msw); // Visit homepage await page.goto('/'); @@ -33,8 +33,8 @@ test.describe('Bug #11772', { tag: '@bugs' }, () => { test('crates with actual v0.0.0 versions should display correctly', async ({ page, msw }) => { // Create a crate with an actual v0.0.0 version - let zeroCrate = msw.db.crate.create({ name: 'test-zero-crate' }); - msw.db.version.create({ crate: zeroCrate, num: '0.0.0' }); + let zeroCrate = await msw.db.crate.create({ name: 'test-zero-crate' }); + await msw.db.version.create({ crate: zeroCrate, num: '0.0.0' }); // Visit homepage await page.goto('/'); diff --git a/e2e/bugs/4506.spec.ts b/e2e/bugs/4506.spec.ts index a689793a327..175950aa4e2 100644 --- a/e2e/bugs/4506.spec.ts +++ b/e2e/bugs/4506.spec.ts @@ -2,13 +2,13 @@ import { expect, test } from '@/e2e/helper'; test.describe('Bug #4506', { tag: '@bugs' }, () => { test.beforeEach(async ({ msw }) => { - let noStd = msw.db.keyword.create({ keyword: 'no-std' }); + let noStd = await msw.db.keyword.create({ keyword: 'no-std' }); - let foo = msw.db.crate.create({ name: 'foo', keywords: [noStd] }); - msw.db.version.create({ crate: foo }); + let foo = await msw.db.crate.create({ name: 'foo', keywords: [noStd] }); + await msw.db.version.create({ crate: foo }); - let bar = msw.db.crate.create({ name: 'bar', keywords: [noStd] }); - msw.db.version.create({ crate: bar }); + let bar = await msw.db.crate.create({ name: 'bar', keywords: [noStd] }); + await msw.db.version.create({ crate: bar }); }); test('is fixed', async ({ page }) => { diff --git a/e2e/helper.ts b/e2e/helper.ts index b768b7f375f..6e346d25ffb 100644 --- a/e2e/helper.ts +++ b/e2e/helper.ts @@ -58,12 +58,12 @@ export const test = base.extend({ msw: async ({ page }, use) => { const worker = await createWorker(page, handlers); const authenticateAs = async function (user) { - db.mswSession.create({ user }); + await db.mswSession.create({ user }); await page.addInitScript("globalThis.localStorage.setItem('isLoggedIn', '1')"); }; await use({ worker, db, authenticateAs }); - db.reset(); + await db.reset(); worker.resetCookieStore(); }, ember: [ diff --git a/e2e/routes/category.spec.ts b/e2e/routes/category.spec.ts index 04a1636337b..7c719b371c7 100644 --- a/e2e/routes/category.spec.ts +++ b/e2e/routes/category.spec.ts @@ -23,7 +23,7 @@ test.describe('Route | category', { tag: '@routes' }, () => { }); test('updates the search field when the categories route is accessed', async ({ page, msw }) => { - msw.db.category.create({ category: 'foo' }); + await msw.db.category.create({ category: 'foo' }); const searchInput = page.locator('[data-test-search-input]'); await page.goto('/'); diff --git a/e2e/routes/crate/delete.spec.ts b/e2e/routes/crate/delete.spec.ts index c5ac3a0d7ec..b8d892edfb7 100644 --- a/e2e/routes/crate/delete.spec.ts +++ b/e2e/routes/crate/delete.spec.ts @@ -4,18 +4,18 @@ import { http, HttpResponse } from 'msw'; test.describe('Route: crate.delete', { tag: '@routes' }, () => { async function prepare(msw) { - let user = msw.db.user.create(); + let user = await msw.db.user.create(); - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate }); - msw.db.crateOwnership.create({ crate, user }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate }); + await msw.db.crateOwnership.create({ crate, user }); await msw.authenticateAs(user); } test('unauthenticated', async ({ msw, page }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate }); await page.goto('/crates/foo/delete'); await expect(page).toHaveURL('/crates/foo/delete'); @@ -24,13 +24,13 @@ test.describe('Route: crate.delete', { tag: '@routes' }, () => { }); test('not an owner', async ({ msw, page }) => { - let user1 = msw.db.user.create(); + let user1 = await msw.db.user.create(); await msw.authenticateAs(user1); - let user2 = msw.db.user.create(); - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate }); - msw.db.crateOwnership.create({ crate, user: user2 }); + let user2 = await msw.db.user.create(); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate }); + await msw.db.crateOwnership.create({ crate, user: user2 }); await page.goto('/crates/foo/delete'); await expect(page).toHaveURL('/crates/foo/delete'); @@ -57,8 +57,8 @@ test.describe('Route: crate.delete', { tag: '@routes' }, () => { let message = 'Crate foo has been successfully deleted.'; await expect(page.locator('[data-test-notification-message="success"]')).toHaveText(message); - let crate = msw.db.crate.findFirst({ where: { name: { equals: 'foo' } } }); - expect(crate).toBeNull(); + let crate = msw.db.crate.findFirst(q => q.where({ name: 'foo' })); + expect(crate).toBeUndefined(); }); test('loading state', async ({ page, msw }) => { diff --git a/e2e/routes/crate/range.spec.ts b/e2e/routes/crate/range.spec.ts index b63e1aed4a9..ab2c1381935 100644 --- a/e2e/routes/crate/range.spec.ts +++ b/e2e/routes/crate/range.spec.ts @@ -3,11 +3,11 @@ import { http, HttpResponse } from 'msw'; test.describe('Route | crate.range', { tag: '@routes' }, () => { test('happy path', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0' }); - msw.db.version.create({ crate, num: '1.1.0' }); - msw.db.version.create({ crate, num: '1.2.0' }); - msw.db.version.create({ crate, num: '1.2.3' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.version.create({ crate, num: '1.1.0' }); + await msw.db.version.create({ crate, num: '1.2.0' }); + await msw.db.version.create({ crate, num: '1.2.3' }); await page.goto('/crates/foo/range/^1.1.0'); await expect(page).toHaveURL(`/crates/foo/1.2.3`); @@ -17,11 +17,11 @@ test.describe('Route | crate.range', { tag: '@routes' }, () => { }); test('happy path with tilde range', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0' }); - msw.db.version.create({ crate, num: '1.1.0' }); - msw.db.version.create({ crate, num: '1.1.1' }); - msw.db.version.create({ crate, num: '1.2.0' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.version.create({ crate, num: '1.1.0' }); + await msw.db.version.create({ crate, num: '1.1.1' }); + await msw.db.version.create({ crate, num: '1.2.0' }); await page.goto('/crates/foo/range/~1.1.0'); await expect(page).toHaveURL(`/crates/foo/1.1.1`); @@ -31,11 +31,11 @@ test.describe('Route | crate.range', { tag: '@routes' }, () => { }); test('happy path with cargo style and', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.4.2' }); - msw.db.version.create({ crate, num: '1.3.4' }); - msw.db.version.create({ crate, num: '1.3.3' }); - msw.db.version.create({ crate, num: '1.2.6' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.4.2' }); + await msw.db.version.create({ crate, num: '1.3.4' }); + await msw.db.version.create({ crate, num: '1.3.3' }); + await msw.db.version.create({ crate, num: '1.2.6' }); await page.goto('/crates/foo/range/>=1.3.0, <1.4.0'); await expect(page).toHaveURL(`/crates/foo/1.3.4`); @@ -45,11 +45,11 @@ test.describe('Route | crate.range', { tag: '@routes' }, () => { }); test('ignores yanked versions if possible', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0' }); - msw.db.version.create({ crate, num: '1.1.0' }); - msw.db.version.create({ crate, num: '1.1.1' }); - msw.db.version.create({ crate, num: '1.2.0', yanked: true }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.version.create({ crate, num: '1.1.0' }); + await msw.db.version.create({ crate, num: '1.1.1' }); + await msw.db.version.create({ crate, num: '1.2.0', yanked: true }); await page.goto('/crates/foo/range/^1.0.0'); await expect(page).toHaveURL(`/crates/foo/1.1.1`); @@ -59,11 +59,11 @@ test.describe('Route | crate.range', { tag: '@routes' }, () => { }); test('falls back to yanked version if necessary', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0', yanked: true }); - msw.db.version.create({ crate, num: '1.1.0', yanked: true }); - msw.db.version.create({ crate, num: '1.1.1', yanked: true }); - msw.db.version.create({ crate, num: '2.0.0' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0', yanked: true }); + await msw.db.version.create({ crate, num: '1.1.0', yanked: true }); + await msw.db.version.create({ crate, num: '1.1.1', yanked: true }); + await msw.db.version.create({ crate, num: '2.0.0' }); await page.goto('/crates/foo/range/^1.0.0'); await expect(page).toHaveURL(`/crates/foo/1.1.1`); @@ -93,11 +93,11 @@ test.describe('Route | crate.range', { tag: '@routes' }, () => { }); test('shows an error page if no match found', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0' }); - msw.db.version.create({ crate, num: '1.1.0' }); - msw.db.version.create({ crate, num: '1.1.1' }); - msw.db.version.create({ crate, num: '2.0.0' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.version.create({ crate, num: '1.1.0' }); + await msw.db.version.create({ crate, num: '1.1.1' }); + await msw.db.version.create({ crate, num: '2.0.0' }); await page.goto('/crates/foo/range/^3'); await expect(page).toHaveURL('/crates/foo/range/%5E3'); @@ -108,8 +108,8 @@ test.describe('Route | crate.range', { tag: '@routes' }, () => { }); test('shows an error page if versions fail to load', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '3.2.1' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '3.2.1' }); msw.worker.use(http.get('/api/v1/crates/:crate_name/versions', () => HttpResponse.json({}, { status: 500 }))); diff --git a/e2e/routes/crate/settings.spec.ts b/e2e/routes/crate/settings.spec.ts index 2726941aeaa..82c09b66d9f 100644 --- a/e2e/routes/crate/settings.spec.ts +++ b/e2e/routes/crate/settings.spec.ts @@ -4,11 +4,11 @@ import { http, HttpResponse } from 'msw'; test.describe('Route | crate.settings', { tag: '@routes' }, () => { async function prepare(msw) { - let user = msw.db.user.create(); + let user = await msw.db.user.create(); - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate }); - msw.db.crateOwnership.create({ crate, user }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate }); + await msw.db.crateOwnership.create({ crate, user }); await msw.authenticateAs(user); @@ -16,8 +16,8 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { } test('unauthenticated', async ({ msw, page }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate }); await page.goto('/crates/foo/settings'); await expect(page).toHaveURL('/crates/foo/settings'); @@ -26,13 +26,13 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { }); test('not an owner', async ({ msw, page }) => { - let user1 = msw.db.user.create(); + let user1 = await msw.db.user.create(); await msw.authenticateAs(user1); - let user2 = msw.db.user.create(); - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate }); - msw.db.crateOwnership.create({ crate, user: user2 }); + let user2 = await msw.db.user.create(); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate }); + await msw.db.crateOwnership.create({ crate, user: user2 }); await page.goto('/crates/foo/settings'); await expect(page).toHaveURL('/crates/foo/settings'); @@ -63,7 +63,7 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { const { crate } = await prepare(msw); // Create GitHub config - msw.db.trustpubGithubConfig.create({ + await msw.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -71,7 +71,7 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { }); // Create GitLab config - msw.db.trustpubGitlabConfig.create({ + await msw.db.trustpubGitlabConfig.create({ crate, namespace: 'johndoe', namespace_id: '1234', @@ -113,14 +113,14 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { const { crate } = await prepare(msw); // Create two GitHub configs for the crate - msw.db.trustpubGithubConfig.create({ + await msw.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', workflow_filename: 'ci.yml', }); - msw.db.trustpubGithubConfig.create({ + await msw.db.trustpubGithubConfig.create({ crate, repository_owner: 'johndoe', repository_name: 'crates.io', @@ -164,7 +164,7 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { let { crate } = await prepare(msw); // Create a GitHub config for the crate - let config = msw.db.trustpubGithubConfig.create({ + let config = await msw.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -196,14 +196,14 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { const { crate } = await prepare(msw); // Create two GitLab configs for the crate - msw.db.trustpubGitlabConfig.create({ + await msw.db.trustpubGitlabConfig.create({ crate, namespace: 'rust-lang', project: 'crates.io', workflow_filepath: '.gitlab-ci.yml', }); - msw.db.trustpubGitlabConfig.create({ + await msw.db.trustpubGitlabConfig.create({ crate, namespace: 'johndoe', namespace_id: '1234', @@ -250,7 +250,7 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { let { crate } = await prepare(msw); // Create a GitLab config for the crate - let config = msw.db.trustpubGitlabConfig.create({ + let config = await msw.db.trustpubGitlabConfig.create({ crate, namespace: 'rust-lang', namespace_id: '1234', @@ -289,9 +289,13 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { test('hidden when flag is true and configs exist', async ({ msw, page }) => { const { crate } = await prepare(msw); - msw.db.crate.update({ where: { id: { equals: crate.id } }, data: { trustpubOnly: true } }); + await msw.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.trustpubOnly = true; + }, + }); - msw.db.trustpubGithubConfig.create({ + await msw.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -305,7 +309,11 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { test('shown when flag is true but no configs exist', async ({ msw, page, percy }) => { const { crate } = await prepare(msw); - msw.db.crate.update({ where: { id: { equals: crate.id } }, data: { trustpubOnly: true } }); + await msw.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.trustpubOnly = true; + }, + }); await page.goto('/crates/foo/settings'); @@ -319,7 +327,11 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { test('disappears when checkbox is unchecked', async ({ msw, page }) => { const { crate } = await prepare(msw); - msw.db.crate.update({ where: { id: { equals: crate.id } }, data: { trustpubOnly: true } }); + await msw.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.trustpubOnly = true; + }, + }); await page.goto('/crates/foo/settings'); @@ -332,9 +344,13 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { test('appears when last config is removed', async ({ msw, page }) => { const { crate } = await prepare(msw); - msw.db.crate.update({ where: { id: { equals: crate.id } }, data: { trustpubOnly: true } }); + await msw.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.trustpubOnly = true; + }, + }); - msw.db.trustpubGithubConfig.create({ + await msw.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -363,7 +379,7 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { test('visible when GitHub configs exist', async ({ msw, page }) => { const { crate } = await prepare(msw); - msw.db.trustpubGithubConfig.create({ + await msw.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -379,7 +395,7 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { test('visible when GitLab configs exist', async ({ msw, page }) => { const { crate } = await prepare(msw); - msw.db.trustpubGitlabConfig.create({ + await msw.db.trustpubGitlabConfig.create({ crate, namespace: 'rust-lang', project: 'crates.io', @@ -394,7 +410,11 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { test('visible when flag is true but no configs', async ({ msw, page }) => { const { crate } = await prepare(msw); - msw.db.crate.update({ where: { id: { equals: crate.id } }, data: { trustpubOnly: true } }); + await msw.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.trustpubOnly = true; + }, + }); await page.goto('/crates/foo/settings'); @@ -404,7 +424,11 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { test('stays visible after disabling when no configs exist', async ({ msw, page }) => { const { crate } = await prepare(msw); - msw.db.crate.update({ where: { id: { equals: crate.id } }, data: { trustpubOnly: true } }); + await msw.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.trustpubOnly = true; + }, + }); await page.goto('/crates/foo/settings'); @@ -427,7 +451,7 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { test('enabling trustpub_only', async ({ msw, page }) => { const { crate } = await prepare(msw); - msw.db.trustpubGithubConfig.create({ + await msw.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -437,19 +461,23 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { await page.goto('/crates/foo/settings'); await expect(page.locator('[data-test-trustpub-only-checkbox] [data-test-checkbox]')).not.toBeChecked(); - expect(msw.db.crate.findFirst({ where: { name: { equals: crate.name } } })?.trustpubOnly).toBe(false); + expect(msw.db.crate.findFirst(q => q.where({ name: crate.name }))?.trustpubOnly).toBe(false); await page.click('[data-test-trustpub-only-checkbox] [data-test-checkbox]'); await expect(page.locator('[data-test-trustpub-only-checkbox] [data-test-checkbox]')).toBeChecked(); - expect(msw.db.crate.findFirst({ where: { name: { equals: crate.name } } })?.trustpubOnly).toBe(true); + expect(msw.db.crate.findFirst(q => q.where({ name: crate.name }))?.trustpubOnly).toBe(true); }); test('disabling trustpub_only', async ({ msw, page }) => { const { crate } = await prepare(msw); - msw.db.crate.update({ where: { id: { equals: crate.id } }, data: { trustpubOnly: true } }); + await msw.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.trustpubOnly = true; + }, + }); - msw.db.trustpubGithubConfig.create({ + await msw.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', @@ -459,18 +487,18 @@ test.describe('Route | crate.settings', { tag: '@routes' }, () => { await page.goto('/crates/foo/settings'); await expect(page.locator('[data-test-trustpub-only-checkbox] [data-test-checkbox]')).toBeChecked(); - expect(msw.db.crate.findFirst({ where: { name: { equals: crate.name } } })?.trustpubOnly).toBe(true); + expect(msw.db.crate.findFirst(q => q.where({ name: crate.name }))?.trustpubOnly).toBe(true); await page.click('[data-test-trustpub-only-checkbox] [data-test-checkbox]'); await expect(page.locator('[data-test-trustpub-only-checkbox] [data-test-checkbox]')).not.toBeChecked(); - expect(msw.db.crate.findFirst({ where: { name: { equals: crate.name } } })?.trustpubOnly).toBe(false); + expect(msw.db.crate.findFirst(q => q.where({ name: crate.name }))?.trustpubOnly).toBe(false); }); test('loading and error state', async ({ msw, page }) => { const { crate } = await prepare(msw); - msw.db.trustpubGithubConfig.create({ + await msw.db.trustpubGithubConfig.create({ crate, repository_owner: 'rust-lang', repository_name: 'crates.io', diff --git a/e2e/routes/crate/settings/new-trusted-publisher.spec.ts b/e2e/routes/crate/settings/new-trusted-publisher.spec.ts index 6db89074225..77289ba46e0 100644 --- a/e2e/routes/crate/settings/new-trusted-publisher.spec.ts +++ b/e2e/routes/crate/settings/new-trusted-publisher.spec.ts @@ -4,11 +4,11 @@ import { defer } from '@/e2e/deferred'; test.describe('Route | crate.settings.new-trusted-publisher', { tag: '@routes' }, () => { async function prepare(msw) { - let user = msw.db.user.create(); + let user = await msw.db.user.create(); - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate }); - msw.db.crateOwnership.create({ crate, user }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate }); + await msw.db.crateOwnership.create({ crate, user }); await msw.authenticateAs(user); @@ -18,7 +18,7 @@ test.describe('Route | crate.settings.new-trusted-publisher', { tag: '@routes' } test('unauthenticated', async ({ msw, page }) => { let { crate } = await prepare(msw); - msw.db.mswSession.deleteMany({}); + msw.db.mswSession.deleteMany(null); await page.goto(`/crates/${crate.name}/settings/new-trusted-publisher`); await expect(page).toHaveURL(`/crates/${crate.name}/settings/new-trusted-publisher`); @@ -29,7 +29,7 @@ test.describe('Route | crate.settings.new-trusted-publisher', { tag: '@routes' } test('not an owner', async ({ msw, page }) => { let { crate } = await prepare(msw); - msw.db.crateOwnership.deleteMany({}); + msw.db.crateOwnership.deleteMany(null); await page.goto(`/crates/${crate.name}/settings/new-trusted-publisher`); await expect(page).toHaveURL(`/crates/${crate.name}/settings/new-trusted-publisher`); @@ -135,9 +135,10 @@ test.describe('Route | crate.settings.new-trusted-publisher', { tag: '@routes' } test(name, async ({ msw, page }) => { let { crate } = await prepare(msw); - msw.db.crate.update({ - where: { id: { equals: crate.id } }, - data: { repository: url }, + await msw.db.crate.update(q => q.where({ id: crate.id }), { + data(c) { + c.repository = url; + }, }); await page.goto(`/crates/${crate.name}/settings/new-trusted-publisher`); @@ -153,7 +154,7 @@ test.describe('Route | crate.settings.new-trusted-publisher', { tag: '@routes' } test('happy path', async ({ msw, page, percy }) => { let { crate } = await prepare(msw); - msw.db.trustpubGithubConfig.create({ + await msw.db.trustpubGithubConfig.create({ crate, repository_owner: 'johndoe', repository_name: 'crates.io', @@ -188,14 +189,15 @@ test.describe('Route | crate.settings.new-trusted-publisher', { tag: '@routes' } await expect(page).toHaveURL(`/crates/${crate.name}/settings`); // Check that the config was created - let config = msw.db.trustpubGithubConfig.findFirst({ - where: { - repository_owner: { equals: 'rust-lang' }, - repository_name: { equals: 'crates.io' }, - workflow_filename: { equals: 'ci.yml' }, - environment: { equals: 'release' }, - }, - }); + let config = msw.db.trustpubGithubConfig.findFirst(q => + q.where( + c => + c.repository_owner === 'rust-lang' && + c.repository_name === 'crates.io' && + c.workflow_filename === 'ci.yml' && + c.environment === 'release', + ), + ); expect(config, 'Config was created').toBeDefined(); // Check that the success notification is displayed @@ -361,7 +363,7 @@ test.describe('Route | crate.settings.new-trusted-publisher', { tag: '@routes' } test('happy path', async ({ msw, page }) => { let { crate } = await prepare(msw); - msw.db.trustpubGitlabConfig.create({ + await msw.db.trustpubGitlabConfig.create({ crate, namespace: 'johndoe', project: 'crates.io', @@ -402,14 +404,15 @@ test.describe('Route | crate.settings.new-trusted-publisher', { tag: '@routes' } await expect(page).toHaveURL(`/crates/${crate.name}/settings`); // Check that the config was created - let config = msw.db.trustpubGitlabConfig.findFirst({ - where: { - namespace: { equals: 'rust-lang' }, - project: { equals: 'crates.io' }, - workflow_filepath: { equals: '.gitlab-ci.yml' }, - environment: { equals: 'production' }, - }, - }); + let config = msw.db.trustpubGitlabConfig.findFirst(q => + q.where( + c => + c.namespace === 'rust-lang' && + c.project === 'crates.io' && + c.workflow_filepath === '.gitlab-ci.yml' && + c.environment === 'production', + ), + ); expect(config, 'Config was created').toBeDefined(); // Check that the success notification is displayed diff --git a/e2e/routes/crate/version/crate-links.spec.ts b/e2e/routes/crate/version/crate-links.spec.ts index 15d74974b80..ec2536bdfa3 100644 --- a/e2e/routes/crate/version/crate-links.spec.ts +++ b/e2e/routes/crate/version/crate-links.spec.ts @@ -2,13 +2,13 @@ import { expect, test } from '@/e2e/helper'; test.describe('Route | crate.version | crate links', { tag: '@routes' }, () => { test('shows all external crate links', async ({ page, msw }) => { - let crate = msw.db.crate.create({ + let crate = await msw.db.crate.create({ name: 'foo', homepage: 'https://crates.io/', documentation: 'https://doc.rust-lang.org/cargo/getting-started/', repository: 'https://github.com/rust-lang/crates.io.git', }); - msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.version.create({ crate, num: '1.0.0' }); await page.goto('/crates/foo'); @@ -27,8 +27,8 @@ test.describe('Route | crate.version | crate links', { tag: '@routes' }, () => { }); test('shows no external crate links if none are set', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0' }); await page.goto('/crates/foo'); @@ -38,12 +38,12 @@ test.describe('Route | crate.version | crate links', { tag: '@routes' }, () => { }); test('hide the homepage link if it is the same as the repository', async ({ page, msw }) => { - let crate = msw.db.crate.create({ + let crate = await msw.db.crate.create({ name: 'foo', homepage: 'https://github.com/rust-lang/crates.io', repository: 'https://github.com/rust-lang/crates.io', }); - msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.version.create({ crate, num: '1.0.0' }); await page.goto('/crates/foo'); @@ -56,12 +56,12 @@ test.describe('Route | crate.version | crate links', { tag: '@routes' }, () => { }); test('hide the homepage link if it is the same as the repository plus `.git`', async ({ page, msw }) => { - let crate = msw.db.crate.create({ + let crate = await msw.db.crate.create({ name: 'foo', homepage: 'https://github.com/rust-lang/crates.io/', repository: 'https://github.com/rust-lang/crates.io.git', }); - msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.version.create({ crate, num: '1.0.0' }); await page.goto('/crates/foo'); diff --git a/e2e/routes/crate/version/docs-link.spec.ts b/e2e/routes/crate/version/docs-link.spec.ts index e95f5af5422..a8d82605437 100644 --- a/e2e/routes/crate/version/docs-link.spec.ts +++ b/e2e/routes/crate/version/docs-link.spec.ts @@ -3,8 +3,8 @@ import { http, HttpResponse } from 'msw'; test.describe('Route | crate.version | docs link', { tag: '@routes' }, () => { test('shows regular documentation link', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo', documentation: 'https://foo.io/docs' }); - msw.db.version.create({ crate, num: '1.0.0' }); + let crate = await msw.db.crate.create({ name: 'foo', documentation: 'https://foo.io/docs' }); + await msw.db.version.create({ crate, num: '1.0.0' }); await page.goto('/crates/foo'); await expect(page.locator('[data-test-docs-link] a')).toHaveAttribute('href', 'https://foo.io/docs'); @@ -14,8 +14,8 @@ test.describe('Route | crate.version | docs link', { tag: '@routes' }, () => { page, msw, }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0' }); let error = HttpResponse.text('not found', { status: 404 }); msw.worker.use(http.get('https://docs.rs/crate/:crate/:version/status.json', () => error)); @@ -30,8 +30,8 @@ test.describe('Route | crate.version | docs link', { tag: '@routes' }, () => { page, msw, }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0' }); let response = HttpResponse.json({ doc_status: true, @@ -47,8 +47,8 @@ test.describe('Route | crate.version | docs link', { tag: '@routes' }, () => { page, msw, }) => { - let crate = msw.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); - msw.db.version.create({ crate, num: '1.0.0' }); + let crate = await msw.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); + await msw.db.version.create({ crate, num: '1.0.0' }); let error = HttpResponse.text('not found', { status: 404 }); msw.worker.use(http.get('https://docs.rs/crate/:crate/:version/status.json', () => error)); @@ -61,8 +61,8 @@ test.describe('Route | crate.version | docs link', { tag: '@routes' }, () => { page, msw, }) => { - let crate = msw.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); - msw.db.version.create({ crate, num: '1.0.0' }); + let crate = await msw.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); + await msw.db.version.create({ crate, num: '1.0.0' }); let response = HttpResponse.json({ doc_status: true, @@ -75,8 +75,8 @@ test.describe('Route | crate.version | docs link', { tag: '@routes' }, () => { }); test('ajax errors are ignored', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); - msw.db.version.create({ crate, num: '1.0.0' }); + let crate = await msw.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); + await msw.db.version.create({ crate, num: '1.0.0' }); let error = HttpResponse.text('error', { status: 500 }); msw.worker.use(http.get('https://docs.rs/crate/:crate/:version/status.json', () => error)); @@ -86,8 +86,8 @@ test.describe('Route | crate.version | docs link', { tag: '@routes' }, () => { }); test('empty docs.rs responses are ignored', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); - msw.db.version.create({ crate, num: '0.6.2' }); + let crate = await msw.db.crate.create({ name: 'foo', documentation: 'https://docs.rs/foo/0.6.2' }); + await msw.db.version.create({ crate, num: '0.6.2' }); let response = HttpResponse.json({}); msw.worker.use(http.get('https://docs.rs/crate/:crate/:version/status.json', () => response)); diff --git a/e2e/routes/crate/version/model.spec.ts b/e2e/routes/crate/version/model.spec.ts index f7a921f9af4..3c69720e013 100644 --- a/e2e/routes/crate/version/model.spec.ts +++ b/e2e/routes/crate/version/model.spec.ts @@ -3,10 +3,10 @@ import { expect, test } from '@/e2e/helper'; test.describe('Route | crate.version | model() hook', { tag: '@routes' }, () => { test.describe('with explicit version number in the URL', () => { test('shows yanked versions', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0' }); - msw.db.version.create({ crate, num: '1.2.3', yanked: true }); - msw.db.version.create({ crate, num: '2.0.0-beta.1' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.version.create({ crate, num: '1.2.3', yanked: true }); + await msw.db.version.create({ crate, num: '2.0.0-beta.1' }); await page.goto('/crates/foo/1.2.3'); await expect(page).toHaveURL(`/crates/foo/1.2.3`); @@ -19,10 +19,10 @@ test.describe('Route | crate.version | model() hook', { tag: '@routes' }, () => }); test('shows error page for unknown versions', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0' }); - msw.db.version.create({ crate, num: '1.2.3', yanked: true }); - msw.db.version.create({ crate, num: '2.0.0-beta.1' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.version.create({ crate, num: '1.2.3', yanked: true }); + await msw.db.version.create({ crate, num: '2.0.0-beta.1' }); await page.goto('/crates/foo/2.0.0'); await expect(page).toHaveURL(`/crates/foo/2.0.0`); @@ -34,11 +34,11 @@ test.describe('Route | crate.version | model() hook', { tag: '@routes' }, () => }); test.describe('without version number in the URL', () => { test('defaults to the highest stable version', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0' }); - msw.db.version.create({ crate, num: '1.2.3', yanked: true }); - msw.db.version.create({ crate, num: '2.0.0-beta.1' }); - msw.db.version.create({ crate, num: '2.0.0' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.version.create({ crate, num: '1.2.3', yanked: true }); + await msw.db.version.create({ crate, num: '2.0.0-beta.1' }); + await msw.db.version.create({ crate, num: '2.0.0' }); await page.goto('/crates/foo'); await expect(page).toHaveURL(`/crates/foo`); @@ -51,10 +51,10 @@ test.describe('Route | crate.version | model() hook', { tag: '@routes' }, () => }); test('defaults to the highest stable version, even if there are higher prereleases', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0' }); - msw.db.version.create({ crate, num: '1.2.3', yanked: true }); - msw.db.version.create({ crate, num: '2.0.0-beta.1' }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0' }); + await msw.db.version.create({ crate, num: '1.2.3', yanked: true }); + await msw.db.version.create({ crate, num: '2.0.0-beta.1' }); await page.goto('/crates/foo'); await expect(page).toHaveURL(`/crates/foo`); @@ -67,12 +67,12 @@ test.describe('Route | crate.version | model() hook', { tag: '@routes' }, () => }); test('defaults to the highest not-yanked version', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0', yanked: true }); - msw.db.version.create({ crate, num: '1.2.3', yanked: true }); - msw.db.version.create({ crate, num: '2.0.0-beta.1' }); - msw.db.version.create({ crate, num: '2.0.0-beta.2' }); - msw.db.version.create({ crate, num: '2.0.0', yanked: true }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0', yanked: true }); + await msw.db.version.create({ crate, num: '1.2.3', yanked: true }); + await msw.db.version.create({ crate, num: '2.0.0-beta.1' }); + await msw.db.version.create({ crate, num: '2.0.0-beta.2' }); + await msw.db.version.create({ crate, num: '2.0.0', yanked: true }); await page.goto('/crates/foo'); await expect(page).toHaveURL(`/crates/foo`); @@ -85,10 +85,10 @@ test.describe('Route | crate.version | model() hook', { tag: '@routes' }, () => }); test('if there are only yanked versions, it defaults to the latest version', async ({ page, msw }) => { - let crate = msw.db.crate.create({ name: 'foo' }); - msw.db.version.create({ crate, num: '1.0.0', yanked: true }); - msw.db.version.create({ crate, num: '1.2.3', yanked: true }); - msw.db.version.create({ crate, num: '2.0.0-beta.1', yanked: true }); + let crate = await msw.db.crate.create({ name: 'foo' }); + await msw.db.version.create({ crate, num: '1.0.0', yanked: true }); + await msw.db.version.create({ crate, num: '1.2.3', yanked: true }); + await msw.db.version.create({ crate, num: '2.0.0-beta.1', yanked: true }); await page.goto('/crates/foo'); await expect(page).toHaveURL(`/crates/foo`); diff --git a/e2e/routes/me/crates.spec.ts b/e2e/routes/me/crates.spec.ts index f08109f55ec..c35a3159bdf 100644 --- a/e2e/routes/me/crates.spec.ts +++ b/e2e/routes/me/crates.spec.ts @@ -2,7 +2,7 @@ import { expect, test } from '@/e2e/helper'; test.describe('Route | me/crates', { tag: '@routes' }, () => { test('redirects to user profile page', async ({ page, msw }) => { - let user = msw.db.user.create({ login: 'johnnydee' }); + let user = await msw.db.user.create({ login: 'johnnydee' }); await msw.authenticateAs(user); await page.goto('/me/crates?page=2&sort=downloads'); diff --git a/e2e/routes/settings/tokens/index.spec.ts b/e2e/routes/settings/tokens/index.spec.ts index 51667fb0691..29daee8e605 100644 --- a/e2e/routes/settings/tokens/index.spec.ts +++ b/e2e/routes/settings/tokens/index.spec.ts @@ -2,7 +2,7 @@ import { expect, test } from '@/e2e/helper'; test.describe('/settings/tokens', { tag: '@routes' }, () => { test('reloads all tokens from the server', async ({ page, msw }) => { - let user = msw.db.user.create({ + let user = await msw.db.user.create({ login: 'johnnydee', name: 'John Doe', email: 'john@doe.com', @@ -11,7 +11,7 @@ test.describe('/settings/tokens', { tag: '@routes' }, () => { await msw.authenticateAs(user); - msw.db.apiToken.create({ user, name: 'token-1' }); + await msw.db.apiToken.create({ user, name: 'token-1' }); await page.goto('/settings/tokens/new'); await expect(page).toHaveURL('/settings/tokens/new'); @@ -30,7 +30,7 @@ test.describe('/settings/tokens', { tag: '@routes' }, () => { }); test('scope formatting', async ({ page, msw }) => { - let user = msw.db.user.create({ + let user = await msw.db.user.create({ login: 'johnnydee', name: 'John Doe', email: 'john@doe.com', @@ -39,7 +39,7 @@ test.describe('/settings/tokens', { tag: '@routes' }, () => { await msw.authenticateAs(user); - msw.db.apiToken.create({ + await msw.db.apiToken.create({ user, endpointScopes: ['publish-new', 'publish-update', 'yank'], crateScopes: ['serde', 'serde-*', 'serde_*'], diff --git a/e2e/routes/settings/tokens/new.spec.ts b/e2e/routes/settings/tokens/new.spec.ts index d2a319650ea..f6abfebb1c9 100644 --- a/e2e/routes/settings/tokens/new.spec.ts +++ b/e2e/routes/settings/tokens/new.spec.ts @@ -4,7 +4,7 @@ import { http, HttpResponse } from 'msw'; test.describe('/settings/tokens/new', { tag: '@routes' }, () => { async function prepare(msw) { - let user = msw.db.user.create({ + let user = await msw.db.user.create({ login: 'johnnydee', name: 'John Doe', email: 'john@doe.com', @@ -44,7 +44,7 @@ test.describe('/settings/tokens/new', { tag: '@routes' }, () => { await page.click('[data-test-scope="publish-update"]'); await page.click('[data-test-generate]'); - let token = msw.db.apiToken.findFirst({ where: { name: { equals: 'token-name' } } }); + let token = msw.db.apiToken.findFirst(q => q.where({ name: 'token-name' })); expect(token, 'API token has been created in the backend database').toBeTruthy(); expect(token.name).toBe('token-name'); expect(token.expiredAt).toBe(null); @@ -133,7 +133,7 @@ test.describe('/settings/tokens/new', { tag: '@routes' }, () => { await page.click('[data-test-generate]'); - let token = msw.db.apiToken.findFirst({ where: { name: { equals: 'token-name' } } }); + let token = msw.db.apiToken.findFirst(q => q.where({ name: 'token-name' })); expect(token, 'API token has been created in the backend database').toBeTruthy(); expect(token.name).toBe('token-name'); expect(token.crateScopes).toEqual(['serde-*', 'serde']); @@ -172,7 +172,7 @@ test.describe('/settings/tokens/new', { tag: '@routes' }, () => { await page.click('[data-test-scope="publish-update"]'); await page.click('[data-test-generate]'); - let token = msw.db.apiToken.findFirst({ where: { name: { equals: 'token-name' } } }); + let token = msw.db.apiToken.findFirst(q => q.where({ name: 'token-name' })); expect(token, 'API token has been created in the backend database').toBeTruthy(); expect(token.name).toBe('token-name'); expect(token.expiredAt.slice(0, 10)).toBe('2017-12-20'); @@ -212,7 +212,7 @@ test.describe('/settings/tokens/new', { tag: '@routes' }, () => { await page.click('[data-test-generate]'); - let token = msw.db.apiToken.findFirst({ where: { name: { equals: 'token-name' } } }); + let token = msw.db.apiToken.findFirst(q => q.where({ name: 'token-name' })); expect(token, 'API token has been created in the backend database').toBeTruthy(); expect(token.name).toBe('token-name'); expect(token.expiredAt.slice(0, 10)).toBe('2024-05-04'); @@ -295,7 +295,7 @@ test.describe('/settings/tokens/new', { tag: '@routes' }, () => { test('prefill with the exist token', async ({ page, msw }) => { let { user } = await prepare(msw); - msw.db.apiToken.create({ + await msw.db.apiToken.create({ user: user, id: 1, name: 'foo', @@ -320,7 +320,7 @@ test.describe('/settings/tokens/new', { tag: '@routes' }, () => { ); await page.click('[data-test-generate]'); - let newToken = msw.db.apiToken.findFirst({ where: { name: { equals: 'foo' } } }); + let newToken = msw.db.apiToken.findFirst(q => q.where({ name: 'foo' })); expect(newToken, 'New API token has been created in the backend database').toBeTruthy(); await expect(page).toHaveURL('/settings/tokens'); @@ -348,7 +348,7 @@ test.describe('/settings/tokens/new', { tag: '@routes' }, () => { await page.click('[data-test-scope="trusted-publishing"]'); await page.click('[data-test-generate]'); - let token = msw.db.apiToken.findFirst({ where: { name: { equals: 'trusted-publishing-token' } } }); + let token = msw.db.apiToken.findFirst(q => q.where({ name: 'trusted-publishing-token' })); expect(token, 'API token has been created in the backend database').toBeTruthy(); expect(token.name).toBe('trusted-publishing-token'); expect(token.expiredAt).toBe(null);