diff --git a/.github/workflows/on-pullrequest.yml b/.github/workflows/on-pullrequest.yml index e9c2c20d..4f6f0711 100644 --- a/.github/workflows/on-pullrequest.yml +++ b/.github/workflows/on-pullrequest.yml @@ -150,13 +150,10 @@ jobs: matrix: tests: [ - { - type: "Unit", - command: "npm run test:unit:coverage -- --ci", - }, + { type: "Unit", command: "npm run test:unit:coverage:ci" }, { type: "Integration", - command: "npm run test:integration -- --ci ", + command: "npm run test:integration -- --ci", }, ] @@ -190,6 +187,13 @@ jobs: if: ${{ steps.modules-cache.outputs.cache-hit != 'true' }} run: npm install + - name: Jest cache + id: cache-jest + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 #v3.0.11 + with: + path: /tmp/jest_rt + key: ${{ runner.os }}-jest-${{ hashFiles('**/package-lock.json') }} + - name: Configure postgres if: ${{ matrix.tests.type != 'Unit' }} run: | @@ -251,6 +255,13 @@ jobs: - name: Install required dependencies run: npm install -D cross-env + - name: Jest cache + id: cache-jest + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 #v3.0.11 + with: + path: /tmp/jest_rt + key: ${{ runner.os }}-jest-${{ hashFiles('**/package-lock.json') }} + - name: Create .env file run: | touch .env diff --git a/Meadowlark-js/.vscode/launch.json b/Meadowlark-js/.vscode/launch.json index 42bd9012..3394f62c 100644 --- a/Meadowlark-js/.vscode/launch.json +++ b/Meadowlark-js/.vscode/launch.json @@ -40,6 +40,17 @@ "console": "integratedTerminal", "sourceMaps": true }, + { + "type": "node", + "name": "vscode-jest-tests", + "request": "launch", + "console": "integratedTerminal", + "program": "${workspaceRoot}/node_modules/jest-cli/bin/jest.js", + "args": [ + "jest", + "--runInBand", + ] + }, { "type": "node", "name": "MongoDb Integration Tests", diff --git a/Meadowlark-js/backends/meadowlark-mongodb-backend/test/middleware/SecurityMiddleware.test.ts b/Meadowlark-js/backends/meadowlark-mongodb-backend/test/middleware/SecurityMiddleware.test.ts index 69cec0de..94d5f476 100644 --- a/Meadowlark-js/backends/meadowlark-mongodb-backend/test/middleware/SecurityMiddleware.test.ts +++ b/Meadowlark-js/backends/meadowlark-mongodb-backend/test/middleware/SecurityMiddleware.test.ts @@ -3,7 +3,7 @@ // The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. // See the LICENSE and NOTICES files in the project root for more information. -import { FrontendRequest, FrontendResponse, newFrontendRequest, newFrontendResponse } from '@edfi/meadowlark-core'; +import { FrontendRequest, FrontendResponse, newFrontendRequest, newFrontendResponseSuccess } from '@edfi/meadowlark-core'; import { newFrontendRequestMiddleware } from '@edfi/meadowlark-core/src/handler/FrontendRequest'; import { newPathComponents } from '@edfi/meadowlark-core/src/model/PathComponents'; import { securityMiddleware } from '../../src/security/SecurityMiddleware'; @@ -13,7 +13,7 @@ jest.setTimeout(40000); describe('given the upsert where response already posted', () => { let result; - const mongoClienttMock = {}; + const mongoClientMock = {}; const frontendRequest: FrontendRequest = { ...newFrontendRequest(), @@ -24,13 +24,10 @@ describe('given the upsert where response already posted', () => { }, }; - const frontendResponse: FrontendResponse = { - ...newFrontendResponse(), - statusCode: 200, - }; + const frontendResponse: FrontendResponse = newFrontendResponseSuccess(); beforeAll(async () => { - result = await securityMiddleware({ frontendRequest, frontendResponse }, mongoClienttMock as any); + result = await securityMiddleware({ frontendRequest, frontendResponse }, mongoClientMock as any); }); it('should return the original arguments without modification', async () => { @@ -49,7 +46,7 @@ describe('given the upsert where response already posted', () => { describe('given the upsert where authorization strategy type is different than OWNERSHIP_BASED', () => { let result; - const mongoClienttMock = {}; + const mongoClientMock = {}; const frontendResponse: any = null; const frontendRequest: FrontendRequest = { @@ -62,7 +59,7 @@ describe('given the upsert where authorization strategy type is different than O }; beforeAll(async () => { - result = await securityMiddleware({ frontendRequest, frontendResponse }, mongoClienttMock as any); + result = await securityMiddleware({ frontendRequest, frontendResponse }, mongoClientMock as any); }); it('should return the original arguments without modification', async () => { @@ -81,7 +78,7 @@ describe('given the upsert where authorization strategy type is different than O describe('given the upsert where AuthorizationStrategy type is equal to OWNERSHIP_BASED and SecurityResult equal to ACCESS_APPROVED', () => { let result; - const mongoClienttMock = {}; + const mongoClientMock = {}; const frontendResponse: any = null; const frontendRequest: FrontendRequest = { @@ -102,7 +99,7 @@ describe('given the upsert where AuthorizationStrategy type is equal to OWNERSHI beforeAll(async () => { jest.spyOn(OwnershipSecurity, 'rejectByOwnershipSecurity').mockResolvedValueOnce('ACCESS_APPROVED'); - result = await securityMiddleware({ frontendRequest, frontendResponse }, mongoClienttMock as any); + result = await securityMiddleware({ frontendRequest, frontendResponse }, mongoClientMock as any); }); it('should return the original arguments without modification', async () => { @@ -126,7 +123,7 @@ describe('given the upsert where AuthorizationStrategy type is equal to OWNERSHI describe('given the upsert where AuthorizationStrategy type is equal to OWNERSHIP_BASED and SecurityResult equal to NOT_APPLICABLE', () => { let result; - const mongoClienttMock = {}; + const mongoClientMock = {}; const frontendResponse: any = null; const frontendRequest: FrontendRequest = { @@ -147,7 +144,7 @@ describe('given the upsert where AuthorizationStrategy type is equal to OWNERSHI beforeAll(async () => { jest.spyOn(OwnershipSecurity, 'rejectByOwnershipSecurity').mockResolvedValueOnce('NOT_APPLICABLE'); - result = await securityMiddleware({ frontendRequest, frontendResponse }, mongoClienttMock as any); + result = await securityMiddleware({ frontendRequest, frontendResponse }, mongoClientMock as any); }); it('should return the original arguments without modification', async () => { @@ -171,7 +168,7 @@ describe('given the upsert where AuthorizationStrategy type is equal to OWNERSHI describe('given the upsert where AuthorizationStrategy type is equal to OWNERSHIP_BASED and SecurityResult equal to UNKNOWN_FAILURE', () => { let result; - const mongoClienttMock = {}; + const mongoClientMock = {}; const frontendResponse: any = null; const frontendRequest: FrontendRequest = { @@ -192,7 +189,7 @@ describe('given the upsert where AuthorizationStrategy type is equal to OWNERSHI beforeAll(async () => { jest.spyOn(OwnershipSecurity, 'rejectByOwnershipSecurity').mockResolvedValueOnce('UNKNOWN_FAILURE'); - result = await securityMiddleware({ frontendRequest, frontendResponse }, mongoClienttMock as any); + result = await securityMiddleware({ frontendRequest, frontendResponse }, mongoClientMock as any); }); it('should respond with an internal server error code', async () => { @@ -220,7 +217,7 @@ describe('given the upsert where AuthorizationStrategy type is equal to OWNERSHI describe('given the upsert where AuthorizationStrategy type is equal to OWNERSHIP_BASED and SecurityResult equal to ACCESS_DENIED', () => { let result; - const mongoClienttMock = {}; + const mongoClientMock = {}; const frontendResponse: any = null; const frontendRequest: FrontendRequest = { @@ -241,7 +238,7 @@ describe('given the upsert where AuthorizationStrategy type is equal to OWNERSHI beforeAll(async () => { jest.spyOn(OwnershipSecurity, 'rejectByOwnershipSecurity').mockResolvedValueOnce('ACCESS_DENIED'); - result = await securityMiddleware({ frontendRequest, frontendResponse }, mongoClienttMock as any); + result = await securityMiddleware({ frontendRequest, frontendResponse }, mongoClientMock as any); }); it('should respond with a Forbidden error code', async () => { diff --git a/Meadowlark-js/backends/meadowlark-mongodb-backend/test/repository/Delete.test.ts b/Meadowlark-js/backends/meadowlark-mongodb-backend/test/repository/Delete.test.ts index a0035b82..c7b6a006 100644 --- a/Meadowlark-js/backends/meadowlark-mongodb-backend/test/repository/Delete.test.ts +++ b/Meadowlark-js/backends/meadowlark-mongodb-backend/test/repository/Delete.test.ts @@ -7,7 +7,7 @@ jest.setTimeout(40000); describe('given a transaction on a resource', () => { const retryNumberOfTimes = 2; - let mongoClienttMock = {}; + let mongoClientMock = {}; let deleteOneMock = jest.fn(); const error = { codeName: 'WriteConflict', @@ -20,7 +20,7 @@ describe('given a transaction on a resource', () => { deleteOne: deleteOneMock, } as any); - mongoClienttMock = { + mongoClientMock = { startSession: jest.fn().mockReturnValue({ withTransaction: async (cb: any) => { await cb(); @@ -44,7 +44,7 @@ describe('given a transaction on a resource', () => { describe('given that a number of retries greater than zero has been configured', () => { beforeAll(async () => { jest.spyOn(utilities.Config, 'get').mockReturnValue(retryNumberOfTimes); - result = await deleteDocumentById(newDeleteRequest(), mongoClienttMock as any); + result = await deleteDocumentById(newDeleteRequest(), mongoClientMock as any); }); it('returns error', async () => { @@ -63,7 +63,7 @@ describe('given a transaction on a resource', () => { describe('given that a number of retries equal to zero has been configured', () => { beforeAll(async () => { jest.spyOn(utilities.Config, 'get').mockReturnValue(0); - result = await deleteDocumentById(newDeleteRequest(), mongoClienttMock as any); + result = await deleteDocumentById(newDeleteRequest(), mongoClientMock as any); }); it('should not retry', () => { @@ -77,7 +77,7 @@ describe('given a transaction on a resource', () => { describe('given that a number of retries was not configured', () => { beforeAll(async () => { - result = await deleteDocumentById(newDeleteRequest(), mongoClienttMock as any); + result = await deleteDocumentById(newDeleteRequest(), mongoClientMock as any); }); it('should not retry', () => { diff --git a/Meadowlark-js/backends/meadowlark-mongodb-backend/test/repository/Update.test.ts b/Meadowlark-js/backends/meadowlark-mongodb-backend/test/repository/Update.test.ts index ec52ad68..8167a8b9 100644 --- a/Meadowlark-js/backends/meadowlark-mongodb-backend/test/repository/Update.test.ts +++ b/Meadowlark-js/backends/meadowlark-mongodb-backend/test/repository/Update.test.ts @@ -15,7 +15,7 @@ jest.setTimeout(40000); describe('given a transaction on a resource', () => { const retryNumberOfTimes = 2; - let mongoClienttMock = {}; + let mongoClientMock = {}; let replaceOneMock = jest.fn(); const error = { codeName: 'WriteConflict', @@ -29,7 +29,7 @@ describe('given a transaction on a resource', () => { updateMany: jest.fn(), } as any); - mongoClienttMock = { + mongoClientMock = { startSession: jest.fn().mockReturnValue({ withTransaction: async (cb: any) => { await cb(); @@ -57,7 +57,7 @@ describe('given a transaction on a resource', () => { beforeAll(async () => { jest.spyOn(DB, 'writeLockReferencedDocuments').mockImplementationOnce(async () => Promise.resolve()); jest.spyOn(utilities.Config, 'get').mockReturnValue(retryNumberOfTimes); - result = await updateDocumentById(newUpdateRequest(), mongoClienttMock as any); + result = await updateDocumentById(newUpdateRequest(), mongoClientMock as any); }); it('returns error', async () => { @@ -77,7 +77,7 @@ describe('given a transaction on a resource', () => { beforeAll(async () => { jest.spyOn(DB, 'writeLockReferencedDocuments').mockImplementationOnce(async () => Promise.resolve()); jest.spyOn(utilities.Config, 'get').mockReturnValue(0); - result = await updateDocumentById(newUpdateRequest(), mongoClienttMock as any); + result = await updateDocumentById(newUpdateRequest(), mongoClientMock as any); }); it('should not retry', () => { @@ -92,7 +92,7 @@ describe('given a transaction on a resource', () => { describe('given that a number of retries was not configured', () => { beforeAll(async () => { jest.spyOn(DB, 'writeLockReferencedDocuments').mockImplementationOnce(async () => Promise.resolve()); - result = await updateDocumentById(newUpdateRequest(), mongoClienttMock as any); + result = await updateDocumentById(newUpdateRequest(), mongoClientMock as any); }); it('should not retry', () => { diff --git a/Meadowlark-js/backends/meadowlark-mongodb-backend/test/repository/Upsert.test.ts b/Meadowlark-js/backends/meadowlark-mongodb-backend/test/repository/Upsert.test.ts index 20546c7b..994de4d2 100644 --- a/Meadowlark-js/backends/meadowlark-mongodb-backend/test/repository/Upsert.test.ts +++ b/Meadowlark-js/backends/meadowlark-mongodb-backend/test/repository/Upsert.test.ts @@ -7,7 +7,7 @@ jest.setTimeout(40000); describe('given a transaction on a resource', () => { const retryNumberOfTimes = 2; - let mongoClienttMock = {}; + let mongoClientMock = {}; let replaceOneMock = jest.fn(); const error = { codeName: 'WriteConflict', @@ -22,7 +22,7 @@ describe('given a transaction on a resource', () => { updateMany: jest.fn(), } as any); - mongoClienttMock = { + mongoClientMock = { startSession: jest.fn().mockReturnValue({ withTransaction: async (cb: any) => { await cb(); @@ -49,7 +49,7 @@ describe('given a transaction on a resource', () => { beforeAll(async () => { jest.spyOn(DB, 'writeLockReferencedDocuments').mockImplementationOnce(async () => Promise.resolve()); jest.spyOn(utilities.Config, 'get').mockReturnValue(retryNumberOfTimes); - result = await upsertDocument(newUpsertRequest(), mongoClienttMock as any); + result = await upsertDocument(newUpsertRequest(), mongoClientMock as any); }); it('returns error', async () => { @@ -69,7 +69,7 @@ describe('given a transaction on a resource', () => { beforeAll(async () => { jest.spyOn(DB, 'writeLockReferencedDocuments').mockImplementationOnce(async () => Promise.resolve()); jest.spyOn(utilities.Config, 'get').mockReturnValue(0); - result = await upsertDocument(newUpsertRequest(), mongoClienttMock as any); + result = await upsertDocument(newUpsertRequest(), mongoClientMock as any); }); it('should not retry', () => { @@ -84,7 +84,7 @@ describe('given a transaction on a resource', () => { describe('given that a number of retries was not configured', () => { beforeAll(async () => { jest.spyOn(DB, 'writeLockReferencedDocuments').mockImplementationOnce(async () => Promise.resolve()); - result = await upsertDocument(newUpsertRequest(), mongoClienttMock as any); + result = await upsertDocument(newUpsertRequest(), mongoClientMock as any); }); it('should not retry', () => { diff --git a/Meadowlark-js/jest.config.js b/Meadowlark-js/jest.config.js index 6cda919b..2a6d267a 100644 --- a/Meadowlark-js/jest.config.js +++ b/Meadowlark-js/jest.config.js @@ -1,5 +1,3 @@ -const { defaults: tsjPreset } = require('ts-jest/presets'); - module.exports = { projects: [ '/tests/config/unit/jest.config.js', diff --git a/Meadowlark-js/package-lock.json b/Meadowlark-js/package-lock.json index 5cfa3a83..e0c90f12 100644 --- a/Meadowlark-js/package-lock.json +++ b/Meadowlark-js/package-lock.json @@ -14,7 +14,7 @@ "devDependencies": { "@shelf/jest-mongodb": "^4.1.6", "@types/eslint": "^8.4.10", - "@types/jest": "29.2.2", + "@types/jest": "^29.4.1", "@types/node": "16.18.3", "@typescript-eslint/eslint-plugin": "5.42.0", "@typescript-eslint/parser": "5.42.0", @@ -29,16 +29,15 @@ "eslint-plugin-jasmine": "4.1.3", "eslint-plugin-json": "3.1.0", "eslint-plugin-prettier": "4.2.1", - "jest": "^29.4.3", + "jest": "^29.5.0", "jest-environment-node": "^29.2.2", - "jest-junit": "^14.0.1", "lerna": "^6.0.2", "mongodb": "^4.11.0", "pg": "^8.8.0", "pg-format": "^1.0.4", "prettier": "2.7.1", "rimraf": "^3.0.2", - "ts-jest": "^29.0.3", + "ts-jest": "^29.0.5", "ts-node": "10.9.1", "typescript": "4.8.4" } @@ -1501,6 +1500,8 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.18.6", + "resolved": "https://www.myget.org/F/ed-fi/npm/@babel/plugin-syntax-jsx/-/@babel/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha1-qP7vY7AQFQq9l/FknsKW6EmUPKA=", "dev": true, "license": "MIT", "dependencies": { @@ -1595,6 +1596,8 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.20.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@babel/plugin-syntax-typescript/-/@babel/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha1-TpoM/HachWibd6LmQtJOn2l/yMc=", "dev": true, "license": "MIT", "dependencies": { @@ -1678,6 +1681,8 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", + "resolved": "https://www.myget.org/F/ed-fi/npm/@bcoe/v8-coverage/-/@bcoe/v8-coverage-0.2.3.tgz", + "integrity": "sha1-daLotRy3WKdVPWgEpZMteqznXDk=", "dev": true, "license": "MIT" }, @@ -2037,15 +2042,17 @@ } }, "node_modules/@jest/console": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@jest/console/-/@jest/console-29.5.0.tgz", + "integrity": "sha1-WTpsXA0/dWiYNfGztGiMT4VEy1c=", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.4.3", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.4.3", - "jest-util": "^29.4.3", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", "slash": "^3.0.0" }, "engines": { @@ -2053,36 +2060,38 @@ } }, "node_modules/@jest/core": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@jest/core/-/@jest/core-29.5.0.tgz", + "integrity": "sha1-dmdLlpBEhOghRhTRcmHMSR5fHwM=", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.4.3", - "@jest/reporters": "^29.4.3", - "@jest/test-result": "^29.4.3", - "@jest/transform": "^29.4.3", - "@jest/types": "^29.4.3", + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.4.3", - "jest-config": "^29.4.3", - "jest-haste-map": "^29.4.3", - "jest-message-util": "^29.4.3", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.4.3", - "jest-resolve-dependencies": "^29.4.3", - "jest-runner": "^29.4.3", - "jest-runtime": "^29.4.3", - "jest-snapshot": "^29.4.3", - "jest-util": "^29.4.3", - "jest-validate": "^29.4.3", - "jest-watcher": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", "micromatch": "^4.0.4", - "pretty-format": "^29.4.3", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -2100,6 +2109,8 @@ }, "node_modules/@jest/core/node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://www.myget.org/F/ed-fi/npm/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4=", "dev": true, "license": "MIT", "dependencies": { @@ -2114,6 +2125,8 @@ }, "node_modules/@jest/core/node_modules/type-fest": { "version": "0.21.3", + "resolved": "https://www.myget.org/F/ed-fi/npm/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc=", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -2124,33 +2137,39 @@ } }, "node_modules/@jest/environment": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@jest/environment/-/@jest/environment-29.5.0.tgz", + "integrity": "sha1-kVLVYxfB/bGvOJxGZAunTvC7TGU=", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "^29.4.3", - "@jest/types": "^29.4.3", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-mock": "^29.4.3" + "jest-mock": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@jest/expect/-/@jest/expect-29.5.0.tgz", + "integrity": "sha1-gJUvUxayPEg/vKQ2POgir3nDj7o=", "dev": true, "license": "MIT", "dependencies": { - "expect": "^29.4.3", - "jest-snapshot": "^29.4.3" + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@jest/expect-utils/-/@jest/expect-utils-29.5.0.tgz", + "integrity": "sha1-90+ta24g+SRYLcjsvyy4AP5DoDY=", "dev": true, "license": "MIT", "dependencies": { @@ -2161,45 +2180,51 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@jest/fake-timers/-/@jest/fake-timers-29.5.0.tgz", + "integrity": "sha1-1NCewyhrPZDGC9zWbtKNNfG03Cw=", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.4.3", + "@jest/types": "^29.5.0", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.4.3", - "jest-mock": "^29.4.3", - "jest-util": "^29.4.3" + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@jest/globals/-/@jest/globals-29.5.0.tgz", + "integrity": "sha1-YWbAv8N0xYJoZ3U50MGB+cGDMpg=", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.4.3", - "@jest/expect": "^29.4.3", - "@jest/types": "^29.4.3", - "jest-mock": "^29.4.3" + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@jest/reporters/-/@jest/reporters-29.5.0.tgz", + "integrity": "sha1-mF39kSkM143a5JFLp5Iby6vorJs=", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.4.3", - "@jest/test-result": "^29.4.3", - "@jest/transform": "^29.4.3", - "@jest/types": "^29.4.3", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@jridgewell/trace-mapping": "^0.3.15", "@types/node": "*", "chalk": "^4.0.0", @@ -2212,9 +2237,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.4.3", - "jest-util": "^29.4.3", - "jest-worker": "^29.4.3", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2245,6 +2270,8 @@ }, "node_modules/@jest/source-map": { "version": "29.4.3", + "resolved": "https://www.myget.org/F/ed-fi/npm/@jest/source-map/-/@jest/source-map-29.4.3.tgz", + "integrity": "sha1-/40Fy//4ddSnkatnm0Mz30eVHSA=", "dev": true, "license": "MIT", "dependencies": { @@ -2257,12 +2284,14 @@ } }, "node_modules/@jest/test-result": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@jest/test-result/-/@jest/test-result-29.5.0.tgz", + "integrity": "sha1-fIVqbKhPRcw2kmpOnGtX8Zc/FAg=", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.4.3", - "@jest/types": "^29.4.3", + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -2271,13 +2300,15 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@jest/test-sequencer/-/@jest/test-sequencer-29.5.0.tgz", + "integrity": "sha1-NNfYLTCBq9Uj293AOKPdy59tPMQ=", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^29.4.3", + "@jest/test-result": "^29.5.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.4.3", + "jest-haste-map": "^29.5.0", "slash": "^3.0.0" }, "engines": { @@ -2285,21 +2316,23 @@ } }, "node_modules/@jest/transform": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@jest/transform/-/@jest/transform-29.5.0.tgz", + "integrity": "sha1-z5yHLQll8MvTLxRYqkSisZiLAPk=", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.4.3", + "@jest/types": "^29.5.0", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.4.3", + "jest-haste-map": "^29.5.0", "jest-regex-util": "^29.4.3", - "jest-util": "^29.4.3", + "jest-util": "^29.5.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -2310,7 +2343,9 @@ } }, "node_modules/@jest/types": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@jest/types/-/@jest/types-29.5.0.tgz", + "integrity": "sha1-9Z75sDHO2DBHxnAycA2MgH1uFZM=", "dev": true, "license": "MIT", "dependencies": { @@ -5601,6 +5636,8 @@ }, "node_modules/@shelf/jest-mongodb": { "version": "4.1.7", + "resolved": "https://www.myget.org/F/ed-fi/npm/@shelf/jest-mongodb/-/@shelf/jest-mongodb-4.1.7.tgz", + "integrity": "sha1-1HRurp2nCmbp3JYNG+76B5eewno=", "dev": true, "license": "MIT", "dependencies": { @@ -5632,6 +5669,8 @@ }, "node_modules/@sinonjs/commons": { "version": "2.0.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@sinonjs/commons/-/@sinonjs/commons-2.0.0.tgz", + "integrity": "sha1-/UylsGNVQwfoMntFZL1W07c5JKM=", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5640,6 +5679,8 @@ }, "node_modules/@sinonjs/fake-timers": { "version": "10.0.2", + "resolved": "https://www.myget.org/F/ed-fi/npm/@sinonjs/fake-timers/-/@sinonjs/fake-timers-10.0.2.tgz", + "integrity": "sha1-0QVJ7R9CPYBjnFKLbH9aEBd0fQw=", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5684,6 +5725,8 @@ }, "node_modules/@types/babel__core": { "version": "7.20.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/@types/babel__core/-/@types/babel__core-7.20.0.tgz", + "integrity": "sha1-YbxaTK5QXOmOHjbFRF5L7gYNiJE=", "dev": true, "license": "MIT", "dependencies": { @@ -5696,6 +5739,8 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.4", + "resolved": "https://www.myget.org/F/ed-fi/npm/@types/babel__generator/-/@types/babel__generator-7.6.4.tgz", + "integrity": "sha1-HyDOTFsZkLN5ALY/BQGC0owkObc=", "dev": true, "license": "MIT", "dependencies": { @@ -5704,6 +5749,8 @@ }, "node_modules/@types/babel__template": { "version": "7.4.1", + "resolved": "https://www.myget.org/F/ed-fi/npm/@types/babel__template/-/@types/babel__template-7.4.1.tgz", + "integrity": "sha1-PRpI/Z1sDt/Vby/1eNrtSPNsiWk=", "dev": true, "license": "MIT", "dependencies": { @@ -5780,6 +5827,8 @@ }, "node_modules/@types/graceful-fs": { "version": "4.1.6", + "resolved": "https://www.myget.org/F/ed-fi/npm/@types/graceful-fs/-/@types/graceful-fs-4.1.6.tgz", + "integrity": "sha1-4UsldqHCUCa38C7eHeO4TDoe/q4=", "dev": true, "license": "MIT", "dependencies": { @@ -5813,7 +5862,9 @@ } }, "node_modules/@types/jest": { - "version": "29.2.2", + "version": "29.4.1", + "resolved": "https://www.myget.org/F/ed-fi/npm/@types/jest/-/@types/jest-29.4.1.tgz", + "integrity": "sha1-12y9B+WiTA9OhsLA+e2eTtM688g=", "dev": true, "license": "MIT", "dependencies": { @@ -5882,6 +5933,8 @@ }, "node_modules/@types/prettier": { "version": "2.7.2", + "resolved": "https://www.myget.org/F/ed-fi/npm/@types/prettier/-/@types/prettier-2.7.2.tgz", + "integrity": "sha1-bCMkZBzEugUKjHELKyUbN3WB+/A=", "dev": true, "license": "MIT" }, @@ -5938,6 +5991,8 @@ }, "node_modules/@types/tmp": { "version": "0.2.3", + "resolved": "https://www.myget.org/F/ed-fi/npm/@types/tmp/-/@types/tmp-0.2.3.tgz", + "integrity": "sha1-kIv7ETQZ/WpCJzZ0wAmU1AkCwWU=", "dev": true, "license": "MIT" }, @@ -6664,6 +6719,8 @@ }, "node_modules/async-mutex": { "version": "0.3.2", + "resolved": "https://www.myget.org/F/ed-fi/npm/async-mutex/-/async-mutex-0.3.2.tgz", + "integrity": "sha1-FIXtpb2hsOx8jfGsLoFXV60YMd8=", "dev": true, "license": "MIT", "dependencies": { @@ -6750,14 +6807,16 @@ } }, "node_modules/babel-jest": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/babel-jest/-/babel-jest-29.5.0.tgz", + "integrity": "sha1-P+PdsQkZjnixyI+evezV5PwvUKU=", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "^29.4.3", + "@jest/transform": "^29.5.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.4.3", + "babel-preset-jest": "^29.5.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -6785,7 +6844,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha1-qX20N5NvRB7BlpkMlzjUuIU4YYo=", "dev": true, "license": "MIT", "dependencies": { @@ -6821,11 +6882,13 @@ } }, "node_modules/babel-preset-jest": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha1-V7yMyICXr3/2patZ0c0p1SpZFuI=", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "^29.4.3", + "babel-plugin-jest-hoist": "^29.5.0", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -7007,6 +7070,8 @@ }, "node_modules/bser": { "version": "2.1.1", + "resolved": "https://www.myget.org/F/ed-fi/npm/bser/-/bser-2.1.1.tgz", + "integrity": "sha1-5nh9og7OnQeZhTPP2d5vXDj0vAU=", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7269,6 +7334,8 @@ }, "node_modules/char-regex": { "version": "1.0.2", + "resolved": "https://www.myget.org/F/ed-fi/npm/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha1-10Q1giYhf5ge1Y9Hmx1rzClUXc8=", "dev": true, "license": "MIT", "engines": { @@ -7340,6 +7407,8 @@ }, "node_modules/cjs-module-lexer": { "version": "1.2.2", + "resolved": "https://www.myget.org/F/ed-fi/npm/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha1-n4S6MkSlEvOlTlJ36O70xImGTkA=", "dev": true, "license": "MIT" }, @@ -7469,6 +7538,8 @@ }, "node_modules/co": { "version": "4.6.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true, "license": "MIT", "engines": { @@ -7478,6 +7549,8 @@ }, "node_modules/collect-v8-coverage": { "version": "1.0.1", + "resolved": "https://www.myget.org/F/ed-fi/npm/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha1-zCyOlPwYu9/+ZNZTRXDIpnOyf1k=", "dev": true, "license": "MIT" }, @@ -7575,6 +7648,8 @@ }, "node_modules/commondir": { "version": "1.0.1", + "resolved": "https://www.myget.org/F/ed-fi/npm/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true, "license": "MIT" }, @@ -8118,6 +8193,8 @@ }, "node_modules/detect-newline": { "version": "3.1.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha1-V29d/GOuGhkv8ZLYrTr2MImRtlE=", "dev": true, "license": "MIT", "engines": { @@ -8155,6 +8232,8 @@ }, "node_modules/diff-sequences": { "version": "29.4.3", + "resolved": "https://www.myget.org/F/ed-fi/npm/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha1-kxS8H6vgkmf/7KnLr8RX2EmaE/I=", "dev": true, "license": "MIT", "engines": { @@ -8873,21 +8952,25 @@ }, "node_modules/exit": { "version": "0.1.2", + "resolved": "https://www.myget.org/F/ed-fi/npm/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/expect": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/expect/-/expect-29.5.0.tgz", + "integrity": "sha1-aMBQkVbLKgrbiGXUE7E37qrmgvc=", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "^29.4.3", + "@jest/expect-utils": "^29.5.0", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.4.3", - "jest-message-util": "^29.4.3", - "jest-util": "^29.4.3" + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -9045,6 +9128,8 @@ }, "node_modules/fb-watchman": { "version": "2.0.2", + "resolved": "https://www.myget.org/F/ed-fi/npm/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha1-6VJO5rXHfp5QAa8PhfOtu4YjJVw=", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9053,6 +9138,8 @@ }, "node_modules/fd-slicer": { "version": "1.1.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "dev": true, "license": "MIT", "dependencies": { @@ -9143,6 +9230,8 @@ }, "node_modules/find-cache-dir": { "version": "3.3.2", + "resolved": "https://www.myget.org/F/ed-fi/npm/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha1-swxbbv8HMHMa6pu9nb7L2AJW1ks=", "dev": true, "license": "MIT", "dependencies": { @@ -9351,6 +9440,21 @@ "dev": true, "license": "ISC" }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://www.myget.org/F/ed-fi/npm/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "dev": true, @@ -9861,6 +9965,8 @@ }, "node_modules/html-escaper": { "version": "2.0.2", + "resolved": "https://www.myget.org/F/ed-fi/npm/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha1-39YAJ9o2o238viNiYsAKWCJoFFM=", "dev": true, "license": "MIT" }, @@ -10346,6 +10452,8 @@ }, "node_modules/is-generator-fn": { "version": "2.1.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha1-fRQK3DiarzARqPKipM+m+q3/sRg=", "dev": true, "license": "MIT", "engines": { @@ -10652,6 +10760,8 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha1-dRj+UupE3jcvRgp2tezan/tz2KY=", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -10665,6 +10775,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://www.myget.org/F/ed-fi/npm/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha1-iV86cJ/PujTG3lpCk5Ai8+Q1hVE=", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -10678,6 +10790,8 @@ }, "node_modules/istanbul-reports": { "version": "3.1.5", + "resolved": "https://www.myget.org/F/ed-fi/npm/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha1-zJpqslyyVlmBDkeF7Z2ft0JXi64=", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -10706,14 +10820,16 @@ } }, "node_modules/jest": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest/-/jest-29.5.0.tgz", + "integrity": "sha1-91FXYi9c561TAo8viIirU+Hx8k4=", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "^29.4.3", - "@jest/types": "^29.4.3", + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", "import-local": "^3.0.2", - "jest-cli": "^29.4.3" + "jest-cli": "^29.5.0" }, "bin": { "jest": "bin/jest.js" @@ -10731,7 +10847,9 @@ } }, "node_modules/jest-changed-files": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha1-6IeG3Ki/KqiZ7Er3ZE4W2dz5sj4=", "dev": true, "license": "MIT", "dependencies": { @@ -10743,27 +10861,30 @@ } }, "node_modules/jest-circus": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-circus/-/jest-circus-29.5.0.tgz", + "integrity": "sha1-tZJpiUSedb/w1ZlEuuCDydf7cxc=", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.4.3", - "@jest/expect": "^29.4.3", - "@jest/test-result": "^29.4.3", - "@jest/types": "^29.4.3", + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.4.3", - "jest-matcher-utils": "^29.4.3", - "jest-message-util": "^29.4.3", - "jest-runtime": "^29.4.3", - "jest-snapshot": "^29.4.3", - "jest-util": "^29.4.3", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", "p-limit": "^3.1.0", - "pretty-format": "^29.4.3", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -10772,20 +10893,22 @@ } }, "node_modules/jest-cli": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-cli/-/jest-cli-29.5.0.tgz", + "integrity": "sha1-s0wgptNZaPPuR6dDf/jlPghrSmc=", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "^29.4.3", - "@jest/test-result": "^29.4.3", - "@jest/types": "^29.4.3", + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.4.3", - "jest-util": "^29.4.3", - "jest-validate": "^29.4.3", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -10806,6 +10929,8 @@ }, "node_modules/jest-cli/node_modules/cliui": { "version": "8.0.1", + "resolved": "https://www.myget.org/F/ed-fi/npm/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha1-DASwddsCy/5g3I5s8vVIaxo2CKo=", "dev": true, "license": "ISC", "dependencies": { @@ -10819,11 +10944,15 @@ }, "node_modules/jest-cli/node_modules/emoji-regex": { "version": "8.0.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", "dev": true, "license": "MIT" }, "node_modules/jest-cli/node_modules/string-width": { "version": "4.2.3", + "resolved": "https://www.myget.org/F/ed-fi/npm/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", "dev": true, "license": "MIT", "dependencies": { @@ -10837,6 +10966,8 @@ }, "node_modules/jest-cli/node_modules/wrap-ansi": { "version": "7.0.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", "dev": true, "license": "MIT", "dependencies": { @@ -10853,6 +10984,8 @@ }, "node_modules/jest-cli/node_modules/yargs": { "version": "17.7.1", + "resolved": "https://www.myget.org/F/ed-fi/npm/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha1-NKd2RSAdGo/FITrOeHwiDqu9CWc=", "dev": true, "license": "MIT", "dependencies": { @@ -10870,6 +11003,8 @@ }, "node_modules/jest-cli/node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://www.myget.org/F/ed-fi/npm/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha1-kJa87r+ZDSG7MfqVFuDt4pSnfTU=", "dev": true, "license": "ISC", "engines": { @@ -10877,30 +11012,32 @@ } }, "node_modules/jest-config": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-config/-/jest-config-29.5.0.tgz", + "integrity": "sha1-PMly+uyMiq6prhWMaUVBt583SNo=", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.4.3", - "@jest/types": "^29.4.3", - "babel-jest": "^29.4.3", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.4.3", - "jest-environment-node": "^29.4.3", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.4.3", - "jest-runner": "^29.4.3", - "jest-util": "^29.4.3", - "jest-validate": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.4.3", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -10922,6 +11059,8 @@ }, "node_modules/jest-config/node_modules/deepmerge": { "version": "4.3.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/deepmerge/-/deepmerge-4.3.0.tgz", + "integrity": "sha1-ZUkYk+xHdW1EcZrlIODiYJIztZs=", "dev": true, "license": "MIT", "engines": { @@ -10930,6 +11069,8 @@ }, "node_modules/jest-config/node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80=", "dev": true, "license": "MIT", "dependencies": { @@ -10946,14 +11087,16 @@ } }, "node_modules/jest-diff": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha1-4Ng6WOtUUdzB+mGxw+5Oj1opDWM=", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.4.3" + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -10961,6 +11104,8 @@ }, "node_modules/jest-docblock": { "version": "29.4.3", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha1-kFBaqJUUocfc7qwRI9955BRjbqg=", "dev": true, "license": "MIT", "dependencies": { @@ -10971,31 +11116,35 @@ } }, "node_modules/jest-each": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-each/-/jest-each-29.5.0.tgz", + "integrity": "sha1-/G5wFPg+rGjiK3GVWY3oVUwuXAY=", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.4.3", + "@jest/types": "^29.5.0", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", - "jest-util": "^29.4.3", - "pretty-format": "^29.4.3" + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha1-8XIZ0PDMDmjgcnxYt5LAQOMyyWc=", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.4.3", - "@jest/fake-timers": "^29.4.3", - "@jest/types": "^29.4.3", + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-mock": "^29.4.3", - "jest-util": "^29.4.3" + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -11010,19 +11159,21 @@ } }, "node_modules/jest-haste-map": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-haste-map/-/jest-haste-map-29.5.0.tgz", + "integrity": "sha1-ab1n3JAS1uJyPyCpRQmelysulN4=", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.4.3", + "@jest/types": "^29.5.0", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", - "jest-util": "^29.4.3", - "jest-worker": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -11033,66 +11184,50 @@ "fsevents": "^2.3.2" } }, - "node_modules/jest-junit": { - "version": "14.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "mkdirp": "^1.0.4", - "strip-ansi": "^6.0.1", - "uuid": "^8.3.2", - "xml": "^1.0.1" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/jest-junit/node_modules/uuid": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/jest-leak-detector": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", + "integrity": "sha1-z0veqWFccrrEo6e6fnkw+cBhDIw=", "dev": true, "license": "MIT", "dependencies": { "jest-get-type": "^29.4.3", - "pretty-format": "^29.4.3" + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha1-2Vevf4wGksVFNmZwViGtSrwsWcU=", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.4.3", + "jest-diff": "^29.5.0", "jest-get-type": "^29.4.3", - "pretty-format": "^29.4.3" + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha1-H3dsrDrKMyq43S47QWJUNQhckA4=", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.4.3", + "@jest/types": "^29.5.0", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.4.3", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -11101,13 +11236,15 @@ } }, "node_modules/jest-mock": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha1-JuIXK8xx2LAZUIH/HxRqx+FRiu0=", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.4.3", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-util": "^29.4.3" + "jest-util": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -11115,6 +11252,8 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha1-kwsVRhZNStWTfVVA5xHU041MrS4=", "dev": true, "license": "MIT", "engines": { @@ -11138,16 +11277,18 @@ } }, "node_modules/jest-resolve": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-resolve/-/jest-resolve-29.5.0.tgz", + "integrity": "sha1-sFPMla0dX2Mn8KyKrp+YeVR17Nw=", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.4.3", + "jest-haste-map": "^29.5.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.4.3", - "jest-validate": "^29.4.3", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -11157,41 +11298,45 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", + "integrity": "sha1-8OoplVmW9JeIv3CZYFKqmOe+/uQ=", "dev": true, "license": "MIT", "dependencies": { "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.4.3" + "jest-snapshot": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-runner/-/jest-runner-29.5.0.tgz", + "integrity": "sha1-alfCgusO90l3jURMHXWManaTtvg=", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.4.3", - "@jest/environment": "^29.4.3", - "@jest/test-result": "^29.4.3", - "@jest/transform": "^29.4.3", - "@jest/types": "^29.4.3", + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.4.3", - "jest-haste-map": "^29.4.3", - "jest-leak-detector": "^29.4.3", - "jest-message-util": "^29.4.3", - "jest-resolve": "^29.4.3", - "jest-runtime": "^29.4.3", - "jest-util": "^29.4.3", - "jest-watcher": "^29.4.3", - "jest-worker": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -11200,30 +11345,32 @@ } }, "node_modules/jest-runtime": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-runtime/-/jest-runtime-29.5.0.tgz", + "integrity": "sha1-yD+UPuDB2n65H6GBsIEevVmwNCA=", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.4.3", - "@jest/fake-timers": "^29.4.3", - "@jest/globals": "^29.4.3", + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.4.3", - "@jest/transform": "^29.4.3", - "@jest/types": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.4.3", - "jest-message-util": "^29.4.3", - "jest-mock": "^29.4.3", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.4.3", - "jest-snapshot": "^29.4.3", - "jest-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -11232,7 +11379,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-snapshot/-/jest-snapshot-29.5.0.tgz", + "integrity": "sha1-ycHOAzHltjzUROL5WlWnO4Sx6M4=", "dev": true, "license": "MIT", "dependencies": { @@ -11242,23 +11391,22 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.4.3", - "@jest/transform": "^29.4.3", - "@jest/types": "^29.4.3", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/babel__traverse": "^7.0.6", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.4.3", + "expect": "^29.5.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.4.3", + "jest-diff": "^29.5.0", "jest-get-type": "^29.4.3", - "jest-haste-map": "^29.4.3", - "jest-matcher-utils": "^29.4.3", - "jest-message-util": "^29.4.3", - "jest-util": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.4.3", + "pretty-format": "^29.5.0", "semver": "^7.3.5" }, "engines": { @@ -11266,11 +11414,13 @@ } }, "node_modules/jest-util": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha1-JKTT2S/DnOkEJTEbI8J6bg7xa48=", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.4.3", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -11282,16 +11432,18 @@ } }, "node_modules/jest-validate": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-validate/-/jest-validate-29.5.0.tgz", + "integrity": "sha1-jlqPNheNQORxONwAhmpfO9mRb/w=", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.4.3", + "@jest/types": "^29.5.0", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.4.3" + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -11299,6 +11451,8 @@ }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha1-VoW5XrIJrJwMF3Rnd4ychN9Yupo=", "dev": true, "license": "MIT", "engines": { @@ -11309,17 +11463,19 @@ } }, "node_modules/jest-watcher": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha1-z38PlJgoumXdu7RcdDo4Kk2RE2M=", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^29.4.3", - "@jest/types": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.4.3", + "jest-util": "^29.5.0", "string-length": "^4.0.1" }, "engines": { @@ -11328,6 +11484,8 @@ }, "node_modules/jest-watcher/node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://www.myget.org/F/ed-fi/npm/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4=", "dev": true, "license": "MIT", "dependencies": { @@ -11342,6 +11500,8 @@ }, "node_modules/jest-watcher/node_modules/type-fest": { "version": "0.21.3", + "resolved": "https://www.myget.org/F/ed-fi/npm/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc=", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -11352,12 +11512,14 @@ } }, "node_modules/jest-worker": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha1-va77BoEb0zhNk/AJdVAU2Ky0YV0=", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", - "jest-util": "^29.4.3", + "jest-util": "^29.5.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -11367,6 +11529,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://www.myget.org/F/ed-fi/npm/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw=", "dev": true, "license": "MIT", "dependencies": { @@ -11642,6 +11806,8 @@ }, "node_modules/kleur": { "version": "3.0.3", + "resolved": "https://www.myget.org/F/ed-fi/npm/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha1-p5yezIbuHOP6YgbRIWxQHxR/wH4=", "dev": true, "license": "MIT", "engines": { @@ -12575,6 +12741,8 @@ }, "node_modules/makeerror": { "version": "1.0.12", + "resolved": "https://www.myget.org/F/ed-fi/npm/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha1-Pl3SB5qC6BLpg8xmEMSiyw6qgBo=", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -12594,6 +12762,8 @@ }, "node_modules/md5-file": { "version": "5.0.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/md5-file/-/md5-file-5.0.0.tgz", + "integrity": "sha1-5Rn2Mf7KnDnn+eoXgLY8R0UBLiA=", "dev": true, "license": "MIT", "bin": { @@ -13051,6 +13221,8 @@ }, "node_modules/mongodb-memory-server": { "version": "8.11.5", + "resolved": "https://www.myget.org/F/ed-fi/npm/mongodb-memory-server/-/mongodb-memory-server-8.11.5.tgz", + "integrity": "sha1-FIssw5D60wjWUy1pu9EFSpdQzLA=", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -13064,6 +13236,8 @@ }, "node_modules/mongodb-memory-server-core": { "version": "8.11.5", + "resolved": "https://www.myget.org/F/ed-fi/npm/mongodb-memory-server-core/-/mongodb-memory-server-core-8.11.5.tgz", + "integrity": "sha1-fLdgIsplIAQreZa7MxAWgv462+k=", "dev": true, "license": "MIT", "dependencies": { @@ -13090,6 +13264,8 @@ }, "node_modules/mongodb-memory-server-core/node_modules/camelcase": { "version": "6.3.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha1-VoW5XrIJrJwMF3Rnd4ychN9Yupo=", "dev": true, "license": "MIT", "engines": { @@ -13101,6 +13277,8 @@ }, "node_modules/mongodb-memory-server-core/node_modules/tmp": { "version": "0.2.1", + "resolved": "https://www.myget.org/F/ed-fi/npm/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha1-hFf8MDfc9HGcJRNnoa9lAO4czxQ=", "dev": true, "license": "MIT", "dependencies": { @@ -13169,6 +13347,8 @@ }, "node_modules/new-find-package-json": { "version": "2.0.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/new-find-package-json/-/new-find-package-json-2.0.0.tgz", + "integrity": "sha1-llU2OHgds1Bh81HozLTQcSa2QH0=", "dev": true, "license": "MIT", "dependencies": { @@ -13293,6 +13473,8 @@ }, "node_modules/node-int64": { "version": "0.4.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true, "license": "MIT" }, @@ -14119,6 +14301,8 @@ }, "node_modules/pend": { "version": "1.2.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true, "license": "MIT" }, @@ -14382,7 +14566,9 @@ } }, "node_modules/pretty-format": { - "version": "29.4.3", + "version": "29.5.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha1-KDE0509w4uPnIpM23g5PzpTM3lo=", "dev": true, "license": "MIT", "dependencies": { @@ -14457,6 +14643,8 @@ }, "node_modules/prompts": { "version": "2.4.2", + "resolved": "https://www.myget.org/F/ed-fi/npm/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha1-e1fnOzpIAprRDr1E90sBcipMsGk=", "dev": true, "license": "MIT", "dependencies": { @@ -14527,6 +14715,23 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.0.1", + "resolved": "https://www.myget.org/F/ed-fi/npm/pure-rand/-/pure-rand-6.0.1.tgz", + "integrity": "sha1-MSB93dFdQ/KZ/c2y9XLfZQMMGa8=", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, "node_modules/q": { "version": "1.5.1", "dev": true, @@ -15037,7 +15242,9 @@ } }, "node_modules/resolve.exports": { - "version": "2.0.0", + "version": "2.0.1", + "resolved": "https://www.myget.org/F/ed-fi/npm/resolve.exports/-/resolve.exports-2.0.1.tgz", + "integrity": "sha1-zuiEzU4/NVZg5QH6MnayfX/+WiA=", "dev": true, "license": "MIT", "engines": { @@ -15307,6 +15514,8 @@ }, "node_modules/sisteransi": { "version": "1.0.5", + "resolved": "https://www.myget.org/F/ed-fi/npm/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha1-E01oEpd1ZDfMBcoBNw06elcQde0=", "dev": true, "license": "MIT" }, @@ -15391,6 +15600,8 @@ }, "node_modules/source-map-support": { "version": "0.5.13", + "resolved": "https://www.myget.org/F/ed-fi/npm/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha1-MbJKnC5zwt6FBmwP631Edn7VKTI=", "dev": true, "license": "MIT", "dependencies": { @@ -15547,6 +15758,8 @@ }, "node_modules/string-length": { "version": "4.0.2", + "resolved": "https://www.myget.org/F/ed-fi/npm/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha1-qKjce9XBqCubPIuH4SX2aHG25Xo=", "dev": true, "license": "MIT", "dependencies": { @@ -15966,6 +16179,8 @@ }, "node_modules/tmpl": { "version": "1.0.5", + "resolved": "https://www.myget.org/F/ed-fi/npm/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha1-hoPguQK7nCDE9ybjwLafNlGMB8w=", "dev": true, "license": "BSD-3-Clause" }, @@ -16039,7 +16254,9 @@ } }, "node_modules/ts-jest": { - "version": "29.0.4", + "version": "29.0.5", + "resolved": "https://www.myget.org/F/ed-fi/npm/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha1-xVV9zsj+Q0/Li3DD4hxrFDv84GY=", "dev": true, "license": "MIT", "dependencies": { @@ -16187,6 +16404,8 @@ }, "node_modules/type-detect": { "version": "4.0.8", + "resolved": "https://www.myget.org/F/ed-fi/npm/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw=", "dev": true, "license": "MIT", "engines": { @@ -16374,6 +16593,8 @@ }, "node_modules/v8-to-istanbul": { "version": "9.1.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha1-G4PtTjl/WMhcJmpXD8JVi1/rkmU=", "dev": true, "license": "ISC", "dependencies": { @@ -16387,6 +16608,8 @@ }, "node_modules/v8-to-istanbul/node_modules/convert-source-map": { "version": "1.9.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha1-f6rmI1P7QhM2bQypg1jSLoNosF8=", "dev": true, "license": "MIT" }, @@ -16449,6 +16672,8 @@ }, "node_modules/walker": { "version": "1.0.8", + "resolved": "https://www.myget.org/F/ed-fi/npm/walker/-/walker-1.0.8.tgz", + "integrity": "sha1-vUmNtHev5XPcBBhfAR06uKjXZT8=", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -16796,11 +17021,6 @@ "node": ">=6" } }, - "node_modules/xml": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/xml2js": { "version": "0.4.23", "license": "MIT", @@ -16892,6 +17112,8 @@ }, "node_modules/yauzl": { "version": "2.10.0", + "resolved": "https://www.myget.org/F/ed-fi/npm/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dev": true, "license": "MIT", "dependencies": { diff --git a/Meadowlark-js/package.json b/Meadowlark-js/package.json index 642be5a1..68d0f974 100644 --- a/Meadowlark-js/package.json +++ b/Meadowlark-js/package.json @@ -5,7 +5,7 @@ "devDependencies": { "@shelf/jest-mongodb": "^4.1.6", "@types/eslint": "^8.4.10", - "@types/jest": "29.2.2", + "@types/jest": "^29.4.1", "@types/node": "16.18.3", "@typescript-eslint/eslint-plugin": "5.42.0", "@typescript-eslint/parser": "5.42.0", @@ -20,16 +20,15 @@ "eslint-plugin-jasmine": "4.1.3", "eslint-plugin-json": "3.1.0", "eslint-plugin-prettier": "4.2.1", - "jest": "^29.4.3", + "jest": "^29.5.0", "jest-environment-node": "^29.2.2", - "jest-junit": "^14.0.1", "lerna": "^6.0.2", "mongodb": "^4.11.0", "pg": "^8.8.0", "pg-format": "^1.0.4", "prettier": "2.7.1", "rimraf": "^3.0.2", - "ts-jest": "^29.0.3", + "ts-jest": "^29.0.5", "ts-node": "10.9.1", "typescript": "4.8.4" }, @@ -52,6 +51,7 @@ "test:integration:opensearch": "cross-env NODE_OPTIONS=--max-old-space-size=6144 LOG_LEVEL=warn jest --projects backends/meadowlark-opensearch-backend/test/config/integration --runInBand", "test:integration:postgresql": "cross-env NODE_OPTIONS=--max-old-space-size=6144 LOG_LEVEL=warn jest --projects backends/meadowlark-postgresql-backend/test/config/integration --runInBand", "test:unit:coverage": "rimraf coverage.unit/ && npm run test:unit", + "test:unit:coverage:ci": "rimraf coverage.unit/ && npm run test:unit -- --maxWorkers=2 --ci", "test:integration:coverage": "rimraf coverage.integration/ && npm run test:integration -- --collectCoverage", "test:e2e": "cross-env NODE_OPTIONS=--max-old-space-size=6144 LOG_LEVEL=warn jest --projects tests/config/e2e --runInBand", "start:local": "lerna run start:local", diff --git a/Meadowlark-js/packages/meadowlark-core/src/handler/FrontendResponse.ts b/Meadowlark-js/packages/meadowlark-core/src/handler/FrontendResponse.ts index 89b3ce61..f68919f5 100644 --- a/Meadowlark-js/packages/meadowlark-core/src/handler/FrontendResponse.ts +++ b/Meadowlark-js/packages/meadowlark-core/src/handler/FrontendResponse.ts @@ -16,3 +16,11 @@ export function newFrontendResponse(): FrontendResponse { body: {}, }; } + +export function newFrontendResponseSuccess(): FrontendResponse { + return { + statusCode: 200, + headers: {}, + body: {}, + }; +} diff --git a/Meadowlark-js/packages/meadowlark-core/src/index.ts b/Meadowlark-js/packages/meadowlark-core/src/index.ts index 350bc19c..0256564e 100644 --- a/Meadowlark-js/packages/meadowlark-core/src/index.ts +++ b/Meadowlark-js/packages/meadowlark-core/src/index.ts @@ -31,7 +31,7 @@ export type { MissingIdentity } from './model/DocumentIdentity'; export type { FrontendRequest, Headers } from './handler/FrontendRequest'; export { newFrontendRequest, newFrontendRequestMiddleware } from './handler/FrontendRequest'; export type { FrontendResponse } from './handler/FrontendResponse'; -export { newFrontendResponse } from './handler/FrontendResponse'; +export { newFrontendResponse, newFrontendResponseSuccess } from './handler/FrontendResponse'; export { meadowlarkIdForDocumentIdentity, generateDocumentUuid } from './model/DocumentIdentity'; export { documentIdForDocumentReference } from './model/DocumentReference'; export type { DocumentInfo } from './model/DocumentInfo'; diff --git a/Meadowlark-js/packages/meadowlark-core/test/ConfigHelper.ts b/Meadowlark-js/packages/meadowlark-core/test/ConfigHelper.ts index aa0d65f5..64695100 100644 --- a/Meadowlark-js/packages/meadowlark-core/test/ConfigHelper.ts +++ b/Meadowlark-js/packages/meadowlark-core/test/ConfigHelper.ts @@ -43,6 +43,12 @@ export const setupMockConfiguration = (isDebug: boolean = false, disableAnonymiz return isDebug ? 'DEBUG' : 'ERROR'; case 'DISABLE_LOG_ANONYMIZATION': return disableAnonymization; + case 'MEADOWLARK_DATABASE_NAME': + return 'meadowlark-test'; + case 'MONGO_WRITE_CONCERN': + return 'mwc'; + case 'MONGO_READ_CONCERN': + return 'mrc'; default: throw new Error(`Key '${key}' not configured`); } diff --git a/Meadowlark-js/packages/meadowlark-core/test/handler/FrontendFacade.test.ts b/Meadowlark-js/packages/meadowlark-core/test/handler/FrontendFacade.test.ts index 0b410eb5..06c49495 100644 --- a/Meadowlark-js/packages/meadowlark-core/test/handler/FrontendFacade.test.ts +++ b/Meadowlark-js/packages/meadowlark-core/test/handler/FrontendFacade.test.ts @@ -7,48 +7,70 @@ import { initializeLogging } from '@edfi/meadowlark-utilities'; import { get } from '../../src/handler/FrontendFacade'; import { FrontendRequest, newFrontendRequest } from '../../src/handler/FrontendRequest'; import { setupMockConfiguration } from '../ConfigHelper'; +import * as AuthorizationMiddleware from '../../src/middleware/AuthorizationMiddleware'; +import * as PluginLoader from '../../src/plugin/PluginLoader'; +import type { MiddlewareModel } from '../../src/middleware/MiddlewareModel'; +import { NoDocumentStorePlugin } from '../../src/plugin/backend/NoDocumentStorePlugin'; const documentUuid = '2edb604f-eab0-412c-a242-508d6529214d'; -describe('given there is no resourceId in a get request', () => { - const request: FrontendRequest = { ...newFrontendRequest(), path: '/1/2/3' }; +describe('given environment is set', () => { + let middlewareMock: any; beforeAll(async () => { setupMockConfiguration(); initializeLogging(); - // Act - await get(request); + jest.spyOn(PluginLoader, 'getDocumentStore').mockReturnValue(NoDocumentStorePlugin); + }); + + afterEach(() => { + middlewareMock.mockClear(); }); afterAll(() => { jest.restoreAllMocks(); }); - it('sets the action to query', () => { - expect(request.action).toEqual('query'); - }); -}); + describe('given there is no resourceId in a get request', () => { + const frontendRequest: FrontendRequest = { ...newFrontendRequest(), path: '/1/2/3' }; -describe('given there is a resourceId in a get request', () => { - const request: FrontendRequest = { - ...newFrontendRequest(), - path: `/1/2/3/${documentUuid}`, - }; + beforeAll(async () => { + const model: MiddlewareModel = { + frontendRequest, + frontendResponse: { statusCode: 200 }, + }; - beforeAll(async () => { - setupMockConfiguration(); - initializeLogging(); + middlewareMock = jest.spyOn(AuthorizationMiddleware, 'authorize').mockResolvedValue(model); - // Act - await get(request); - }); + // Act + await get(frontendRequest); + }); - afterAll(() => { - jest.restoreAllMocks(); + it('sets the action to query', () => { + expect(frontendRequest.action).toEqual('query'); + }); }); - it('sets the action to getById', () => { - expect(request.action).toEqual('getById'); + describe('given there is a resourceId in a get request', () => { + const frontendRequest = { + ...newFrontendRequest(), + path: `/1/2/3/${documentUuid}`, + }; + + beforeAll(async () => { + const model: MiddlewareModel = { + frontendRequest, + frontendResponse: { statusCode: 200 }, + }; + + middlewareMock = jest.spyOn(AuthorizationMiddleware, 'authorize').mockResolvedValue(model); + // Act + await get(frontendRequest); + }); + + it('sets the action to getById', () => { + expect(frontendRequest.action).toEqual('getById'); + }); }); }); diff --git a/Meadowlark-js/services/meadowlark-fastify/test/ConfigHelper.ts b/Meadowlark-js/services/meadowlark-fastify/test/ConfigHelper.ts index 402064b8..a925a5f4 100644 --- a/Meadowlark-js/services/meadowlark-fastify/test/ConfigHelper.ts +++ b/Meadowlark-js/services/meadowlark-fastify/test/ConfigHelper.ts @@ -5,7 +5,7 @@ import { Config } from '@edfi/meadowlark-utilities'; -export const setupMockConfiguration = () => { +export const setupMockConfiguration = (isDebug: boolean = false, disableAnonymization: boolean = false) => { jest.spyOn(Config, 'get').mockImplementation((key: Config.ConfigKeys) => { switch (key) { case 'FASTIFY_RATE_LIMIT': @@ -18,8 +18,6 @@ export const setupMockConfiguration = () => { return true; case 'OAUTH_SERVER_ENDPOINT_FOR_OWN_TOKEN_REQUEST': return 'https://a/b/oauth/token'; - case 'LOG_LEVEL': - return 'ERROR'; case 'OAUTH_CLIENT_PROVIDED_TOKEN_CACHE_TTL': return 10; case 'OAUTH_CLIENT_PROVIDED_TOKEN_CACHE_MAX_ENTRIES': @@ -40,6 +38,16 @@ export const setupMockConfiguration = () => { return '@edfi/meadowlark-mongodb-backend'; case 'MONGO_URI': return 'mongodb://mongo:abcdefgh1!@mongo1:27017,mongo2:27018,mongo3:27019/?replicaSet=rs0'; + case 'LOG_LEVEL': + return isDebug ? 'DEBUG' : 'ERROR'; + case 'DISABLE_LOG_ANONYMIZATION': + return disableAnonymization; + case 'MEADOWLARK_DATABASE_NAME': + return 'meadowlark-test'; + case 'MONGO_WRITE_CONCERN': + return 'mwc'; + case 'MONGO_READ_CONCERN': + return 'mrc'; default: throw new Error(`Key '${key}' not configured`); } diff --git a/Meadowlark-js/services/meadowlark-fastify/test/Delete.test.ts b/Meadowlark-js/services/meadowlark-fastify/test/Delete.test.ts index 3a6fc372..de266f89 100644 --- a/Meadowlark-js/services/meadowlark-fastify/test/Delete.test.ts +++ b/Meadowlark-js/services/meadowlark-fastify/test/Delete.test.ts @@ -6,6 +6,8 @@ import type { FastifyInstance, InjectOptions } from 'fastify'; import * as MeadowlarkCore from '@edfi/meadowlark-core'; import { initializeLogging } from '@edfi/meadowlark-utilities'; +import { newFrontendResponseSuccess } from '@edfi/meadowlark-core'; +import * as MeadowlarkConnection from '../src/handler/MeadowlarkConnection'; import { buildService } from '../src/Service'; import { setupMockConfiguration } from './ConfigHelper'; @@ -24,8 +26,8 @@ describe('given a DELETE of a school by id', () => { beforeAll(async () => { setupMockConfiguration(); initializeLogging(); - - mockDeleteIt = jest.spyOn(MeadowlarkCore, 'deleteIt'); + mockDeleteIt = jest.spyOn(MeadowlarkCore, 'deleteIt').mockResolvedValue(newFrontendResponseSuccess()); + jest.spyOn(MeadowlarkConnection, 'closeMeadowlarkConnection').mockResolvedValue(); service = buildService(); await service.ready(); diff --git a/Meadowlark-js/services/meadowlark-fastify/test/Get.test.ts b/Meadowlark-js/services/meadowlark-fastify/test/Get.test.ts index 7b3022f9..122b2bd8 100644 --- a/Meadowlark-js/services/meadowlark-fastify/test/Get.test.ts +++ b/Meadowlark-js/services/meadowlark-fastify/test/Get.test.ts @@ -6,18 +6,14 @@ import type { FastifyInstance, InjectOptions } from 'fastify'; import * as MeadowlarkCore from '@edfi/meadowlark-core'; import { initializeLogging } from '@edfi/meadowlark-utilities'; +import { newFrontendResponseSuccess } from '@edfi/meadowlark-core'; +import * as MeadowlarkConnection from '../src/handler/MeadowlarkConnection'; import { buildService } from '../src/Service'; import { setupMockConfiguration } from './ConfigHelper'; jest.setTimeout(40000); -describe('given a GET of a school by id', () => { - const schoolGetByIdRequest: InjectOptions = { - method: 'GET', - url: '/local/v3.3b/ed-fi/schools/1', - headers: { authorization: 'bearer 1234', 'content-type': 'application/json' }, - }; - +describe('given a GET', () => { let mockGet: any; let service: FastifyInstance; @@ -25,50 +21,15 @@ describe('given a GET of a school by id', () => { setupMockConfiguration(); initializeLogging(); - mockGet = jest.spyOn(MeadowlarkCore, 'get'); service = buildService(); - await service.ready(); - - // Act - await service.inject(schoolGetByIdRequest); - }); - - afterAll(async () => { - await service.close(); - jest.restoreAllMocks(); - }); - - it('should send the expected FrontendRequest to Meadowlark', async () => { - expect(mockGet.mock.calls).toHaveLength(1); - const mock = mockGet.mock.calls[0][0]; - - expect(mock.body).toBeNull(); - expect(mock.headers.authorization).toBe('bearer 1234'); - expect(mock.path).toBe('/v3.3b/ed-fi/schools/1'); - expect(mock.queryParameters).toEqual({}); - }); -}); - -describe('given a GET of a school query without path ending slash', () => { - const schoolQueryRequest: InjectOptions = { - method: 'GET', - url: '/local/v3.3b/ed-fi/schools?schoolId=123', - headers: { authorization: 'bearer 1234', 'content-type': 'application/json' }, - }; - - let mockGet: any; - let service: FastifyInstance; - - beforeAll(async () => { - setupMockConfiguration(); - initializeLogging(); + mockGet = jest.spyOn(MeadowlarkCore, 'get').mockResolvedValue(newFrontendResponseSuccess()); + jest.spyOn(MeadowlarkConnection, 'closeMeadowlarkConnection').mockResolvedValue(); - mockGet = jest.spyOn(MeadowlarkCore, 'get'); - service = buildService(); await service.ready(); + }); - // Act - await service.inject(schoolQueryRequest); + afterEach(() => { + mockGet.mockClear(); }); afterAll(async () => { @@ -76,59 +37,80 @@ describe('given a GET of a school query without path ending slash', () => { jest.restoreAllMocks(); }); - it('should send the expected FrontendRequest to Meadowlark', async () => { - expect(mockGet.mock.calls).toHaveLength(1); - const mock = mockGet.mock.calls[0][0]; - - expect(mock.body).toBeNull(); - expect(mock.headers.authorization).toBe('bearer 1234'); - expect(mock.path).toBe('/v3.3b/ed-fi/schools'); - expect(mock.queryParameters).toMatchInlineSnapshot(` - { - "schoolId": "123", - } - `); - }); -}); - -describe('given a GET of a school query with path ending slash', () => { - const schoolQueryRequest: InjectOptions = { - method: 'GET', - url: '/local/v3.3b/ed-fi/schools/?schoolId=123', - headers: { authorization: 'bearer 1234', 'content-type': 'application/json' }, - }; - - let mockGet: any; - let service: FastifyInstance; - - beforeAll(async () => { - setupMockConfiguration(); - initializeLogging(); - - mockGet = jest.spyOn(MeadowlarkCore, 'get'); - service = buildService(); - await service.ready(); - - // Act - await service.inject(schoolQueryRequest); + describe('given a school by id', () => { + const schoolGetByIdRequest: InjectOptions = { + method: 'GET', + url: '/local/v3.3b/ed-fi/schools/1', + headers: { authorization: 'bearer 1234', 'content-type': 'application/json' }, + }; + + beforeAll(async () => { + // Act + await service.inject(schoolGetByIdRequest); + }); + + it('should send the expected FrontendRequest to Meadowlark', async () => { + expect(mockGet.mock.calls).toHaveLength(1); + const mock = mockGet.mock.calls[0][0]; + + expect(mock.body).toBeNull(); + expect(mock.headers.authorization).toBe('bearer 1234'); + expect(mock.path).toBe('/v3.3b/ed-fi/schools/1'); + expect(mock.queryParameters).toEqual({}); + }); }); - afterAll(async () => { - await service.close(); - jest.restoreAllMocks(); + describe('given a school query without path ending slash', () => { + const schoolQueryRequest: InjectOptions = { + method: 'GET', + url: '/local/v3.3b/ed-fi/schools?schoolId=123', + headers: { authorization: 'bearer 1234', 'content-type': 'application/json' }, + }; + + beforeAll(async () => { + // Act + await service.inject(schoolQueryRequest); + }); + + it('should send the expected FrontendRequest to Meadowlark', async () => { + expect(mockGet.mock.calls).toHaveLength(1); + const mock = mockGet.mock.calls[0][0]; + + expect(mock.body).toBeNull(); + expect(mock.headers.authorization).toBe('bearer 1234'); + expect(mock.path).toBe('/v3.3b/ed-fi/schools'); + expect(mock.queryParameters).toMatchInlineSnapshot(` + { + "schoolId": "123", + } + `); + }); }); - it('should send the expected FrontendRequest to Meadowlark', async () => { - expect(mockGet.mock.calls).toHaveLength(1); - const mock = mockGet.mock.calls[0][0]; - - expect(mock.body).toBeNull(); - expect(mock.headers.authorization).toBe('bearer 1234'); - expect(mock.path).toBe('/v3.3b/ed-fi/schools/'); - expect(mock.queryParameters).toMatchInlineSnapshot(` - { - "schoolId": "123", - } - `); + describe('given a school query with path ending slash', () => { + const schoolQueryRequest: InjectOptions = { + method: 'GET', + url: '/local/v3.3b/ed-fi/schools/?schoolId=123', + headers: { authorization: 'bearer 1234', 'content-type': 'application/json' }, + }; + + beforeAll(async () => { + // Act + await service.inject(schoolQueryRequest); + }); + + it('should send the expected FrontendRequest to Meadowlark', async () => { + expect(mockGet.mock.calls).toHaveLength(1); + const mock = mockGet.mock.calls[0][0]; + + expect(mock.body).toBeNull(); + expect(mock.headers.authorization).toBe('bearer 1234'); + expect(mock.path).toBe('/v3.3b/ed-fi/schools/'); + expect(mock.queryParameters).toMatchInlineSnapshot(` + { + "schoolId": "123", + } + `); + }); }); }); diff --git a/Meadowlark-js/services/meadowlark-fastify/test/Post.test.ts b/Meadowlark-js/services/meadowlark-fastify/test/Post.test.ts index 0af942d5..e01c1c2e 100644 --- a/Meadowlark-js/services/meadowlark-fastify/test/Post.test.ts +++ b/Meadowlark-js/services/meadowlark-fastify/test/Post.test.ts @@ -6,6 +6,8 @@ import type { FastifyInstance, InjectOptions } from 'fastify'; import * as MeadowlarkCore from '@edfi/meadowlark-core'; import { initializeLogging } from '@edfi/meadowlark-utilities'; +import { newFrontendResponseSuccess } from '@edfi/meadowlark-core'; +import * as MeadowlarkConnection from '../src/handler/MeadowlarkConnection'; import { buildService } from '../src/Service'; import { setupMockConfiguration } from './ConfigHelper'; @@ -31,7 +33,8 @@ describe('given a POST of a school', () => { setupMockConfiguration(); initializeLogging(); - mockUpsert = jest.spyOn(MeadowlarkCore, 'upsert'); + mockUpsert = jest.spyOn(MeadowlarkCore, 'upsert').mockResolvedValue(newFrontendResponseSuccess()); + jest.spyOn(MeadowlarkConnection, 'closeMeadowlarkConnection').mockResolvedValue(); service = buildService(); await service.ready(); diff --git a/Meadowlark-js/services/meadowlark-fastify/test/Put.test.ts b/Meadowlark-js/services/meadowlark-fastify/test/Put.test.ts index 8a737c5d..8e9ad920 100644 --- a/Meadowlark-js/services/meadowlark-fastify/test/Put.test.ts +++ b/Meadowlark-js/services/meadowlark-fastify/test/Put.test.ts @@ -6,8 +6,10 @@ import type { FastifyInstance, InjectOptions } from 'fastify'; import * as MeadowlarkCore from '@edfi/meadowlark-core'; import { initializeLogging } from '@edfi/meadowlark-utilities'; +import { newFrontendResponseSuccess } from '@edfi/meadowlark-core'; import { buildService } from '../src/Service'; import { setupMockConfiguration } from './ConfigHelper'; +import * as MeadowlarkConnection from '../src/handler/MeadowlarkConnection'; jest.setTimeout(40000); @@ -31,7 +33,9 @@ describe('given a PUT of a school', () => { setupMockConfiguration(); initializeLogging(); - mockUpdate = jest.spyOn(MeadowlarkCore, 'update'); + mockUpdate = jest.spyOn(MeadowlarkCore, 'update').mockResolvedValue(newFrontendResponseSuccess()); + jest.spyOn(MeadowlarkConnection, 'closeMeadowlarkConnection').mockResolvedValue(); + service = buildService(); await service.ready(); @@ -49,7 +53,6 @@ describe('given a PUT of a school', () => { expect(mockUpdate.mock.calls).toHaveLength(1); const mock = mockUpdate.mock.calls[0][0]; - expect(mock.action).toBe('updateById'); expect(mock.body).toMatchInlineSnapshot(` "{ "schoolId": 123, diff --git a/Meadowlark-js/services/meadowlark-fastify/test/authorization/CreateClient.test.ts b/Meadowlark-js/services/meadowlark-fastify/test/authorization/CreateClient.test.ts index aa63e3ab..e31e091a 100644 --- a/Meadowlark-js/services/meadowlark-fastify/test/authorization/CreateClient.test.ts +++ b/Meadowlark-js/services/meadowlark-fastify/test/authorization/CreateClient.test.ts @@ -5,6 +5,7 @@ import type { FastifyInstance, InjectOptions } from 'fastify'; import * as AuthorizationServer from '@edfi/meadowlark-authz-server'; +import * as MeadowlarkConnection from '../../src/handler/MeadowlarkConnection'; import { buildService } from '../../src/Service'; import { setupMockConfiguration } from '../ConfigHelper'; @@ -30,6 +31,7 @@ describe('given a POST to create a new client', () => { beforeAll(async () => { setupMockConfiguration(); mockUpsert = jest.spyOn(AuthorizationServer, 'createClient'); + jest.spyOn(MeadowlarkConnection, 'closeMeadowlarkConnection').mockResolvedValue(); service = buildService(); await service.ready(); diff --git a/Meadowlark-js/services/meadowlark-fastify/test/authorization/GetClientById.test.ts b/Meadowlark-js/services/meadowlark-fastify/test/authorization/GetClientById.test.ts index 9252f368..e0560fd6 100644 --- a/Meadowlark-js/services/meadowlark-fastify/test/authorization/GetClientById.test.ts +++ b/Meadowlark-js/services/meadowlark-fastify/test/authorization/GetClientById.test.ts @@ -5,6 +5,7 @@ import type { FastifyInstance, InjectOptions, LightMyRequestResponse } from 'fastify'; import * as AuthorizationServer from '@edfi/meadowlark-authz-server'; +import * as MeadowlarkConnection from '../../src/handler/MeadowlarkConnection'; import { buildService } from '../../src/Service'; import { setupMockConfiguration } from '../ConfigHelper'; @@ -32,8 +33,8 @@ describe('given a GET by ID request', () => { beforeAll(async () => { setupMockConfiguration(); - mockAuthServer = jest.spyOn(AuthorizationServer, 'getClientById'); - mockAuthServer.mockReturnValue(clientResponse); + mockAuthServer = jest.spyOn(AuthorizationServer, 'getClientById').mockResolvedValue(clientResponse); + jest.spyOn(MeadowlarkConnection, 'closeMeadowlarkConnection').mockResolvedValue(); service = buildService(); await service.ready(); diff --git a/Meadowlark-js/services/meadowlark-fastify/test/authorization/GetClients.test.ts b/Meadowlark-js/services/meadowlark-fastify/test/authorization/GetClients.test.ts index d451c4cd..aca78fc6 100644 --- a/Meadowlark-js/services/meadowlark-fastify/test/authorization/GetClients.test.ts +++ b/Meadowlark-js/services/meadowlark-fastify/test/authorization/GetClients.test.ts @@ -5,6 +5,7 @@ import type { FastifyInstance, InjectOptions, LightMyRequestResponse } from 'fastify'; import * as AuthorizationServer from '@edfi/meadowlark-authz-server'; +import * as MeadowlarkConnection from '../../src/handler/MeadowlarkConnection'; import { buildService } from '../../src/Service'; import { setupMockConfiguration } from '../ConfigHelper'; @@ -34,8 +35,8 @@ describe('given a GET request', () => { beforeAll(async () => { setupMockConfiguration(); - mockAuthServer = jest.spyOn(AuthorizationServer, 'getClients'); - mockAuthServer.mockReturnValue(clientResponse); + mockAuthServer = jest.spyOn(AuthorizationServer, 'getClients').mockResolvedValue(clientResponse); + jest.spyOn(MeadowlarkConnection, 'closeMeadowlarkConnection').mockResolvedValue(); service = buildService(); await service.ready(); diff --git a/Meadowlark-js/services/meadowlark-fastify/test/authorization/RequestToken.test.ts b/Meadowlark-js/services/meadowlark-fastify/test/authorization/RequestToken.test.ts index d2712a8e..f50ef3b0 100644 --- a/Meadowlark-js/services/meadowlark-fastify/test/authorization/RequestToken.test.ts +++ b/Meadowlark-js/services/meadowlark-fastify/test/authorization/RequestToken.test.ts @@ -5,6 +5,7 @@ import type { FastifyInstance, InjectOptions } from 'fastify'; import * as AuthorizationServer from '@edfi/meadowlark-authz-server'; +import * as MeadowlarkConnection from '../../src/handler/MeadowlarkConnection'; import { buildService } from '../../src/Service'; import { setupMockConfiguration } from '../ConfigHelper'; @@ -28,6 +29,7 @@ describe('given a POST to request a new token', () => { beforeAll(async () => { setupMockConfiguration(); mockUpsert = jest.spyOn(AuthorizationServer, 'requestToken'); + jest.spyOn(MeadowlarkConnection, 'closeMeadowlarkConnection').mockResolvedValue(); service = buildService(); await service.ready(); diff --git a/Meadowlark-js/services/meadowlark-fastify/test/authorization/UpdateClient.test.ts b/Meadowlark-js/services/meadowlark-fastify/test/authorization/UpdateClient.test.ts index 09c2c4f4..e738da9a 100644 --- a/Meadowlark-js/services/meadowlark-fastify/test/authorization/UpdateClient.test.ts +++ b/Meadowlark-js/services/meadowlark-fastify/test/authorization/UpdateClient.test.ts @@ -5,6 +5,7 @@ import type { FastifyInstance, InjectOptions } from 'fastify'; import * as AuthorizationServer from '@edfi/meadowlark-authz-server'; +import * as MeadowlarkConnection from '../../src/handler/MeadowlarkConnection'; import { buildService } from '../../src/Service'; import { setupMockConfiguration } from '../ConfigHelper'; @@ -30,6 +31,7 @@ describe('given a PUT to update a new client', () => { beforeAll(async () => { setupMockConfiguration(); mockUpsert = jest.spyOn(AuthorizationServer, 'updateClient'); + jest.spyOn(MeadowlarkConnection, 'closeMeadowlarkConnection').mockResolvedValue(); service = buildService(); await service.ready(); diff --git a/Meadowlark-js/services/meadowlark-fastify/test/authorization/VerifyToken.test.ts b/Meadowlark-js/services/meadowlark-fastify/test/authorization/VerifyToken.test.ts index 094f8175..87cb3421 100644 --- a/Meadowlark-js/services/meadowlark-fastify/test/authorization/VerifyToken.test.ts +++ b/Meadowlark-js/services/meadowlark-fastify/test/authorization/VerifyToken.test.ts @@ -5,6 +5,7 @@ import type { FastifyInstance, InjectOptions } from 'fastify'; import * as AuthorizationServer from '@edfi/meadowlark-authz-server'; +import * as MeadowlarkConnection from '../../src/handler/MeadowlarkConnection'; import { buildService } from '../../src/Service'; import { setupMockConfiguration } from '../ConfigHelper'; @@ -24,6 +25,7 @@ describe('given a POST to verify a token', () => { beforeAll(async () => { setupMockConfiguration(); mockVerify = jest.spyOn(AuthorizationServer, 'verifyToken'); + jest.spyOn(MeadowlarkConnection, 'closeMeadowlarkConnection').mockResolvedValue(); service = buildService(); await service.ready(); diff --git a/Meadowlark-js/tests/config/jest.config.js b/Meadowlark-js/tests/config/jest.config.js index bb8c5c62..f4088ead 100644 --- a/Meadowlark-js/tests/config/jest.config.js +++ b/Meadowlark-js/tests/config/jest.config.js @@ -1,8 +1,7 @@ -const { defaults: tsjPreset } = require('ts-jest/presets'); - module.exports = { - transform: tsjPreset.transform, - transformIgnorePatterns: ['.*(node_modules)(?!.*meadowlark-.*).*$'], + transform: { + '^.+\\.[tj]s$': ['ts-jest', { tsconfig: 'tsconfig.spec.json' }], + }, modulePathIgnorePatterns: ['dist*', 'docs*'], setupFiles: ['dotenv/config'], rootDir: '../../..', diff --git a/Meadowlark-js/tsconfig.spec.json b/Meadowlark-js/tsconfig.spec.json new file mode 100644 index 00000000..193f0c42 --- /dev/null +++ b/Meadowlark-js/tsconfig.spec.json @@ -0,0 +1,21 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.js", + "**/*.js", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.d.ts", + ], + "exclude": [ + "node_modules", + "dist", + ".serverless/**/*", + "_warmup/**/*" + ] +}