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 @@
+
+