From 59067c9f88264c5fb47463be5100d6dcb583d54e Mon Sep 17 00:00:00 2001 From: Javier Toledo Date: Wed, 22 Jun 2022 19:03:02 +0100 Subject: [PATCH] Fix local integration tests (WIP) --- .vscode/launch.json | 22 ++++++++++++ packages/application-tester/keys/public.key | 9 +++++ packages/application-tester/package.json | 3 +- .../src/application-tester.ts | 2 +- .../application-tester/src/graphql-helper.ts | 2 +- packages/application-tester/src/index.ts | 1 - .../application-tester/src/token-helper.ts | 3 +- .../integration/helper/app-helper.ts | 2 +- .../local/{ => functionality}/.mocharc.yml | 2 +- .../{ => functionality}/auth.integration.ts | 3 +- .../commands.integration.ts | 6 ++-- .../read-models.integration.ts | 4 +-- .../local/functionality/setup.ts | 8 +++++ .../local/{ => functionality}/utils.ts | 2 +- .../provider-specific/local/setup.ts | 36 ------------------- .../provider-specific/local/stop/setup.ts | 6 +++- .../framework-integration-tests/package.json | 8 +++-- .../src/test-helper/aws-test-helper.ts | 3 +- .../src/test-helper/azure-test-helper.ts | 3 +- .../src/test-helper/local-test-helper.ts | 9 +++-- packages/framework-types/src/index.ts | 1 + .../src/provider-test-helper.ts | 0 22 files changed, 73 insertions(+), 62 deletions(-) create mode 100644 packages/application-tester/keys/public.key rename packages/framework-integration-tests/integration/provider-specific/local/{ => functionality}/.mocharc.yml (71%) rename packages/framework-integration-tests/integration/provider-specific/local/{ => functionality}/auth.integration.ts (99%) rename packages/framework-integration-tests/integration/provider-specific/local/{ => functionality}/commands.integration.ts (96%) rename packages/framework-integration-tests/integration/provider-specific/local/{ => functionality}/read-models.integration.ts (94%) create mode 100644 packages/framework-integration-tests/integration/provider-specific/local/functionality/setup.ts rename packages/framework-integration-tests/integration/provider-specific/local/{ => functionality}/utils.ts (98%) delete mode 100644 packages/framework-integration-tests/integration/provider-specific/local/setup.ts rename packages/{application-tester => framework-types}/src/provider-test-helper.ts (100%) diff --git a/.vscode/launch.json b/.vscode/launch.json index 3d028c290..c3497955c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -374,6 +374,28 @@ "BOOSTER_ENV": "local" } }, + { + "type": "node", + "request": "launch", + "name": "Local Provider-Unaware Functional Integration Tests", + "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", + "args": [ + "--colors", + "--forbid-only", + "--config", + "${workspaceFolder}/packages/framework-integration-tests/integration/provider-unaware/functionality/.mocharc.yml", + "${workspaceFolder}/packages/framework-integration-tests/integration/provider-unaware/functionality/**/*.integration.ts" + ], + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "protocol": "inspector", + "cwd": "${workspaceFolder}/packages/framework-integration-tests", + "runtimeArgs": ["--preserve-symlinks"], + "env": { + "TESTED_PROVIDER": "LOCAL", + "BOOSTER_ENV": "local" + } + }, { "type": "node", "request": "launch", diff --git a/packages/application-tester/keys/public.key b/packages/application-tester/keys/public.key new file mode 100644 index 000000000..a69369586 --- /dev/null +++ b/packages/application-tester/keys/public.key @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA33TqqLR3eeUmDtHS89qF +3p4MP7Wfqt2Zjj3lZjLjjCGDvwr9cJNlNDiuKboODgUiT4ZdPWbOiMAfDcDzlOxA +04DDnEFGAf+kDQiNSe2ZtqC7bnIc8+KSG/qOGQIVaay4Ucr6ovDkykO5Hxn7OU7s +Jp9TP9H0JH8zMQA6YzijYH9LsupTerrY3U6zyihVEDXXOv08vBHk50BMFJbE9iwF +wnxCsU5+UZUZYw87Uu0n4LPFS9BT8tUIvAfnRXIEWCha3KbFWmdZQZlyrFw0buUE +f0YN3/Q0auBkdbDR/ES2PbgKTJdkjc/rEeM0TxvOUf7HuUNOhrtAVEN1D5uuxE1W +SwIDAQAB +-----END PUBLIC KEY----- \ No newline at end of file diff --git a/packages/application-tester/package.json b/packages/application-tester/package.json index a2dc38208..e5ce593af 100644 --- a/packages/application-tester/package.json +++ b/packages/application-tester/package.json @@ -40,7 +40,8 @@ "cross-fetch": "3.1.5", "jsonwebtoken": "8.5.1", "subscriptions-transport-ws": "0.9.18", - "ws": "7.4.5" + "ws": "7.4.5", + "@boostercloud/framework-types": "0.29.3" }, "devDependencies": { "chai": "4.2.0", diff --git a/packages/application-tester/src/application-tester.ts b/packages/application-tester/src/application-tester.ts index 145b84d1d..565c71073 100644 --- a/packages/application-tester/src/application-tester.ts +++ b/packages/application-tester/src/application-tester.ts @@ -1,5 +1,5 @@ import { GraphQLHelper } from './graphql-helper' -import { Counters, ProviderTestHelper, Queries } from './provider-test-helper' +import { Counters, ProviderTestHelper, Queries } from '@boostercloud/framework-types' import { TokenHelper } from './token-helper' export class ApplicationTester { diff --git a/packages/application-tester/src/graphql-helper.ts b/packages/application-tester/src/graphql-helper.ts index 2db2f9aef..f9ab85ec0 100644 --- a/packages/application-tester/src/graphql-helper.ts +++ b/packages/application-tester/src/graphql-helper.ts @@ -8,7 +8,7 @@ import { ApolloLink, split } from 'apollo-link' import * as WebSocket from 'ws' import { SubscriptionClient } from 'subscriptions-transport-ws' import { ApolloClientOptions } from 'apollo-client/ApolloClient' -import { ProviderTestHelper } from './provider-test-helper' +import { ProviderTestHelper } from '@boostercloud/framework-types' type AuthToken = string | (() => string) diff --git a/packages/application-tester/src/index.ts b/packages/application-tester/src/index.ts index 8dc06664f..3d7be222e 100644 --- a/packages/application-tester/src/index.ts +++ b/packages/application-tester/src/index.ts @@ -1,4 +1,3 @@ export * from './application-tester' -export * from './provider-test-helper' export * from './graphql-helper' export * from './token-helper' diff --git a/packages/application-tester/src/token-helper.ts b/packages/application-tester/src/token-helper.ts index f8affefc6..8ec436f16 100644 --- a/packages/application-tester/src/token-helper.ts +++ b/packages/application-tester/src/token-helper.ts @@ -11,6 +11,7 @@ export class TokenHelper { constructor() { this.privateKey = fs.readFileSync(path.join(__dirname, '..', 'keys', 'private.key')) } + public forUser(email: string, role: string, expiresIn?: number, notBefore?: number): string { const keyid = 'booster' const issuer = 'booster' @@ -29,7 +30,7 @@ export class TokenHelper { return jwt.sign( { id: email, - 'booster:role': role, + 'booster:role': [role], email, }, this.privateKey, diff --git a/packages/framework-integration-tests/integration/helper/app-helper.ts b/packages/framework-integration-tests/integration/helper/app-helper.ts index 1b7f23546..40e8f7e4c 100644 --- a/packages/framework-integration-tests/integration/helper/app-helper.ts +++ b/packages/framework-integration-tests/integration/helper/app-helper.ts @@ -1,4 +1,4 @@ -import { ProviderTestHelper } from '@boostercloud/application-tester' +import { ProviderTestHelper } from '@boostercloud/framework-types' import { AWSTestHelper } from '@boostercloud/framework-provider-aws-infrastructure' import { AzureTestHelper } from '@boostercloud/framework-provider-azure-infrastructure' import { LocalTestHelper } from '@boostercloud/framework-provider-local-infrastructure' diff --git a/packages/framework-integration-tests/integration/provider-specific/local/.mocharc.yml b/packages/framework-integration-tests/integration/provider-specific/local/functionality/.mocharc.yml similarity index 71% rename from packages/framework-integration-tests/integration/provider-specific/local/.mocharc.yml rename to packages/framework-integration-tests/integration/provider-specific/local/functionality/.mocharc.yml index 1970716bd..cb2bd2a62 100644 --- a/packages/framework-integration-tests/integration/provider-specific/local/.mocharc.yml +++ b/packages/framework-integration-tests/integration/provider-specific/local/functionality/.mocharc.yml @@ -7,6 +7,6 @@ recursive: true reporter: 'spec' timeout: 600000 file: - - './integration/provider-specific/local/setup.ts' + - './integration/provider-specific/local/functionality/setup.ts' full-trace: true bail: true \ No newline at end of file diff --git a/packages/framework-integration-tests/integration/provider-specific/local/auth.integration.ts b/packages/framework-integration-tests/integration/provider-specific/local/functionality/auth.integration.ts similarity index 99% rename from packages/framework-integration-tests/integration/provider-specific/local/auth.integration.ts rename to packages/framework-integration-tests/integration/provider-specific/local/functionality/auth.integration.ts index f7b35963b..16f167c09 100644 --- a/packages/framework-integration-tests/integration/provider-specific/local/auth.integration.ts +++ b/packages/framework-integration-tests/integration/provider-specific/local/functionality/auth.integration.ts @@ -1,8 +1,7 @@ -import { confirmUser, confirmUserURL, createUser, signOutURL, signUpURL } from './utils' +import { confirmUser, confirmUserURL, createUser, signOutURL, signUpURL, signInURL } from './utils' import { expect } from 'chai' import fetch from 'cross-fetch' import { internet, random } from 'faker' -import { signInURL } from './utils' // FIXME: When JWT auth is merged xdescribe('With the auth API', () => { diff --git a/packages/framework-integration-tests/integration/provider-specific/local/commands.integration.ts b/packages/framework-integration-tests/integration/provider-specific/local/functionality/commands.integration.ts similarity index 96% rename from packages/framework-integration-tests/integration/provider-specific/local/commands.integration.ts rename to packages/framework-integration-tests/integration/provider-specific/local/functionality/commands.integration.ts index f86f7fd0d..7d650a374 100644 --- a/packages/framework-integration-tests/integration/provider-specific/local/commands.integration.ts +++ b/packages/framework-integration-tests/integration/provider-specific/local/functionality/commands.integration.ts @@ -4,10 +4,10 @@ import { changeCartItem, graphQLClient } from './utils' import { random } from 'faker' import { expect } from 'chai' import * as DataStore from 'nedb' -import { sandboxPath } from './constants' -import util = require('util') +import { sandboxPath } from '../constants' +import * as util from 'util' import * as path from 'path' -import { waitForIt } from '../../helper/sleep' +import { waitForIt } from '../../../helper/sleep' describe('commands', () => { let events: DataStore diff --git a/packages/framework-integration-tests/integration/provider-specific/local/read-models.integration.ts b/packages/framework-integration-tests/integration/provider-specific/local/functionality/read-models.integration.ts similarity index 94% rename from packages/framework-integration-tests/integration/provider-specific/local/read-models.integration.ts rename to packages/framework-integration-tests/integration/provider-specific/local/functionality/read-models.integration.ts index eebf2bbce..e40969d8a 100644 --- a/packages/framework-integration-tests/integration/provider-specific/local/read-models.integration.ts +++ b/packages/framework-integration-tests/integration/provider-specific/local/functionality/read-models.integration.ts @@ -4,9 +4,9 @@ import { changeCartItem, graphQLClient } from './utils' import { random } from 'faker' import { expect } from 'chai' import * as DataStore from 'nedb' -import { sandboxPath } from './constants' +import { sandboxPath } from '../constants' import * as path from 'path' -import { waitForIt } from '../../helper/sleep' +import { waitForIt } from '../../../helper/sleep' describe('read-models', () => { let readModels: DataStore diff --git a/packages/framework-integration-tests/integration/provider-specific/local/functionality/setup.ts b/packages/framework-integration-tests/integration/provider-specific/local/functionality/setup.ts new file mode 100644 index 000000000..6a3e260a7 --- /dev/null +++ b/packages/framework-integration-tests/integration/provider-specific/local/functionality/setup.ts @@ -0,0 +1,8 @@ +import { expect } from 'chai' +import { readPIDFor } from '../../../helper/file-helper' +import { sandboxPath } from '../constants' + +before(async () => { + const pid: number = readPIDFor(sandboxPath) + expect(pid).not.to.be.undefined +}) diff --git a/packages/framework-integration-tests/integration/provider-specific/local/utils.ts b/packages/framework-integration-tests/integration/provider-specific/local/functionality/utils.ts similarity index 98% rename from packages/framework-integration-tests/integration/provider-specific/local/utils.ts rename to packages/framework-integration-tests/integration/provider-specific/local/functionality/utils.ts index 6dc833165..8ccc3c971 100644 --- a/packages/framework-integration-tests/integration/provider-specific/local/utils.ts +++ b/packages/framework-integration-tests/integration/provider-specific/local/functionality/utils.ts @@ -2,7 +2,7 @@ import fetch from 'cross-fetch' import { ApolloClient } from 'apollo-client' import { InMemoryCache, NormalizedCacheObject } from 'apollo-cache-inmemory' import { HttpLink } from 'apollo-link-http' -import { LOCAL_PROVIDER_HOST } from './constants' +import { LOCAL_PROVIDER_HOST } from '../constants' import gql from 'graphql-tag' // --- Auth helpers --- diff --git a/packages/framework-integration-tests/integration/provider-specific/local/setup.ts b/packages/framework-integration-tests/integration/provider-specific/local/setup.ts deleted file mode 100644 index f098a670d..000000000 --- a/packages/framework-integration-tests/integration/provider-specific/local/setup.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { start } from '../../helper/cli-helper' -import { sleep } from '../../helper/sleep' -import { ChildProcess } from 'child_process' -import { removeFolders, sandboxPathFor } from '../../helper/file-helper' -import { overrideWithBoosterLocalDependencies } from '../../helper/deps-helper' -import { sandboxName } from './constants' -// Imported from another package to avoid duplication -// It is OK-ish, since integration tests are always run in the context of the whole monorepo -import { createSandboxProject } from '../../../../cli/src/common/sandbox' -import { runCommand } from '@boostercloud/framework-common-helpers' - -let serverProcess: ChildProcess -let sandboxPath: string - -before(async () => { - console.log('preparing sandboxed project...') - const configuredAssets = ['assets', 'assetFile.txt'] - sandboxPath = createSandboxProject(sandboxPathFor(sandboxName), configuredAssets) - - console.log('overriding booster dependencies...') - await overrideWithBoosterLocalDependencies(sandboxPath) - - console.log('installing dependencies...') - await runCommand(sandboxPath, 'npm install') - - console.log(`starting local server in ${sandboxPath}...`) - serverProcess = start(sandboxPath, 'local') - await sleep(10000) // TODO: We need some time for the server to start, but maybe we could do this faster using the `waitForIt` method -}) - -after(async () => { - console.log('stopping local server...') - serverProcess.kill('SIGINT') - console.log('removing sandbox project') - removeFolders([sandboxPath]) -}) diff --git a/packages/framework-integration-tests/integration/provider-specific/local/stop/setup.ts b/packages/framework-integration-tests/integration/provider-specific/local/stop/setup.ts index cf962989e..bd161a190 100644 --- a/packages/framework-integration-tests/integration/provider-specific/local/stop/setup.ts +++ b/packages/framework-integration-tests/integration/provider-specific/local/stop/setup.ts @@ -5,7 +5,11 @@ before(async () => { const sandboxPath = sandboxPathFor(sandboxName) const pid: number = readPIDFor(sandboxPath) console.log(`stopping local server with pid ${pid}...`) - process.kill(pid) + try { + process.kill(pid) + } catch (e) { + console.log('No server to stop. Skipping...') + } console.log('removing sandbox project...') removeFolders([sandboxPath]) }) diff --git a/packages/framework-integration-tests/package.json b/packages/framework-integration-tests/package.json index 16c0cc670..1f1c56cfe 100644 --- a/packages/framework-integration-tests/package.json +++ b/packages/framework-integration-tests/package.json @@ -50,7 +50,9 @@ "subscriptions-transport-ws": "0.9.18", "ttypescript": "1.5.13", "ws": "7.4.5", - "yaml": "1.10.2" + "yaml": "1.10.2", + "chai": "4.2.0", + "nedb": "^1.8.0" }, "engines": { "node": ">=14.0.0" @@ -76,9 +78,9 @@ "integration/k8s": "npm run integration/k8s-deploy && npm run integration/k8s-nuke", "integration/k8s-deploy": "BOOSTER_ENV=kubernetes mocha --forbid-only --exit --config \"integration/provider-specific/kubernetes/deployment/.mocharc.yml\" \"integration/provider-specific/kubernetes/deployment/**/*.integration.ts\"", "integration/k8s-nuke": "BOOSTER_ENV=kubernetes mocha --forbid-only --exit --config \"integration/provider-specific/kubernetes/nuke/.mocharc.yml\" \"integration/provider-specific/kubernetes/nuke/**/*.integration.ts\"", - "integration/local": "BOOSTER_ENV=local mocha --forbid-only --exit --config \"integration/provider-specific/local/.mocharc.yml\" \"integration/provider-specific/local/**/*.integration.ts\"", - "integration/local-ongoing": "npm run integration/local-start && npm run integration/local-stop", + "integration/local": "npm run integration/local-start && npm run integration/local-provider-specific && npm run integration/local-stop", "integration/local-start": "BOOSTER_ENV=local mocha --forbid-only --exit --config \"integration/provider-specific/local/start/.mocharc.yml\" \"integration/provider-specific/local/start/*.integration.ts\"", + "integration/local-provider-specific": "BOOSTER_ENV=local mocha --forbid-only --exit --config \"integration/provider-specific/local/functionality/.mocharc.yml\" \"integration/provider-specific/local/functionality/**/*.integration.ts\"", "integration/local-func": "TESTED_PROVIDER=LOCAL BOOSTER_ENV=local mocha --forbid-only --exit --config \"integration/provider-unaware/functionality/.mocharc.yml\" \"integration/provider-unaware/functionality/**/*.integration.ts\"", "integration/local-end-to-end": "TESTED_PROVIDER=LOCAL BOOSTER_ENV=local mocha --forbid-only --exit --config \"integration/provider-unaware/end-to-end/.mocharc.yml\" \"integration/provider-unaware/end-to-end/**/*.integration.ts\"", "integration/local-stop": "BOOSTER_ENV=local mocha --forbid-only --exit --config \"integration/provider-specific/local/stop/.mocharc.yml\" \"integration/provider-specific/local/stop/*.integration.ts\"", diff --git a/packages/framework-provider-aws-infrastructure/src/test-helper/aws-test-helper.ts b/packages/framework-provider-aws-infrastructure/src/test-helper/aws-test-helper.ts index bf4c1848c..ed858bbdc 100644 --- a/packages/framework-provider-aws-infrastructure/src/test-helper/aws-test-helper.ts +++ b/packages/framework-provider-aws-infrastructure/src/test-helper/aws-test-helper.ts @@ -2,6 +2,7 @@ import { Stack } from 'aws-sdk/clients/cloudformation' import { CloudFormation, config } from 'aws-sdk' import { AWSCounters } from './aws-counters' import { AWSQueries } from './aws-queries' +import { ProviderTestHelper } from '@boostercloud/framework-types' interface ApplicationOutputs { graphqlURL: string @@ -10,7 +11,7 @@ interface ApplicationOutputs { const cloudFormation = new CloudFormation() -export class AWSTestHelper { +export class AWSTestHelper implements ProviderTestHelper { private constructor( readonly outputs: ApplicationOutputs, readonly counters: AWSCounters, diff --git a/packages/framework-provider-azure-infrastructure/src/test-helper/azure-test-helper.ts b/packages/framework-provider-azure-infrastructure/src/test-helper/azure-test-helper.ts index 8521e18fb..33f0bcd72 100644 --- a/packages/framework-provider-azure-infrastructure/src/test-helper/azure-test-helper.ts +++ b/packages/framework-provider-azure-infrastructure/src/test-helper/azure-test-helper.ts @@ -3,13 +3,14 @@ import { getResourceGroup, getCosmosConnectionStrings } from '../infrastructure/ import { ResourceGroup } from '../infrastructure/types/resource-group' import { AzureCounters } from './azure-counters' import { AzureQueries } from './azure-queries' +import { ProviderTestHelper } from '@boostercloud/framework-types' interface ApplicationOutputs { graphqlURL: string websocketURL: string } -export class AzureTestHelper { +export class AzureTestHelper implements ProviderTestHelper { private constructor( readonly outputs: ApplicationOutputs, readonly counters: AzureCounters, diff --git a/packages/framework-provider-local-infrastructure/src/test-helper/local-test-helper.ts b/packages/framework-provider-local-infrastructure/src/test-helper/local-test-helper.ts index dd25d2243..9f54ca8f3 100644 --- a/packages/framework-provider-local-infrastructure/src/test-helper/local-test-helper.ts +++ b/packages/framework-provider-local-infrastructure/src/test-helper/local-test-helper.ts @@ -1,3 +1,4 @@ +import { ProviderTestHelper } from '@boostercloud/framework-types' import { LocalQueries } from './local-queries' import { LocalCounters } from './local-counters' @@ -6,7 +7,7 @@ interface ApplicationOutputs { websocketURL: string } -export class LocalTestHelper { +export class LocalTestHelper implements ProviderTestHelper { private constructor( readonly outputs: ApplicationOutputs, readonly counters: LocalCounters, @@ -30,12 +31,10 @@ export class LocalTestHelper { } private static async graphqlURL(): Promise { - const url = 'http://localhost:3000/graphql' - return url + return 'http://localhost:3000/graphql' } private static async websocketURL(): Promise { - const url = 'SOME-URL' - return url + return 'http://localhost:3000/graphql' } } diff --git a/packages/framework-types/src/index.ts b/packages/framework-types/src/index.ts index 67f09fac1..b8dfaec9f 100644 --- a/packages/framework-types/src/index.ts +++ b/packages/framework-types/src/index.ts @@ -12,3 +12,4 @@ export * from './graphql-websocket-messages' export * from './schedule' export * from './errors/index' export * from './rockets' +export * from './provider-test-helper' diff --git a/packages/application-tester/src/provider-test-helper.ts b/packages/framework-types/src/provider-test-helper.ts similarity index 100% rename from packages/application-tester/src/provider-test-helper.ts rename to packages/framework-types/src/provider-test-helper.ts