diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 526c15cca..15a736630 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -47,7 +47,7 @@ jobs: ########################################################################## - name: Admin | Build `test` image run: | - docker build --target test -t "gradido/admin:test" admin/ + docker build --target test -t "gradido/admin:test" admin/ --build-arg NODE_ENV="test" docker save "gradido/admin:test" > /tmp/admin.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -294,6 +294,35 @@ jobs: - name: Admin Interface | Lint run: docker run --rm gradido/admin:test yarn run lint + ############################################################################## + # JOB: LOCALES ADMIN ###################################################### + ############################################################################## + locales_admin: + name: Locales - Admin + runs-on: ubuntu-latest + needs: [build_test_admin] + steps: + ########################################################################## + # CHECKOUT CODE ########################################################## + ########################################################################## + - name: Checkout code + uses: actions/checkout@v2 + ########################################################################## + # DOWNLOAD DOCKER IMAGE ################################################## + ########################################################################## + - name: Download Docker Image (Admin Interface) + uses: actions/download-artifact@v2 + with: + name: docker-admin-test + path: /tmp + - name: Load Docker Image + run: docker load < /tmp/admin.tar + ########################################################################## + # LOCALES FRONTEND ####################################################### + ########################################################################## + - name: admin | Locales + run: docker run --rm gradido/admin:test yarn run locales + ############################################################################## # JOB: LINT BACKEND ########################################################## ############################################################################## @@ -480,7 +509,7 @@ jobs: - name: backend | docker-compose run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps mariadb database - name: backend Unit tests | test - run: cd database && yarn && cd ../backend && yarn && yarn test + run: cd database && yarn && yarn build && cd ../backend && yarn && yarn CI_worklfow_test # run: docker-compose -f docker-compose.yml -f docker-compose.test.yml exec -T backend yarn test ########################################################################## # COVERAGE CHECK BACKEND ################################################# @@ -491,7 +520,7 @@ jobs: report_name: Coverage Backend type: lcov result_path: ./backend/coverage/lcov.info - min_coverage: 37 + min_coverage: 40 token: ${{ github.token }} ############################################################################## diff --git a/.gitignore b/.gitignore index c09811443..5682953d4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ *.log /node_modules/* -.vscode messages.pot nbproject .metadata diff --git a/.vscode/extensions.json b/.vscode/extensions.json index a6dc06683..9b0d3b79e 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,6 +2,7 @@ "recommendations": [ "streetsidesoftware.code-spell-checker", "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode" + "esbenp.prettier-vscode", + "hediet.vscode-drawio" ] } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..3b6641073 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "git.ignoreLimitWarning": true +} \ No newline at end of file diff --git a/admin/Dockerfile b/admin/Dockerfile index 44ee4850c..41f986f87 100644 --- a/admin/Dockerfile +++ b/admin/Dockerfile @@ -13,7 +13,7 @@ ENV BUILD_VERSION="0.0.0.0" ## We cannot do `$(git rev-parse --short HEAD)` here so we default to 0000000 ENV BUILD_COMMIT="0000000" ## SET NODE_ENV -ENV NODE_ENV="production" +ARG NODE_ENV="production" ## App relevant Envs ENV PORT="8080" diff --git a/admin/babel.config.js b/admin/babel.config.js index 80b148fd1..742388ea3 100644 --- a/admin/babel.config.js +++ b/admin/babel.config.js @@ -1,4 +1,15 @@ -module.exports = { - presets: ['@babel/preset-env'], - plugins: ['transform-require-context'], +module.exports = function (api) { + api.cache(true) + + const presets = ['@babel/preset-env'] + const plugins = [] + + if (process.env.NODE_ENV === 'test') { + plugins.push('transform-require-context') + } + + return { + presets, + plugins, + } } diff --git a/admin/package.json b/admin/package.json index 9d70c0b06..c94d0a2b0 100644 --- a/admin/package.json +++ b/admin/package.json @@ -12,7 +12,8 @@ "dev": "yarn run serve", "build": "vue-cli-service build", "lint": "eslint --ext .js,.vue .", - "test": "jest --coverage" + "test": "jest --coverage", + "locales": "scripts/missing-keys.sh && scripts/sort.sh" }, "dependencies": { "@babel/core": "^7.15.8", diff --git a/admin/scripts/missing-keys.sh b/admin/scripts/missing-keys.sh new file mode 100755 index 000000000..6dbaee897 --- /dev/null +++ b/admin/scripts/missing-keys.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +ROOT_DIR=$(dirname "$0")/.. + +sorting="jq -f $ROOT_DIR/scripts/sort_filter.jq" +english="$sorting $ROOT_DIR/src/locales/en.json" +german="$sorting $ROOT_DIR/src/locales/de.json" +listPaths="jq -c 'path(..)|[.[]|tostring]|join(\".\")'" +diffString="<( $english | $listPaths ) <( $german | $listPaths )" +if eval "diff -q $diffString"; +then + : # all good +else + eval "diff -y $diffString | grep '[|<>]'"; + printf "\nEnglish and German translation keys do not match, see diff above.\n" + exit 1 +fi diff --git a/admin/scripts/sort.sh b/admin/scripts/sort.sh new file mode 100755 index 000000000..e5c5c41c6 --- /dev/null +++ b/admin/scripts/sort.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +ROOT_DIR=$(dirname "$0")/.. + +tmp=$(mktemp) +exit_code=0 + +for locale_file in $ROOT_DIR/src/locales/*.json +do + jq -f $(dirname "$0")/sort_filter.jq $locale_file > "$tmp" + if [ "$*" == "--fix" ] + then + mv "$tmp" $locale_file + else + if diff -q "$tmp" $locale_file > /dev/null ; + then + : # all good + else + exit_code=$? + echo "$(basename -- $locale_file) is not sorted by keys" + fi + fi +done + +exit $exit_code diff --git a/admin/scripts/sort_filter.jq b/admin/scripts/sort_filter.jq new file mode 100644 index 000000000..9d108f8f0 --- /dev/null +++ b/admin/scripts/sort_filter.jq @@ -0,0 +1,13 @@ +def walk(f): + . as $in + | if type == "object" then + reduce keys_unsorted[] as $key + ( {}; . + { ($key): ($in[$key] | walk(f)) } ) | f + elif type == "array" then map( walk(f) ) | f + else f + end; + +def keys_sort_by(f): + to_entries | sort_by(.key|f ) | from_entries; + +walk(if type == "object" then keys_sort_by(ascii_upcase) else . end) \ No newline at end of file diff --git a/admin/src/components/ConfirmRegisterMailFormular.spec.js b/admin/src/components/ConfirmRegisterMailFormular.spec.js new file mode 100644 index 000000000..705a185a3 --- /dev/null +++ b/admin/src/components/ConfirmRegisterMailFormular.spec.js @@ -0,0 +1,72 @@ +import { mount } from '@vue/test-utils' +import ConfirmRegisterMailFormular from './ConfirmRegisterMailFormular.vue' + +const localVue = global.localVue + +const apolloMutateMock = jest.fn().mockResolvedValue() +const toastSuccessMock = jest.fn() +const toastErrorMock = jest.fn() + +const mocks = { + $t: jest.fn((t) => t), + $apollo: { + mutate: apolloMutateMock, + }, + $toasted: { + success: toastSuccessMock, + error: toastErrorMock, + }, +} + +const propsData = { + email: 'bob@baumeister.de', + dateLastSend: '', +} + +describe('ConfirmRegisterMailFormular', () => { + let wrapper + + const Wrapper = () => { + return mount(ConfirmRegisterMailFormular, { localVue, mocks, propsData }) + } + + describe('mount', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('has a DIV element with the class.component-confirm-register-mail', () => { + expect(wrapper.find('.component-confirm-register-mail').exists()).toBeTruthy() + }) + + describe('send register mail with success', () => { + beforeEach(() => { + wrapper.find('button.test-button').trigger('click') + }) + + it('calls the API with email', () => { + expect(apolloMutateMock).toBeCalledWith( + expect.objectContaining({ + variables: { email: 'bob@baumeister.de' }, + }), + ) + }) + + it('toasts a success message', () => { + expect(toastSuccessMock).toBeCalledWith('unregister_mail.success') + }) + }) + + describe('send register mail with error', () => { + beforeEach(() => { + apolloMutateMock.mockRejectedValue({ message: 'OUCH!' }) + wrapper = Wrapper() + wrapper.find('button.test-button').trigger('click') + }) + + it('toasts an error message', () => { + expect(toastErrorMock).toBeCalledWith('unregister_mail.error') + }) + }) + }) +}) diff --git a/admin/src/components/ConfirmRegisterMailFormular.vue b/admin/src/components/ConfirmRegisterMailFormular.vue new file mode 100644 index 000000000..5052a8a3e --- /dev/null +++ b/admin/src/components/ConfirmRegisterMailFormular.vue @@ -0,0 +1,56 @@ + + + diff --git a/admin/src/components/ContentFooter.vue b/admin/src/components/ContentFooter.vue index ade4e0a83..1e7e20f9e 100644 --- a/admin/src/components/ContentFooter.vue +++ b/admin/src/components/ContentFooter.vue @@ -3,8 +3,8 @@

- Gradido Akademie Adminkonsole -
Version: 0.0.1
+ {{ $t('gradido_admin_footer') }} +
Version: 1.0.0
diff --git a/admin/src/components/CreationFormular.spec.js b/admin/src/components/CreationFormular.spec.js index f6bd1a924..388ab6aa9 100644 --- a/admin/src/components/CreationFormular.spec.js +++ b/admin/src/components/CreationFormular.spec.js @@ -21,6 +21,7 @@ const toastedErrorMock = jest.fn() const toastedSuccessMock = jest.fn() const mocks = { + $t: jest.fn((t) => t), $moment: jest.fn(() => { return { format: jest.fn((m) => m), @@ -176,8 +177,8 @@ describe('CreationFormular', () => { await wrapper.find('.test-submit').trigger('click') }) - it('sends ... to apollo', () => { - expect(toastedErrorMock).toBeCalled() + it('toasts an error message', () => { + expect(toastedErrorMock).toBeCalledWith('Ouch!') }) }) diff --git a/admin/src/components/CreationFormular.vue b/admin/src/components/CreationFormular.vue index d73ea3c81..af966a952 100644 --- a/admin/src/components/CreationFormular.vue +++ b/admin/src/components/CreationFormular.vue @@ -1,9 +1,10 @@