diff --git a/.github/file-filters.yml b/.github/file-filters.yml index 6690cdb9d..f0d38b75b 100644 --- a/.github/file-filters.yml +++ b/.github/file-filters.yml @@ -30,6 +30,9 @@ admin: &admin - 'admin/**/*' +backend: &backend + - 'backend/**/*' + dht_node: &dht_node - 'dht-node/**/*' @@ -42,5 +45,8 @@ federation: &federation frontend: &frontend - 'frontend/**/*' +mariadb: &mariadb + - 'mariadb/**/*' + nginx: &nginx - 'nginx/**/*' \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 0fcedb4ce..000000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,195 +0,0 @@ -name: gradido test CI - -on: push - -jobs: - ############################################################################## - # JOB: DOCKER BUILD TEST BACKEND ############################################# - ############################################################################## - build_test_backend: - name: Docker Build Test - Backend - runs-on: ubuntu-latest - #needs: [nothing] - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v3 - ########################################################################## - # BACKEND ################################################################ - ########################################################################## - - name: Backend | Build `test` image - run: | - docker build -f ./backend/Dockerfile --target test -t "gradido/backend:test" . - docker save "gradido/backend:test" > /tmp/backend.tar - - name: Upload Artifact - uses: actions/upload-artifact@v3 - with: - name: docker-backend-test - path: /tmp/backend.tar - - ############################################################################## - # JOB: DOCKER BUILD TEST DATABASE UP ######################################### - ############################################################################## - build_test_database_up: - name: Docker Build Test - Database up - runs-on: ubuntu-latest - #needs: [nothing] - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v3 - ########################################################################## - # DATABASE UP ############################################################ - ########################################################################## - - name: Database | Build `test_up` image - run: | - docker build --target test_up -t "gradido/database:test_up" database/ - docker save "gradido/database:test_up" > /tmp/database_up.tar - - name: Upload Artifact - uses: actions/upload-artifact@v3 - with: - name: docker-database-test_up - path: /tmp/database_up.tar - - ############################################################################## - # JOB: DOCKER BUILD TEST MARIADB ############################################# - ############################################################################## - build_test_mariadb: - name: Docker Build Test - MariaDB - runs-on: ubuntu-latest - #needs: [nothing] - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v3 - ########################################################################## - # BUILD MARIADB DOCKER IMAGE ############################################# - ########################################################################## - - name: mariadb | Build `test` image - run: | - docker build --target mariadb_server -t "gradido/mariadb:test" -f ./mariadb/Dockerfile ./ - docker save "gradido/mariadb:test" > /tmp/mariadb.tar - - name: Upload Artifact - uses: actions/upload-artifact@v3 - with: - name: docker-mariadb-test - path: /tmp/mariadb.tar - - ############################################################################## - # JOB: LINT BACKEND ########################################################## - ############################################################################## - lint_backend: - name: Lint - Backend - runs-on: ubuntu-latest - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v3 - ########################################################################## - # LINT BACKEND ########################################################### - ########################################################################## - - name: backend | Lint - run: cd database && yarn && cd ../backend && yarn && yarn run lint - - ############################################################################## - # JOB: LOCALES BACKEND ####################################################### - ############################################################################## - locales_backend: - name: Locales - Backend - runs-on: ubuntu-latest - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v3 - ########################################################################## - # LOCALES BACKEND ##################################################### - ########################################################################## - - name: Backend | Locales - run: cd backend && yarn && yarn locales - - ############################################################################## - # JOB: LINT DATABASE UP ###################################################### - ############################################################################## - lint_database_up: - name: Lint - Database Up - runs-on: ubuntu-latest - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v3 - ########################################################################## - # LINT DATABASE ########################################################## - ########################################################################## - - name: Database | Lint - run: cd database && yarn && yarn run lint - - ############################################################################## - # JOB: UNIT TEST BACKEND #################################################### - ############################################################################## - unit_test_backend: - name: Unit tests - Backend - runs-on: ubuntu-latest - needs: [build_test_mariadb] - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v3 - ########################################################################## - # DOWNLOAD DOCKER IMAGES ################################################# - ########################################################################## - - name: Download Docker Image (Mariadb) - uses: actions/download-artifact@v3 - with: - name: docker-mariadb-test - path: /tmp - - name: Load Docker Image - run: docker load < /tmp/mariadb.tar - ########################################################################## - # UNIT TESTS BACKEND ##################################################### - ########################################################################## - - name: backend | docker-compose mariadb - run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps mariadb - - name: Sleep for 30 seconds - run: sleep 30s - shell: bash - - name: backend | docker-compose database - run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps database - - name: backend Unit tests | test - run: cd database && yarn && yarn build && cd ../backend && yarn && yarn test - - ########################################################################## - # DATABASE MIGRATION TEST UP + RESET ##################################### - ########################################################################## - database_migration_test: - name: Database Migration Test - Up + Reset - runs-on: ubuntu-latest - #needs: [nothing] - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v3 - ########################################################################## - # DOCKER COMPOSE DATABASE UP + RESET ##################################### - ########################################################################## - - name: database | docker-compose - run: docker-compose -f docker-compose.yml up --detach mariadb - - name: database | up - run: docker-compose -f docker-compose.yml run -T database yarn up - - name: database | reset - run: docker-compose -f docker-compose.yml run -T database yarn reset diff --git a/.github/workflows/test_backend.yml b/.github/workflows/test_backend.yml new file mode 100644 index 000000000..b517c5186 --- /dev/null +++ b/.github/workflows/test_backend.yml @@ -0,0 +1,81 @@ +name: Gradido Backend Test CI + +on: push + +jobs: + files-changed: + name: Detect File Changes - Backend + runs-on: ubuntu-latest + outputs: + backend: ${{ steps.changes.outputs.backend }} + database: ${{ steps.changes.outputs.database }} + docker-compose: ${{ steps.changes.outputs.docker-compose }} + mariadb: ${{ steps.changes.outputs.mariadb }} + steps: + - uses: actions/checkout@v3.3.0 + + - name: Check for frontend file changes + uses: dorny/paths-filter@v2.11.1 + id: changes + with: + token: ${{ github.token }} + filters: .github/file-filters.yml + list-files: shell + + build_test: + if: needs.files-changed.outputs.backend == 'true' + name: Docker Build Test - Backend + needs: files-changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Backend | Build 'test' image + run: docker build -f ./backend/Dockerfile --target test -t "gradido/backend:test" . + + unit_test: + if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.database == 'true' || needs.files-changed.outputs.docker-compose == 'true' || needs.files-changed.outputs.mariadb == 'true' + name: Unit tests - Backend + needs: files-changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Backend | docker-compose mariadb + run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps mariadb + + - name: Sleep for 30 seconds + run: sleep 30s + shell: bash + + - name: Backend | docker-compose database + run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps database + + - name: Backend | Unit tests + run: cd database && yarn && yarn build && cd ../backend && yarn && yarn test + + lint: + if: needs.files-changed.outputs.backend == 'true' + name: Lint - Backend + needs: files-changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Backend | Lint + run: cd database && yarn && cd ../backend && yarn && yarn run lint + + locales: + if: needs.files-changed.outputs.backend == 'true' + name: Locales - Backend + needs: files-changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Backend | Locales + run: cd backend && yarn && yarn locales \ No newline at end of file diff --git a/.github/workflows/test_database.yml b/.github/workflows/test_database.yml new file mode 100644 index 000000000..0444a0538 --- /dev/null +++ b/.github/workflows/test_database.yml @@ -0,0 +1,64 @@ +name: Gradido Database Test CI + +on: push + +jobs: + files-changed: + name: Detect File Changes - Database + runs-on: ubuntu-latest + outputs: + database: ${{ steps.changes.outputs.database }} + docker-compose: ${{ steps.changes.outputs.docker-compose }} + mariadb: ${{ steps.changes.outputs.mariadb }} + steps: + - uses: actions/checkout@v3.3.0 + + - name: Check for frontend file changes + uses: dorny/paths-filter@v2.11.1 + id: changes + with: + token: ${{ github.token }} + filters: .github/file-filters.yml + list-files: shell + + build: + if: needs.files-changed.outputs.database == 'true' + name: Docker Build Test - Database up + needs: files-changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Database | Build 'test_up' image + run: docker build --target test_up -t "gradido/database:test_up" database/ + + database_migration_test: + if: needs.files-changed.outputs.database == 'true' || needs.files-changed.outputs.docker-compose == 'true' || needs.files-changed.outputs.mariadb == 'true' + name: Database Migration Test - Up + Reset + needs: files-changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Database | docker-compose + run: docker-compose -f docker-compose.yml up --detach mariadb + + - name: Database | up + run: docker-compose -f docker-compose.yml run -T database yarn up + + - name: Database | reset + run: docker-compose -f docker-compose.yml run -T database yarn reset + + lint: + if: needs.files-changed.outputs.database == 'true' + name: Lint - Database Up + needs: files-changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Database | Lint + run: cd database && yarn && yarn run lint \ No newline at end of file diff --git a/.github/workflows/test_dht_node.yml b/.github/workflows/test_dht_node.yml index bb24f2d2f..b63d1fc0d 100644 --- a/.github/workflows/test_dht_node.yml +++ b/.github/workflows/test_dht_node.yml @@ -7,6 +7,7 @@ jobs: name: Detect File Changes - DHT Node runs-on: ubuntu-latest outputs: + database: ${{ steps.changes.outputs.database }} dht_node: ${{ steps.changes.outputs.dht_node }} docker-compose: ${{ steps.changes.outputs.docker-compose }} steps: @@ -54,7 +55,7 @@ jobs: unit_test: name: Unit Tests - DHT Node - if: needs.files-changed.outputs.dht_node == 'true' || needs.files-changed.outputs.docker-compose == 'true' + if: needs.files-changed.outputs.database == 'true' || needs.files-changed.outputs.dht_node == 'true' || needs.files-changed.outputs.docker-compose == 'true' || needs.files-changed.outputs.mariadb == 'true' needs: [files-changed, build] runs-on: ubuntu-latest steps: diff --git a/.github/workflows/test_federation.yml b/.github/workflows/test_federation.yml index 5fd714b00..92ccd95d2 100644 --- a/.github/workflows/test_federation.yml +++ b/.github/workflows/test_federation.yml @@ -54,7 +54,7 @@ jobs: unit_test: name: Unit Tests - Federation - if: needs.files-changed.outputs.docker-compose == 'true' || needs.files-changed.outputs.federation == 'true' + if: needs.files-changed.outputs.database == 'true' || needs.files-changed.outputs.docker-compose == 'true' || needs.files-changed.outputs.federation == 'true' || needs.files-changed.outputs.mariadb == 'true' needs: [files-changed, build] runs-on: ubuntu-latest steps: diff --git a/.github/workflows/test_mariadb.yml b/.github/workflows/test_mariadb.yml new file mode 100644 index 000000000..fe101bc48 --- /dev/null +++ b/.github/workflows/test_mariadb.yml @@ -0,0 +1,32 @@ +name: Gradido MariaDB Test CI + +on: push + +jobs: + files-changed: + name: Detect File Changes - MariaDB + runs-on: ubuntu-latest + outputs: + mariadb: ${{ steps.changes.outputs.mariadb }} + steps: + - uses: actions/checkout@v3.3.0 + + - name: Check for frontend file changes + uses: dorny/paths-filter@v2.11.1 + id: changes + with: + token: ${{ github.token }} + filters: .github/file-filters.yml + list-files: shell + + build_test: + if: needs.files-changed.outputs.mariadb == 'true' + name: Docker Build Test - MariaDB + needs: files-changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: MariaDB | Build 'test' image + run: docker build --target mariadb_server -t "gradido/mariadb:test" -f ./mariadb/Dockerfile ./ diff --git a/backend/.eslintrc.js b/backend/.eslintrc.js index 0e63a9bfe..d00b9199a 100644 --- a/backend/.eslintrc.js +++ b/backend/.eslintrc.js @@ -5,7 +5,7 @@ module.exports = { node: true, }, parser: '@typescript-eslint/parser', - plugins: ['prettier', '@typescript-eslint', 'type-graphql', 'jest', 'import', 'n', 'promise'], + plugins: ['prettier', '@typescript-eslint', 'type-graphql', 'import', 'n', 'promise'], extends: [ 'standard', 'eslint:recommended', @@ -33,12 +33,6 @@ module.exports = { htmlWhitespaceSensitivity: 'ignore', }, ], - // jest - 'jest/no-disabled-tests': 'error', - 'jest/no-focused-tests': 'error', - 'jest/no-identical-title': 'error', - 'jest/prefer-to-have-length': 'error', - 'jest/valid-expect': 'error', // import 'import/export': 'error', 'import/no-deprecated': 'error', @@ -183,5 +177,18 @@ module.exports = { EXPERIMENTAL_useSourceOfProjectReferenceRedirect: true, }, }, + { + files: ['*.test.ts'], + plugins: ['jest'], + rules: { + 'jest/no-disabled-tests': 'error', + 'jest/no-focused-tests': 'error', + 'jest/no-identical-title': 'error', + 'jest/prefer-to-have-length': 'error', + 'jest/valid-expect': 'error', + '@typescript-eslint/unbound-method': 'off', + 'jest/unbound-method': 'error', + }, + }, ], } diff --git a/backend/src/emails/sendEmailTranslated.test.ts b/backend/src/emails/sendEmailTranslated.test.ts index 0e04db732..3f1dd1061 100644 --- a/backend/src/emails/sendEmailTranslated.test.ts +++ b/backend/src/emails/sendEmailTranslated.test.ts @@ -1,5 +1,4 @@ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/unbound-method */ import { createTransport } from 'nodemailer' import { logger, i18n } from '@test/testSetup' diff --git a/backend/src/emails/sendEmailVariants.test.ts b/backend/src/emails/sendEmailVariants.test.ts index fa83996cb..76e96f129 100644 --- a/backend/src/emails/sendEmailVariants.test.ts +++ b/backend/src/emails/sendEmailVariants.test.ts @@ -1,8 +1,9 @@ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-unsafe-return */ /* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ +import { Connection } from '@dbTools/typeorm' +import { ApolloServerTestClient } from 'apollo-server-testing' import { Decimal } from 'decimal.js-light' import { testEnvironment } from '@test/helpers' @@ -23,8 +24,12 @@ import { sendTransactionReceivedEmail, } from './sendEmailVariants' -let con: any -let testEnv: any +let con: Connection +let testEnv: { + mutate: ApolloServerTestClient['mutate'] + query: ApolloServerTestClient['query'] + con: Connection +} beforeAll(async () => { testEnv = await testEnvironment(logger, localization) diff --git a/backend/src/federation/validateCommunities.test.ts b/backend/src/federation/validateCommunities.test.ts index d90664b63..ab426b603 100644 --- a/backend/src/federation/validateCommunities.test.ts +++ b/backend/src/federation/validateCommunities.test.ts @@ -1,19 +1,18 @@ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/unbound-method */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-call */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ - +import { Connection } from '@dbTools/typeorm' import { Community as DbCommunity } from '@entity/Community' +import { ApolloServerTestClient } from 'apollo-server-testing' import { testEnvironment, cleanDB } from '@test/helpers' import { logger } from '@test/testSetup' import { validateCommunities } from './validateCommunities' -let con: any -let testEnv: any +let con: Connection +let testEnv: { + mutate: ApolloServerTestClient['mutate'] + query: ApolloServerTestClient['query'] + con: Connection +} beforeAll(async () => { testEnv = await testEnvironment(logger) diff --git a/backend/src/graphql/directive/isAuthorized.ts b/backend/src/graphql/directive/isAuthorized.ts index 117cff056..b8595a2bd 100644 --- a/backend/src/graphql/directive/isAuthorized.ts +++ b/backend/src/graphql/directive/isAuthorized.ts @@ -1,8 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/no-unsafe-call */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ - import { User } from '@entity/User' import { AuthChecker } from 'type-graphql' @@ -10,9 +5,10 @@ import { INALIENABLE_RIGHTS } from '@/auth/INALIENABLE_RIGHTS' import { decode, encode } from '@/auth/JWT' import { RIGHTS } from '@/auth/RIGHTS' import { ROLE_UNAUTHORIZED, ROLE_USER, ROLE_ADMIN } from '@/auth/ROLES' +import { Context } from '@/server/context' import { LogError } from '@/server/LogError' -export const isAuthorized: AuthChecker = async ({ context }, rights) => { +export const isAuthorized: AuthChecker = async ({ context }, rights) => { context.role = ROLE_UNAUTHORIZED // unauthorized user // is rights an inalienable right? @@ -47,7 +43,7 @@ export const isAuthorized: AuthChecker = async ({ context }, rights) => { } // check for correct rights - const missingRights = (rights).filter((right) => !context.role.hasRight(right)) + const missingRights = (rights).filter((right) => !context.role?.hasRight(right)) if (missingRights.length !== 0) { throw new LogError('401 Unauthorized') } diff --git a/backend/src/graphql/resolver/CommunityResolver.test.ts b/backend/src/graphql/resolver/CommunityResolver.test.ts index 26f4a3390..7d0b11d51 100644 --- a/backend/src/graphql/resolver/CommunityResolver.test.ts +++ b/backend/src/graphql/resolver/CommunityResolver.test.ts @@ -1,21 +1,19 @@ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-call */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/unbound-method */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ - +import { Connection } from '@dbTools/typeorm' import { Community as DbCommunity } from '@entity/Community' +import { ApolloServerTestClient } from 'apollo-server-testing' import { testEnvironment } from '@test/helpers' import { getCommunities } from '@/seeds/graphql/queries' -let query: any - // to do: We need a setup for the tests that closes the connection -let con: any -let testEnv: any +let query: ApolloServerTestClient['query'], con: Connection +let testEnv: { + mutate: ApolloServerTestClient['mutate'] + query: ApolloServerTestClient['query'] + con: Connection +} beforeAll(async () => { testEnv = await testEnvironment() diff --git a/backend/src/graphql/resolver/ContributionLinkResolver.test.ts b/backend/src/graphql/resolver/ContributionLinkResolver.test.ts index 908a38e9b..801e4560b 100644 --- a/backend/src/graphql/resolver/ContributionLinkResolver.test.ts +++ b/backend/src/graphql/resolver/ContributionLinkResolver.test.ts @@ -1,12 +1,9 @@ -/* eslint-disable @typescript-eslint/no-unsafe-call */ -/* eslint-disable @typescript-eslint/unbound-method */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ - +import { Connection } from '@dbTools/typeorm' import { ContributionLink as DbContributionLink } from '@entity/ContributionLink' import { Event as DbEvent } from '@entity/Event' +import { ApolloServerTestClient } from 'apollo-server-testing' import { Decimal } from 'decimal.js-light' import { GraphQLError } from 'graphql' @@ -25,8 +22,14 @@ import { listContributionLinks } from '@/seeds/graphql/queries' import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg' import { peterLustig } from '@/seeds/users/peter-lustig' -let mutate: any, query: any, con: any -let testEnv: any +let mutate: ApolloServerTestClient['mutate'], + query: ApolloServerTestClient['query'], + con: Connection +let testEnv: { + mutate: ApolloServerTestClient['mutate'] + query: ApolloServerTestClient['query'] + con: Connection +} beforeAll(async () => { testEnv = await testEnvironment() diff --git a/backend/src/graphql/resolver/ContributionMessageResolver.test.ts b/backend/src/graphql/resolver/ContributionMessageResolver.test.ts index 00b8f7bac..1b6b034c4 100644 --- a/backend/src/graphql/resolver/ContributionMessageResolver.test.ts +++ b/backend/src/graphql/resolver/ContributionMessageResolver.test.ts @@ -1,12 +1,11 @@ /* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/unbound-method */ /* eslint-disable @typescript-eslint/no-unsafe-return */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ +import { Connection } from '@dbTools/typeorm' import { Event as DbEvent } from '@entity/Event' +import { ApolloServerTestClient } from 'apollo-server-testing' import { GraphQLError } from 'graphql' import { cleanDB, resetToken, testEnvironment } from '@test/helpers' @@ -36,8 +35,12 @@ jest.mock('@/emails/sendEmailVariants', () => { } }) -let mutate: any, con: any -let testEnv: any +let mutate: ApolloServerTestClient['mutate'], con: Connection +let testEnv: { + mutate: ApolloServerTestClient['mutate'] + query: ApolloServerTestClient['query'] + con: Connection +} let result: any beforeAll(async () => { diff --git a/backend/src/graphql/resolver/ContributionResolver.test.ts b/backend/src/graphql/resolver/ContributionResolver.test.ts index 54e2ab9d1..17c739fcb 100644 --- a/backend/src/graphql/resolver/ContributionResolver.test.ts +++ b/backend/src/graphql/resolver/ContributionResolver.test.ts @@ -1,23 +1,18 @@ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/unbound-method */ -/* eslint-disable @typescript-eslint/no-unsafe-return */ /* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ +import { Connection } from '@dbTools/typeorm' import { Contribution } from '@entity/Contribution' import { Event as DbEvent } from '@entity/Event' import { Transaction as DbTransaction } from '@entity/Transaction' import { User } from '@entity/User' import { UserInputError } from 'apollo-server-express' +import { ApolloServerTestClient } from 'apollo-server-testing' import { Decimal } from 'decimal.js-light' import { GraphQLError } from 'graphql' import { ContributionStatus } from '@enum/ContributionStatus' import { Order } from '@enum/Order' -import { ContributionListResult } from '@model/Contribution' -import { UnconfirmedContribution } from '@model/UnconfirmedContribution' import { cleanDB, resetToken, @@ -63,8 +58,14 @@ import { stephenHawking } from '@/seeds/users/stephen-hawking' jest.mock('@/emails/sendEmailVariants') -let mutate: any, query: any, con: any -let testEnv: any +let mutate: ApolloServerTestClient['mutate'], + query: ApolloServerTestClient['query'], + con: Connection +let testEnv: { + mutate: ApolloServerTestClient['mutate'] + query: ApolloServerTestClient['query'] + con: Connection +} let creation: Contribution | void let admin: User let pendingContribution: any @@ -166,7 +167,7 @@ describe('ContributionResolver', () => { describe('createContribution', () => { describe('unauthenticated', () => { it('returns an error', async () => { - const { errors: errorObjects }: { errors: [GraphQLError] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: createContribution, variables: { amount: 100.0, memo: 'Test Contribution', creationDate: 'not-valid' }, }) @@ -191,7 +192,7 @@ describe('ContributionResolver', () => { it('throws error when memo length smaller than 5 chars', async () => { jest.clearAllMocks() const date = new Date() - const { errors: errorObjects }: { errors: [GraphQLError] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: createContribution, variables: { amount: 100.0, @@ -210,7 +211,7 @@ describe('ContributionResolver', () => { it('throws error when memo length greater than 255 chars', async () => { jest.clearAllMocks() const date = new Date() - const { errors: errorObjects }: { errors: [GraphQLError] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: createContribution, variables: { amount: 100.0, @@ -227,7 +228,7 @@ describe('ContributionResolver', () => { it('throws error when creationDate not-valid', async () => { jest.clearAllMocks() - const { errors: errorObjects }: { errors: [GraphQLError] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: createContribution, variables: { amount: 100.0, @@ -250,7 +251,7 @@ describe('ContributionResolver', () => { it('throws error when creationDate 3 month behind', async () => { jest.clearAllMocks() const date = new Date() - const { errors: errorObjects }: { errors: [GraphQLError] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: createContribution, variables: { amount: 100.0, @@ -298,7 +299,7 @@ describe('ContributionResolver', () => { describe('updateContribution', () => { describe('unauthenticated', () => { it('returns an error', async () => { - const { errors: errorObjects }: { errors: [GraphQLError] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: updateContribution, variables: { contributionId: 1, @@ -327,7 +328,7 @@ describe('ContributionResolver', () => { it('throws error', async () => { jest.clearAllMocks() const date = new Date() - const { errors: errorObjects }: { errors: [GraphQLError] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: updateContribution, variables: { contributionId: pendingContribution.data.createContribution.id, @@ -348,7 +349,7 @@ describe('ContributionResolver', () => { it('throws error', async () => { jest.clearAllMocks() const date = new Date() - const { errors: errorObjects }: { errors: [GraphQLError] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: updateContribution, variables: { contributionId: pendingContribution.data.createContribution.id, @@ -400,7 +401,7 @@ describe('ContributionResolver', () => { it('throws an error', async () => { jest.clearAllMocks() - const { errors: errorObjects }: { errors: [GraphQLError] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: updateContribution, variables: { contributionId: pendingContribution.data.createContribution.id, @@ -433,7 +434,7 @@ describe('ContributionResolver', () => { it('throws an error', async () => { jest.clearAllMocks() - const { errors: errorObjects }: { errors: GraphQLError[] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: adminUpdateContribution, variables: { id: pendingContribution.data.createContribution.id, @@ -512,7 +513,7 @@ describe('ContributionResolver', () => { it('throws an error', async () => { jest.clearAllMocks() - const { errors: errorObjects }: { errors: GraphQLError[] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: updateContribution, variables: { contributionId: pendingContribution.data.createContribution.id, @@ -541,7 +542,7 @@ describe('ContributionResolver', () => { it('throws an error', async () => { jest.clearAllMocks() const date = new Date() - const { errors: errorObjects }: { errors: GraphQLError[] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: updateContribution, variables: { contributionId: pendingContribution.data.createContribution.id, @@ -564,7 +565,7 @@ describe('ContributionResolver', () => { it('updates contribution', async () => { const { data: { updateContribution: contribution }, - }: { data: { updateContribution: UnconfirmedContribution } } = await mutate({ + } = await mutate({ mutation: updateContribution, variables: { contributionId: pendingContribution.data.createContribution.id, @@ -603,7 +604,7 @@ describe('ContributionResolver', () => { describe('denyContribution', () => { describe('unauthenticated', () => { it('returns an error', async () => { - const { errors: errorObjects }: { errors: GraphQLError[] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: denyContribution, variables: { id: 1, @@ -626,7 +627,7 @@ describe('ContributionResolver', () => { }) it('returns an error', async () => { - const { errors: errorObjects }: { errors: GraphQLError[] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: denyContribution, variables: { id: 1, @@ -651,7 +652,7 @@ describe('ContributionResolver', () => { describe('wrong contribution id', () => { it('throws an error', async () => { jest.clearAllMocks() - const { errors: errorObjects }: { errors: GraphQLError[] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: denyContribution, variables: { id: -1, @@ -695,7 +696,7 @@ describe('ContributionResolver', () => { }, }) - const { errors: errorObjects }: { errors: GraphQLError[] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: denyContribution, variables: { id: contribution.data.createContribution.id, @@ -740,7 +741,7 @@ describe('ContributionResolver', () => { variables: { email: 'peter@lustig.de', password: 'Aa12345_' }, }) - const { errors: errorObjects }: { errors: GraphQLError[] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: denyContribution, variables: { id: contribution.data.createContribution.id, @@ -785,7 +786,7 @@ describe('ContributionResolver', () => { }, }) - const { errors: errorObjects }: { errors: GraphQLError[] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: denyContribution, variables: { id: contribution.data.createContribution.id, @@ -807,7 +808,7 @@ describe('ContributionResolver', () => { }) const { data: { denyContribution: isDenied }, - }: { data: { denyContribution: boolean } } = await mutate({ + } = await mutate({ mutation: denyContribution, variables: { id: contributionToDeny.data.createContribution.id, @@ -846,8 +847,8 @@ describe('ContributionResolver', () => { describe('deleteContribution', () => { describe('unauthenticated', () => { it('returns an error', async () => { - const { errors: errorObjects }: { errors: [GraphQLError] } = await mutate({ - query: deleteContribution, + const { errors: errorObjects } = await mutate({ + mutation: deleteContribution, variables: { id: -1, }, @@ -871,7 +872,7 @@ describe('ContributionResolver', () => { describe('wrong contribution id', () => { it('returns an error', async () => { jest.clearAllMocks() - const { errors: errorObjects }: { errors: [GraphQLError] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: deleteContribution, variables: { id: -1, @@ -899,7 +900,7 @@ describe('ContributionResolver', () => { }) it('returns an error', async () => { - const { errors: errorObjects }: { errors: [GraphQLError] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: deleteContribution, variables: { id: contributionToDelete.data.createContribution.id, @@ -935,7 +936,7 @@ describe('ContributionResolver', () => { it('deletes successfully', async () => { const { data: { deleteContribution: isDenied }, - }: { data: { deleteContribution: boolean } } = await mutate({ + } = await mutate({ mutation: deleteContribution, variables: { id: contributionToDelete.data.createContribution.id, @@ -974,7 +975,7 @@ describe('ContributionResolver', () => { mutation: login, variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, }) - const { errors: errorObjects }: { errors: [GraphQLError] } = await mutate({ + const { errors: errorObjects } = await mutate({ mutation: deleteContribution, variables: { id: contributionToConfirm.data.createContribution.id, @@ -998,7 +999,7 @@ describe('ContributionResolver', () => { describe('listContributions', () => { describe('unauthenticated', () => { it('returns an error', async () => { - const { errors: errorObjects }: { errors: [GraphQLError] } = await query({ + const { errors: errorObjects } = await query({ query: listContributions, variables: { currentPage: 1, @@ -1026,7 +1027,7 @@ describe('ContributionResolver', () => { it('returns creations', async () => { const { data: { listContributions: contributionListResult }, - }: { data: { listContributions: ContributionListResult } } = await query({ + } = await query({ query: listContributions, variables: { currentPage: 1, @@ -1078,7 +1079,7 @@ describe('ContributionResolver', () => { it('returns only unconfirmed creations', async () => { const { data: { listContributions: contributionListResult }, - }: { data: { listContributions: ContributionListResult } } = await query({ + } = await query({ query: listContributions, variables: { currentPage: 1, @@ -1128,7 +1129,7 @@ describe('ContributionResolver', () => { describe('listAllContribution', () => { describe('unauthenticated', () => { it('returns an error', async () => { - const { errors: errorObjects }: { errors: [GraphQLError] } = await query({ + const { errors: errorObjects } = await query({ query: listAllContributions, variables: { currentPage: 1, @@ -1154,7 +1155,7 @@ describe('ContributionResolver', () => { }) it('throws an error with "NOT_VALID" in statusFilter', async () => { - const { errors: errorObjects }: { errors: [GraphQLError | UserInputError] } = await query({ + const { errors: errorObjects } = await query({ query: listAllContributions, variables: { currentPage: 1, @@ -1171,7 +1172,7 @@ describe('ContributionResolver', () => { }) it('throws an error with a null in statusFilter', async () => { - const { errors: errorObjects }: { errors: [Error] } = await query({ + const { errors: errorObjects } = await query({ query: listAllContributions, variables: { currentPage: 1, @@ -1188,7 +1189,7 @@ describe('ContributionResolver', () => { }) it('throws an error with null and "NOT_VALID" in statusFilter', async () => { - const { errors: errorObjects }: { errors: [Error] } = await query({ + const { errors: errorObjects } = await query({ query: listAllContributions, variables: { currentPage: 1, @@ -1210,7 +1211,7 @@ describe('ContributionResolver', () => { it('returns all contributions without statusFilter', async () => { const { data: { listAllContributions: contributionListObject }, - }: { data: { listAllContributions: ContributionListResult } } = await query({ + } = await query({ query: listAllContributions, variables: { currentPage: 1, @@ -1274,7 +1275,7 @@ describe('ContributionResolver', () => { it('returns all contributions for statusFilter = null', async () => { const { data: { listAllContributions: contributionListObject }, - }: { data: { listAllContributions: ContributionListResult } } = await query({ + } = await query({ query: listAllContributions, variables: { currentPage: 1, @@ -1339,7 +1340,7 @@ describe('ContributionResolver', () => { it('returns all contributions for statusFilter = []', async () => { const { data: { listAllContributions: contributionListObject }, - }: { data: { listAllContributions: ContributionListResult } } = await query({ + } = await query({ query: listAllContributions, variables: { currentPage: 1, @@ -1404,7 +1405,7 @@ describe('ContributionResolver', () => { it('returns all CONFIRMED contributions', async () => { const { data: { listAllContributions: contributionListObject }, - }: { data: { listAllContributions: ContributionListResult } } = await query({ + } = await query({ query: listAllContributions, variables: { currentPage: 1, @@ -1454,7 +1455,7 @@ describe('ContributionResolver', () => { it('returns all PENDING contributions', async () => { const { data: { listAllContributions: contributionListObject }, - }: { data: { listAllContributions: ContributionListResult } } = await query({ + } = await query({ query: listAllContributions, variables: { currentPage: 1, @@ -1492,7 +1493,7 @@ describe('ContributionResolver', () => { it('returns all IN_PROGRESS Creation', async () => { const { data: { listAllContributions: contributionListObject }, - }: { data: { listAllContributions: ContributionListResult } } = await query({ + } = await query({ query: listAllContributions, variables: { currentPage: 1, @@ -1530,7 +1531,7 @@ describe('ContributionResolver', () => { it('returns all DENIED Creation', async () => { const { data: { listAllContributions: contributionListObject }, - }: { data: { listAllContributions: ContributionListResult } } = await query({ + } = await query({ query: listAllContributions, variables: { currentPage: 1, @@ -1574,7 +1575,7 @@ describe('ContributionResolver', () => { it('does not return any DELETED Creation', async () => { const { data: { listAllContributions: contributionListObject }, - }: { data: { listAllContributions: ContributionListResult } } = await query({ + } = await query({ query: listAllContributions, variables: { currentPage: 1, @@ -1593,7 +1594,7 @@ describe('ContributionResolver', () => { it('returns all CONFIRMED and PENDING Creation', async () => { const { data: { listAllContributions: contributionListObject }, - }: { data: { listAllContributions: ContributionListResult } } = await query({ + } = await query({ query: listAllContributions, variables: { currentPage: 1, @@ -2676,7 +2677,7 @@ describe('ContributionResolver', () => { it('returns 17 creations in total', async () => { const { data: { adminListContributions: contributionListObject }, - }: { data: { adminListContributions: ContributionListResult } } = await query({ + } = await query({ query: adminListContributions, }) expect(contributionListObject.contributionList).toHaveLength(17) @@ -2843,7 +2844,7 @@ describe('ContributionResolver', () => { it('returns two pending creations with page size set to 2', async () => { const { data: { adminListContributions: contributionListObject }, - }: { data: { adminListContributions: ContributionListResult } } = await query({ + } = await query({ query: adminListContributions, variables: { currentPage: 1, diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index 696ed9ea7..accdeacf7 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/restrict-template-expressions */ import { IsNull, getConnection } from '@dbTools/typeorm' import { Contribution as DbContribution } from '@entity/Contribution' import { ContributionMessage } from '@entity/ContributionMessage' @@ -230,11 +229,11 @@ export class ContributionResolver { contributionMessage.createdAt = contributionToUpdate.updatedAt ? contributionToUpdate.updatedAt : contributionToUpdate.createdAt - const changeMessage = `${contributionToUpdate.contributionDate} + const changeMessage = `${contributionToUpdate.contributionDate.toString()} --- ${contributionToUpdate.memo} --- - ${contributionToUpdate.amount}` + ${contributionToUpdate.amount.toString()}` contributionMessage.message = changeMessage contributionMessage.isModerator = false contributionMessage.userId = user.id @@ -260,7 +259,7 @@ export class ContributionResolver { @Ctx() context: Context, ): Promise { logger.info( - `adminCreateContribution(email=${email}, amount=${amount}, memo=${memo}, creationDate=${creationDate})`, + `adminCreateContribution(email=${email}, amount=${amount.toString()}, memo=${memo}, creationDate=${creationDate})`, ) const clientTimezoneOffset = getClientTimezoneOffset(context) if (!isValidDateString(creationDate)) { diff --git a/backend/src/graphql/resolver/EmailOptinCodes.test.ts b/backend/src/graphql/resolver/EmailOptinCodes.test.ts index 442c63c00..640faad17 100644 --- a/backend/src/graphql/resolver/EmailOptinCodes.test.ts +++ b/backend/src/graphql/resolver/EmailOptinCodes.test.ts @@ -1,10 +1,8 @@ -/* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ - +import { Connection } from '@dbTools/typeorm' import { User as DbUser } from '@entity/User' +import { ApolloServerTestClient } from 'apollo-server-testing' import { GraphQLError } from 'graphql' import { testEnvironment, cleanDB } from '@test/helpers' @@ -13,8 +11,14 @@ import { CONFIG } from '@/config' import { createUser, setPassword, forgotPassword } from '@/seeds/graphql/mutations' import { queryOptIn } from '@/seeds/graphql/queries' -let mutate: any, query: any, con: any -let testEnv: any +let mutate: ApolloServerTestClient['mutate'], + query: ApolloServerTestClient['query'], + con: Connection +let testEnv: { + mutate: ApolloServerTestClient['mutate'] + query: ApolloServerTestClient['query'] + con: Connection +} CONFIG.EMAIL_CODE_VALID_TIME = 1440 CONFIG.EMAIL_CODE_REQUEST_TIME = 10 diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.test.ts b/backend/src/graphql/resolver/TransactionLinkResolver.test.ts index cec7a1952..04df0dc86 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.test.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.test.ts @@ -1,16 +1,13 @@ -/* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/restrict-template-expressions */ -/* eslint-disable @typescript-eslint/unbound-method */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ +import { Connection } from '@dbTools/typeorm' import { ContributionLink as DbContributionLink } from '@entity/ContributionLink' import { Event as DbEvent } from '@entity/Event' import { Transaction } from '@entity/Transaction' import { User } from '@entity/User' import { UserContact } from '@entity/UserContact' +import { ApolloServerTestClient } from 'apollo-server-testing' import { Decimal } from 'decimal.js-light' import { GraphQLError } from 'graphql' @@ -45,8 +42,14 @@ import { transactionLinkCode } from './TransactionLinkResolver' jest.mock('@/util/TRANSACTIONS_LOCK') TRANSACTIONS_LOCK.acquire = jest.fn().mockResolvedValue(jest.fn()) -let mutate: any, query: any, con: any -let testEnv: any +let mutate: ApolloServerTestClient['mutate'], + query: ApolloServerTestClient['query'], + con: Connection +let testEnv: { + mutate: ApolloServerTestClient['mutate'] + query: ApolloServerTestClient['query'] + con: Connection +} let user: User diff --git a/backend/src/graphql/resolver/TransactionResolver.test.ts b/backend/src/graphql/resolver/TransactionResolver.test.ts index d7bb380e5..1a2f04838 100644 --- a/backend/src/graphql/resolver/TransactionResolver.test.ts +++ b/backend/src/graphql/resolver/TransactionResolver.test.ts @@ -1,13 +1,11 @@ -/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/unbound-method */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ +import { Connection } from '@dbTools/typeorm' import { Event as DbEvent } from '@entity/Event' import { Transaction } from '@entity/Transaction' import { User } from '@entity/User' +import { ApolloServerTestClient } from 'apollo-server-testing' import { Decimal } from 'decimal.js-light' import { GraphQLError } from 'graphql' @@ -27,13 +25,16 @@ import { garrickOllivander } from '@/seeds/users/garrick-ollivander' import { peterLustig } from '@/seeds/users/peter-lustig' import { stephenHawking } from '@/seeds/users/stephen-hawking' -let mutate: any, query: any, con: any -let testEnv: any +let mutate: ApolloServerTestClient['mutate'], con: Connection +let testEnv: { + mutate: ApolloServerTestClient['mutate'] + query: ApolloServerTestClient['query'] + con: Connection +} beforeAll(async () => { testEnv = await testEnvironment(logger) mutate = testEnv.mutate - query = testEnv.query con = testEnv.con await cleanDB() }) @@ -274,7 +275,7 @@ describe('send coins', () => { }) // login as admin - await query({ mutation: login, variables: peterData }) + await mutate({ mutation: login, variables: peterData }) // confirm the contribution await mutate({ @@ -283,7 +284,7 @@ describe('send coins', () => { }) // login as bob again - await query({ mutation: login, variables: bobData }) + await mutate({ mutation: login, variables: bobData }) }) afterAll(async () => { diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 77b08f0d6..d60ba7771 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -2,14 +2,14 @@ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/unbound-method */ /* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/no-unsafe-argument */ +import { Connection } from '@dbTools/typeorm' import { Event as DbEvent } from '@entity/Event' import { TransactionLink } from '@entity/TransactionLink' import { User } from '@entity/User' import { UserContact } from '@entity/UserContact' +import { ApolloServerTestClient } from 'apollo-server-testing' import { GraphQLError } from 'graphql' import { v4 as uuidv4, validate as validateUUID, version as versionUUID } from 'uuid' @@ -88,8 +88,14 @@ jest.mock('@/apis/KlicktippController', () => { let admin: User let user: User -let mutate: any, query: any, con: any -let testEnv: any +let mutate: ApolloServerTestClient['mutate'], + query: ApolloServerTestClient['query'], + con: Connection +let testEnv: { + mutate: ApolloServerTestClient['mutate'] + query: ApolloServerTestClient['query'] + con: Connection +} beforeAll(async () => { testEnv = await testEnvironment(logger, localization) @@ -236,7 +242,7 @@ describe('UserResolver', () => { }) describe('user already exists', () => { - let mutation: User + let mutation: any beforeAll(async () => { mutation = await mutate({ mutation: createUser, variables }) }) @@ -638,7 +644,7 @@ describe('UserResolver', () => { publisherId: 1234, } - let result: User + let result: any afterAll(async () => { await cleanDB() diff --git a/backend/src/graphql/resolver/semaphore.test.ts b/backend/src/graphql/resolver/semaphore.test.ts index f4d87f467..eb4052e1f 100644 --- a/backend/src/graphql/resolver/semaphore.test.ts +++ b/backend/src/graphql/resolver/semaphore.test.ts @@ -1,9 +1,8 @@ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable @typescript-eslint/restrict-template-expressions */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ +import { Connection } from '@dbTools/typeorm' +import { ApolloServerTestClient } from 'apollo-server-testing' import { Decimal } from 'decimal.js-light' import { cleanDB, testEnvironment, contributionDateFormatter } from '@test/helpers' @@ -23,8 +22,12 @@ import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg' import { bobBaumeister } from '@/seeds/users/bob-baumeister' import { peterLustig } from '@/seeds/users/peter-lustig' -let mutate: any, con: any -let testEnv: any +let mutate: ApolloServerTestClient['mutate'], con: Connection +let testEnv: { + mutate: ApolloServerTestClient['mutate'] + query: ApolloServerTestClient['query'] + con: Connection +} beforeAll(async () => { testEnv = await testEnvironment() diff --git a/backend/src/graphql/resolver/util/creations.test.ts b/backend/src/graphql/resolver/util/creations.test.ts index 0b05099c8..25d8a45c2 100644 --- a/backend/src/graphql/resolver/util/creations.test.ts +++ b/backend/src/graphql/resolver/util/creations.test.ts @@ -1,11 +1,7 @@ -/* eslint-disable @typescript-eslint/no-unsafe-call */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ +import { Connection } from '@dbTools/typeorm' import { Contribution } from '@entity/Contribution' import { User } from '@entity/User' +import { ApolloServerTestClient } from 'apollo-server-testing' import { testEnvironment, cleanDB, contributionDateFormatter } from '@test/helpers' @@ -16,8 +12,12 @@ import { peterLustig } from '@/seeds/users/peter-lustig' import { getUserCreation } from './creations' -let mutate: any, con: any -let testEnv: any +let mutate: ApolloServerTestClient['mutate'], con: Connection +let testEnv: { + mutate: ApolloServerTestClient['mutate'] + query: ApolloServerTestClient['query'] + con: Connection +} beforeAll(async () => { testEnv = await testEnvironment() diff --git a/backend/src/index.ts b/backend/src/index.ts index b522e1ff5..86f78326d 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ import { CONFIG } from './config' import { startValidateCommunities } from './federation/validateCommunities' import { createServer } from './server/createServer' diff --git a/backend/src/seeds/factory/creation.ts b/backend/src/seeds/factory/creation.ts index 6a3aaa3e7..5b4c56c57 100644 --- a/backend/src/seeds/factory/creation.ts +++ b/backend/src/seeds/factory/creation.ts @@ -2,9 +2,6 @@ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/unbound-method */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ - import { Contribution } from '@entity/Contribution' import { Transaction } from '@entity/Transaction' import { ApolloServerTestClient } from 'apollo-server-testing' @@ -12,7 +9,6 @@ import { ApolloServerTestClient } from 'apollo-server-testing' import { findUserByEmail } from '@/graphql/resolver/UserResolver' import { CreationInterface } from '@/seeds/creation/CreationInterface' import { login, createContribution, confirmContribution } from '@/seeds/graphql/mutations' -// import CONFIG from '@/config/index' export const nMonthsBefore = (date: Date, months = 1): string => { return new Date(date.getFullYear(), date.getMonth() - months, 1).toISOString() diff --git a/backend/src/seeds/index.ts b/backend/src/seeds/index.ts index 8ca42fc79..c2533765e 100644 --- a/backend/src/seeds/index.ts +++ b/backend/src/seeds/index.ts @@ -1,10 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-call */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ - import { entities } from '@entity/index' import { createTestClient } from 'apollo-server-testing' import { name, internet, datatype } from 'faker' @@ -43,10 +36,12 @@ export const cleanDB = async () => { } } -const resetEntity = async (entity: any) => { +const [entityTypes] = entities + +const resetEntity = async (entity: typeof entityTypes) => { const items = await entity.find({ withDeleted: true }) if (items.length > 0) { - const ids = items.map((i: any) => i.id) + const ids = items.map((i) => i.id) await entity.delete(ids) } } diff --git a/backend/src/server/LogError.test.ts b/backend/src/server/LogError.test.ts index b013a31ce..115567a8b 100644 --- a/backend/src/server/LogError.test.ts +++ b/backend/src/server/LogError.test.ts @@ -1,5 +1,4 @@ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/unbound-method */ import { logger } from '@test/testSetup' import { LogError } from './LogError' diff --git a/backend/src/server/context.ts b/backend/src/server/context.ts index a52c979e3..c7e59365b 100644 --- a/backend/src/server/context.ts +++ b/backend/src/server/context.ts @@ -13,6 +13,7 @@ export interface Context { role?: Role user?: dbUser clientTimezoneOffset?: number + gradidoID?: string // hack to use less DB calls for Balance Resolver lastTransaction?: dbTransaction transactionCount?: number diff --git a/backend/src/server/plugins.ts b/backend/src/server/plugins.ts index cb0e4e443..1da062b83 100644 --- a/backend/src/server/plugins.ts +++ b/backend/src/server/plugins.ts @@ -5,7 +5,6 @@ /* eslint-disable @typescript-eslint/no-unsafe-return */ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ - import clonedeep from 'lodash.clonedeep' const setHeadersPlugin = { diff --git a/backend/test/helpers.ts b/backend/test/helpers.ts index b43dc2d96..d42db959f 100644 --- a/backend/test/helpers.ts +++ b/backend/test/helpers.ts @@ -1,12 +1,4 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/no-unsafe-call */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/unbound-method */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ - import { entities } from '@entity/index' import { createTestClient } from 'apollo-server-testing' @@ -15,6 +7,7 @@ import { createServer } from '@/server/createServer' import { i18n, logger } from './testSetup' export const headerPushMock = jest.fn((t) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access context.token = t.value }) @@ -34,7 +27,7 @@ export const cleanDB = async () => { } } -export const testEnvironment = async (testLogger: any = logger, testI18n: any = i18n) => { +export const testEnvironment = async (testLogger = logger, testI18n = i18n) => { const server = await createServer(context, testLogger, testI18n) const con = server.con const testClient = createTestClient(server.apollo) @@ -43,10 +36,12 @@ export const testEnvironment = async (testLogger: any = logger, testI18n: any = return { mutate, query, con } } -export const resetEntity = async (entity: any) => { +const [entityTypes] = entities + +export const resetEntity = async (entity: typeof entityTypes) => { const items = await entity.find({ withDeleted: true }) if (items.length > 0) { - const ids = items.map((i: any) => i.id) + const ids = items.map((i) => i.id) await entity.delete(ids) } } diff --git a/backend/test/testSetup.ts b/backend/test/testSetup.ts index 12bd25d64..a61556798 100644 --- a/backend/test/testSetup.ts +++ b/backend/test/testSetup.ts @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-return */ import { CONFIG } from '@/config' import { i18n } from '@/server/localization' import { backendLogger as logger } from '@/server/logger' @@ -10,7 +8,7 @@ CONFIG.EMAIL_TEST_MODUS = false jest.setTimeout(1000000) jest.mock('@/server/logger', () => { - const originalModule = jest.requireActual('@/server/logger') + const originalModule = jest.requireActual('@/server/logger') return { __esModule: true, ...originalModule, @@ -27,7 +25,7 @@ jest.mock('@/server/logger', () => { }) jest.mock('@/server/localization', () => { - const originalModule = jest.requireActual('@/server/localization') + const originalModule = jest.requireActual('@/server/localization') return { __esModule: true, ...originalModule, diff --git a/deployment/bare_metal/setup.md b/deployment/bare_metal/setup.md index 627aa4a2d..9cbc4e2e3 100644 --- a/deployment/bare_metal/setup.md +++ b/deployment/bare_metal/setup.md @@ -198,11 +198,9 @@ Follow the commands in `./install.sh` as installation pattern. ## Define Cronjob To Compensate Yarn Output In `/tmp` -`yarn` creates output in `/tmp` directory, which must be deleted regularly and will be done per Cron-Job. +`yarn` creates output in `/tmp` directory. This output is generated whenever `yarn start` is called. This is especially problematic on staging systems where instable versions are automatically deployed which can lead to an ever restarting, hence generating a lot of yarn output. -### On `stage1` - -An hourly job is necessary on `stage1` by setting the following job in the `crontab` for the `gradido` user. +To solve this you can install the following hourly cron using `crontab` as `gradido` user. Run: @@ -213,24 +211,11 @@ crontab -e This opens the crontab in edit-mode and insert the following entry: ```bash -0 * * * * find /tmp -name "yarn--*" -cmin +60 -exec rm -r {} \; > /dev/null +0 * * * * find /tmp -name "yarn--*" -exec rm -r {} \; > /dev/null + ``` -### On `stage2` - -A daily job is necessary on `stage2` by setting the following job in the `crontab` for the `gradido` user. - -Run: - -```bash -crontab -e -``` - -This opens the `crontab` in edit-mode and insert the following entry: - -```bash -0 4 * * * find /tmp -name "yarn--*" -ctime +1 -exec rm -r {} \; > /dev/null -``` +For production systems this is not needed by default since the yarn output is deleted when `start.sh` is executed. If the service runs stable and does not restart frequently, the yarn output to the tmp folder scales with the amount of services running. ## Define Cronjob To start backup script automatically diff --git a/mariadb/Dockerfile b/mariadb/Dockerfile index 07d2ba368..d3d5937d0 100644 --- a/mariadb/Dockerfile +++ b/mariadb/Dockerfile @@ -2,8 +2,3 @@ # mariadb server ######################################################################################################### FROM mariadb/server:10.5 as mariadb_server - -# ENV DOCKER_WORKDIR="/docker-entrypoint-initdb.d" - -# RUN mkdir -p ${DOCKER_WORKDIR} -# WORKDIR ${DOCKER_WORKDIR}