From e019f40b41daeaa24a2fcd937d27e207c362c9cc Mon Sep 17 00:00:00 2001 From: einhorn_b Date: Mon, 10 Jul 2023 15:23:34 +0200 Subject: [PATCH] add test for TransactionResolver --- dlt-connector/jest.config.js | 14 ++- dlt-connector/package.json | 1 + .../resolver/TransactionsResolver.test.ts | 51 ++++++++++ .../graphql/resolver/TransactionsResolver.ts | 7 +- dlt-connector/test/ApolloServerMock.ts | 19 ++++ dlt-connector/tsconfig.json | 3 + dlt-connector/yarn.lock | 97 +++++++++++++------ 7 files changed, 162 insertions(+), 30 deletions(-) create mode 100644 dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts create mode 100644 dlt-connector/test/ApolloServerMock.ts diff --git a/dlt-connector/jest.config.js b/dlt-connector/jest.config.js index 8d8cf626b..24fc9fc68 100644 --- a/dlt-connector/jest.config.js +++ b/dlt-connector/jest.config.js @@ -6,7 +6,7 @@ module.exports = { collectCoverageFrom: ['src/**/*.ts', '!**/node_modules/**', '!src/seeds/**', '!build/**'], coverageThreshold: { global: { - lines: 52, + lines: 62, }, }, setupFiles: ['/test/testSetup.ts'], @@ -14,6 +14,9 @@ module.exports = { modulePathIgnorePatterns: ['/build/'], moduleNameMapper: { '@/(.*)': '/src/$1', + '@resolver/(.*)': '/src/graphql/resolver/$1', + '@input/(.*)': '/src/graphql/input/$1', + '@proto/(.*)': '/src/proto/$1', '@test/(.*)': '/test/$1', '@entity/(.*)': // eslint-disable-next-line n/no-process-env @@ -27,3 +30,12 @@ module.exports = { : '/../database/build/src/$1', }, } +/* +@arg/*": ["src/graphql/arg/*"], + "@enum/*": ["src/graphql/enum/*"], + "@input/*": ["src/graphql/input/*"], + "@resolver/*": ["src/graphql/resolver/*"], + "@scalar/*": ["src/graphql/scalar/*"], + "@test/*": ["test/*"], + "@proto/*" : ["src/proto/*"], + */ diff --git a/dlt-connector/package.json b/dlt-connector/package.json index 2a68483a7..52e14a26c 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -38,6 +38,7 @@ }, "devDependencies": { "@eslint-community/eslint-plugin-eslint-comments": "^3.2.1", + "@graphql-tools/mock": "^9.0.0", "@types/cors": "^2.8.13", "@types/jest": "^27.0.2", "@types/node": "^18.11.18", diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts new file mode 100644 index 000000000..dc668941b --- /dev/null +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts @@ -0,0 +1,51 @@ +import 'reflect-metadata' +import { createApolloTestServer } from '@test/ApolloServerMock' +import assert from 'assert' + +jest.mock('@iota/client', () => { + const mockMessageSender = jest.fn().mockImplementation(() => { + return { + index: jest.fn().mockReturnThis(), + data: jest.fn().mockReturnThis(), + submit: jest.fn().mockReturnValue({ + messageId: '5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710', + }), + } + }) + + const mockClient = { + message: mockMessageSender, + } + const mockClientBuilder = { + node: jest.fn().mockReturnThis(), + build: jest.fn(() => mockClient), + } + return { + ClientBuilder: jest.fn(() => mockClientBuilder), + } +}) + +describe('Transaction Resolver Test', () => { + it('test mocked sendTransaction', async () => { + const apolloTestServer = await createApolloTestServer() + const response = await apolloTestServer.executeOperation({ + query: 'mutation ($input: TransactionInput!) { sendTransaction(data: $input) }', + variables: { + input: { + type: 'SEND', + amount: '10', + created: 1688992436, + }, + }, + }) + // Note the use of Node's assert rather than Jest's expect; if using + // TypeScript, `assert`` will appropriately narrow the type of `body` + // and `expect` will not. + // Source: https://www.apollographql.com/docs/apollo-server/testing/testing + assert(response.body.kind === 'single') + expect(response.body.singleResult.errors).toBeUndefined() + expect(response.body.singleResult.data?.sendTransaction).toBe( + '5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710', + ) + }) +}) diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts index 4a5c42a54..739404007 100755 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts @@ -1,12 +1,17 @@ import { Resolver, Query, Arg, Mutation } from 'type-graphql' import { TransactionInput } from '@input/TransactionInput' -import { TransactionBody } from '../../proto/TransactionBody' +import { TransactionBody } from '@proto/TransactionBody' import { sendMessage as iotaSendMessage } from '@/client/IotaClient' @Resolver() export class TransactionResolver { + // Why a dummy function? + // to prevent this error by start: + // GeneratingSchemaError: Some errors occurred while generating GraphQL schema: + // Type Query must define one or more fields. + // it seems that at least one query must be defined @Query(() => String) dummy(): string { return 'nothing' diff --git a/dlt-connector/test/ApolloServerMock.ts b/dlt-connector/test/ApolloServerMock.ts new file mode 100644 index 000000000..6e0585862 --- /dev/null +++ b/dlt-connector/test/ApolloServerMock.ts @@ -0,0 +1,19 @@ +import { ApolloServer } from '@apollo/server' +import { addMocksToSchema } from '@graphql-tools/mock' +import { schema } from '@/graphql/schema' + +let apolloTestServer: ApolloServer + +export async function createApolloTestServer() { + if (apolloTestServer === undefined) { + apolloTestServer = new ApolloServer({ + // addMocksToSchema accepts a schema instance and provides + // mocked data for each field in the schema + schema: addMocksToSchema({ + schema: await schema(), + preserveResolvers: true, + }), + }) + } + return apolloTestServer +} diff --git a/dlt-connector/tsconfig.json b/dlt-connector/tsconfig.json index 06f5b44db..bdc5e3a9b 100644 --- a/dlt-connector/tsconfig.json +++ b/dlt-connector/tsconfig.json @@ -51,7 +51,10 @@ "@arg/*": ["src/graphql/arg/*"], "@enum/*": ["src/graphql/enum/*"], "@input/*": ["src/graphql/input/*"], + "@resolver/*": ["src/graphql/resolver/*"], + "@scalar/*": ["src/graphql/scalar/*"], "@test/*": ["test/*"], + "@proto/*" : ["src/proto/*"], /* external */ }, // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ diff --git a/dlt-connector/yarn.lock b/dlt-connector/yarn.lock index 9622e49a8..5d127eb10 100644 --- a/dlt-connector/yarn.lock +++ b/dlt-connector/yarn.lock @@ -504,6 +504,34 @@ "@graphql-tools/utils" "^9.2.1" tslib "^2.4.0" +"@graphql-tools/merge@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-9.0.0.tgz#b0a3636c82716454bff88e9bb40108b0471db281" + integrity sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q== + dependencies: + "@graphql-tools/utils" "^10.0.0" + tslib "^2.4.0" + +"@graphql-tools/mock@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-9.0.0.tgz#9d4cd3d41333b2c09fee4f248a236aa959906b82" + integrity sha512-Vbb4RNTT9T3fXjmzACcflOh79vKBaC/J21eCJ0eug1ZdaM2QXVHQ3lxE6HNOlAENHXjwJINz1AnKsvF3bpeSKA== + dependencies: + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.0" + fast-json-stable-stringify "^2.1.0" + tslib "^2.4.0" + +"@graphql-tools/schema@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-10.0.0.tgz#7b5f6b6a59f51c927de8c9069bde4ebbfefc64b3" + integrity sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg== + dependencies: + "@graphql-tools/merge" "^9.0.0" + "@graphql-tools/utils" "^10.0.0" + tslib "^2.4.0" + value-or-promise "^1.0.12" + "@graphql-tools/schema@^9.0.0": version "9.0.19" resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.19.tgz#c4ad373b5e1b8a0cf365163435b7d236ebdd06e7" @@ -514,6 +542,15 @@ tslib "^2.4.0" value-or-promise "^1.0.12" +"@graphql-tools/utils@^10.0.0": + version "10.0.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.0.3.tgz#e5d5b217ba643b7b67a35b50086b5d831aadb71c" + integrity sha512-6uO41urAEIs4sXQT2+CYGsUTkHkVo/2MpM/QjoHj6D6xoEF2woXHBpdAVi0HKIInDwZqWgEYOwIFez0pERxa1Q== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + dset "^3.1.2" + tslib "^2.4.0" + "@graphql-tools/utils@^9.2.1": version "9.2.1" resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.2.1.tgz#1b3df0ef166cfa3eae706e3518b17d5922721c57" @@ -1089,9 +1126,9 @@ form-data "^3.0.0" "@types/node@*", "@types/node@^20.1.2": - version "20.4.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.0.tgz#01d637d1891e419bc85763b46f42809cd2d5addb" - integrity sha512-jfT7iTf/4kOQ9S7CHV9BIyRaQqHu67mOjsIQBC3BKZvzvUB6zLxEwJ6sBE3ozcvP8kF6Uk5PXN0Q+c0dfhGX0g== + version "20.4.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.1.tgz#a6033a8718653c50ac4962977e14d0f984d9527d" + integrity sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg== "@types/node@^18.11.18": version "18.16.19" @@ -1740,9 +1777,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001503: - version "1.0.30001513" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001513.tgz#382fe5fbfb0f7abbaf8c55ca3ac71a0307a752e9" - integrity sha512-pnjGJo7SOOjAGytZZ203Em95MRM8Cr6jhCXNF/FAXTpCTRTECnqQWLpiTRqrFtdYcth8hf4WECUpkezuYsMVww== + version "1.0.30001514" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz#e2a7e184a23affc9367b7c8d734e7ec4628c1309" + integrity sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ== chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" @@ -2190,6 +2227,11 @@ dotenv@10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +dset@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.2.tgz#89c436ca6450398396dc6538ea00abc0c54cd45a" + integrity sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -2201,9 +2243,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.431: - version "1.4.453" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.453.tgz#0a81fdc1943db202e8724d9f61369a71f0dd51e8" - integrity sha512-BU8UtQz6CB3T7RIGhId4BjmjJVXQDujb0+amGL8jpcluFJr6lwspBOvkUbnttfpZCm4zFMHmjrX1QrdPWBBMjQ== + version "1.4.454" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz#774dc7cb5e58576d0125939ec34a4182f3ccc87d" + integrity sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ== emittery@^0.8.1: version "0.8.1" @@ -2748,7 +2790,7 @@ fast-glob@^3.2.9, fast-glob@^3.3.0: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -3019,15 +3061,15 @@ glob-parent@^6.0.2: is-glob "^4.0.3" glob@^10.3.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.1.tgz#9789cb1b994515bedb811a6deca735b5c37d2bf4" - integrity sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw== + version "10.3.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.3.tgz#8360a4ffdd6ed90df84aa8d52f21f452e86a123b" + integrity sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw== dependencies: foreground-child "^3.1.0" jackspeak "^2.0.3" minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2" - path-scurry "^1.10.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.2.3" @@ -4350,10 +4392,10 @@ minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -"minipass@^5.0.0 || ^6.0.2": - version "6.0.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-6.0.2.tgz#542844b6c4ce95b202c0995b0a471f1229de4c81" - integrity sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.1.tgz#dff63464407cd8b83d7f008c0f116fa8c9b77ebf" + integrity sha512-NQ8MCKimInjVlaIqx51RKJJB7mINVkLTJbsZKmto4UAAOC/CWXES8PGaOgoBZyqoUsUA/U3DToGK7GJkkHbjJw== mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" @@ -4702,13 +4744,13 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.0.tgz#0ffbd4c1f7de9600f98a1405507d9f9acb438ab3" - integrity sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g== +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== dependencies: lru-cache "^9.1.1 || ^10.0.0" - minipass "^5.0.0 || ^6.0.2" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-to-regexp@0.1.7: version "0.1.7" @@ -5102,9 +5144,9 @@ saxes@^5.0.1: xmlchars "^2.2.0" semver@7.x, semver@^7.0.0, semver@^7.3.2, semver@^7.3.7, semver@^7.3.8, semver@^7.5.0: - version "7.5.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" - integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -6058,7 +6100,6 @@ wordwrapjs@^4.0.0: typical "^5.2.0" "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==