diff --git a/.gitignore b/.gitignore index b02b9d6ec..f771e49f4 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ package-lock.json /deployment/bare_metal/nginx/update-page/updating.html /deployment/bare_metal/log /deployment/bare_metal/backup +/.nvmrc diff --git a/admin/.gitignore b/admin/.gitignore index 6bb62f667..d78b066c1 100644 --- a/admin/.gitignore +++ b/admin/.gitignore @@ -9,4 +9,5 @@ dist/ coverage/ # emacs -*~ \ No newline at end of file +*~ +/.nvmrc diff --git a/backend/.gitignore b/backend/.gitignore index 147e82849..2381e9abc 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -5,4 +5,5 @@ package-json.lock coverage # emacs -*~ \ No newline at end of file +*~ +/.nvmrc diff --git a/database/.gitignore b/database/.gitignore index bce5da58f..d1bd69ed3 100644 --- a/database/.gitignore +++ b/database/.gitignore @@ -24,4 +24,5 @@ package-lock.json coverage/ -*~ \ No newline at end of file +*~ +/.nvmrc diff --git a/deployment/bare_metal/setup.md b/deployment/bare_metal/setup.md index f39228879..f43a3d655 100644 --- a/deployment/bare_metal/setup.md +++ b/deployment/bare_metal/setup.md @@ -2,6 +2,9 @@ # This assums you have root access via ssh to your cleanly setup server # Furthermore this assumes you have debian (11 64bit) running +# Check your (Sub-)Domain with your Provider. +# In this document gddhost.tld refers to your chosen domain + > ssh root@gddhost.tld # change root default shell @@ -87,9 +90,10 @@ # Adjust .env # NOTE ';' can not be part of any value +# The Github Secret is Created on Github in Settimgs -> Webhooks > cd gradido/deployment/bare_metal > cp .env.dist .env > nano .env >> Adjust values accordingly # TODO the install.sh is not yet ready to run directly - consider to use it as pattern to do it manually -> ./install.sh \ No newline at end of file +> ./install.sh diff --git a/frontend/.gitignore b/frontend/.gitignore index b19667d17..2054a5cd5 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -23,4 +23,5 @@ package-lock.json coverage/ -*~ \ No newline at end of file +*~ +/.nvmrc diff --git a/frontend/src/components/Message/Message.spec.js b/frontend/src/components/Message/Message.spec.js index 03efa8026..1d911812f 100644 --- a/frontend/src/components/Message/Message.spec.js +++ b/frontend/src/components/Message/Message.spec.js @@ -30,14 +30,34 @@ describe('Message', () => { expect(wrapper.find('div.header').exists()).toBe(true) }) - it('renders title, subtitle, and button text', () => { - expect(wrapper.find('.test-message-headline').text()).toBe('Headline text') - expect(wrapper.find('.test-message-subtitle').text()).toBe('Subtitle text') - expect(wrapper.find('.test-message-button').text()).toBe('login') + describe('with button', () => { + it('renders title, subtitle, and button text', () => { + expect(wrapper.find('.test-message-headline').text()).toBe('Headline text') + expect(wrapper.find('.test-message-subtitle').text()).toBe('Subtitle text') + expect(wrapper.find('.test-message-button').text()).toBe('login') + }) + + it('button link redirects to /login', () => { + expect(wrapper.find('a.btn').attributes('href')).toBe('/login') + }) }) - it('button link redirects to /login', () => { - expect(wrapper.find('a.btn').attributes('href')).toBe('/login') + describe('without button', () => { + beforeEach(() => { + wrapper.setProps({ + buttonText: null, + linkTo: null, + }) + }) + + it('renders title, subtitle, and button text', () => { + expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.title') + expect(wrapper.find('.test-message-subtitle').text()).toBe('site.thx.email') + }) + + it('button is not shown', () => { + expect(wrapper.find('.test-message-button').exists()).toBe(false) + }) }) }) }) diff --git a/frontend/src/components/Message/Message.vue b/frontend/src/components/Message/Message.vue index a8a7c2800..caf2465f9 100644 --- a/frontend/src/components/Message/Message.vue +++ b/frontend/src/components/Message/Message.vue @@ -6,12 +6,7 @@

{{ headline }}

{{ subtitle }}


- + {{ buttonText }} @@ -28,17 +23,11 @@ export default { subtitle: { type: String, required: true }, buttonText: { type: String, required: false, default: null }, linkTo: { type: String, required: false, default: null }, - callback: { type: Function, required: false, default: null }, code: { type: String, required: false, default: null }, // Wolle: to be removed by adding it directly to the "linkTo" }, - methods: { - optionalCallback() { - if (this.callback) { - this.callback() - } - }, + computed: { showButton() { - return this.buttonText && (this.linkTo || this.callback) + return this.buttonText && this.linkTo }, buttonLinkTo() { return this.linkTo ? this.linkTo + (this.code ? `/${this.code}` : '') : null diff --git a/frontend/src/components/Transactions/TransactionLinkSummary.spec.js b/frontend/src/components/Transactions/TransactionLinkSummary.spec.js index b60cc60f8..ba07f7aff 100644 --- a/frontend/src/components/Transactions/TransactionLinkSummary.spec.js +++ b/frontend/src/components/Transactions/TransactionLinkSummary.spec.js @@ -227,6 +227,36 @@ describe('TransactionLinkSummary', () => { fetchPolicy: 'network-only', }) }) + + describe('close transaction link list', () => { + beforeEach(async () => { + wrapper.find('div.transaction-link-details').trigger('click') + }) + describe('reopen transaction link list', () => { + beforeEach(async () => { + jest.clearAllMocks() + wrapper.find('div.transaction-link-details').trigger('click') + }) + + it('calls the API once', () => { + expect(apolloQueryMock).toBeCalledTimes(1) + }) + + it('calls the API with current page one', () => { + expect(apolloQueryMock).toBeCalledWith({ + query: listTransactionLinks, + variables: { + currentPage: 1, + }, + fetchPolicy: 'network-only', + }) + }) + + it('has four transactionLinks', () => { + expect(wrapper.vm.transactionLinks).toHaveLength(4) + }) + }) + }) }) }) diff --git a/frontend/src/components/Transactions/TransactionLinkSummary.vue b/frontend/src/components/Transactions/TransactionLinkSummary.vue index c24410924..cbce57029 100644 --- a/frontend/src/components/Transactions/TransactionLinkSummary.vue +++ b/frontend/src/components/Transactions/TransactionLinkSummary.vue @@ -84,7 +84,11 @@ export default { this.visible = false } else { this.transactionLinks = [] - this.updateListTransactionLinks() + if (this.currentPage === 1) { + this.updateListTransactionLinks() + } else { + this.currentPage = 1 + } this.visible = true } }, diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index ea288819f..0d496bc3f 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -35,6 +35,7 @@ "error": "Fehler!", "no-account": "Leider konnten wir keinen (aktivierten) Account mit diesen Daten finden.", "no-transactionlist": "Es gab leider einen Fehler. Es wurden keine Transaktionen vom Server übermittelt.", + "no-user": "Kein Benutzer mit diesen Anmeldedaten.", "session-expired": "Die Sitzung wurde aus Sicherheitsgründen beendet.", "unknown-error": "Unbekanter Fehler: ", "user-already-exists": "Ein Benutzer mit diesen Daten existiert bereits." @@ -215,9 +216,6 @@ "new_wallet": "Neues Konto erstellen", "signin": "Anmelden" }, - "register": { - "message-button-text": "Alles klar" - }, "signup": { "agree": "Ich stimme der Datenschutzerklärung zu.", "dont_match": "Die Passwörter stimmen nicht überein.", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index f5e412086..f5009e04f 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -35,6 +35,7 @@ "error": "Error!", "no-account": "Unfortunately we could not find an (activated) account to the given data.", "no-transactionlist": "Unfortunately, there was an error. No transactions have been sent from the server.", + "no-user": "No user with this credentials.", "session-expired": "The session was closed for security reasons.", "unknown-error": "Unknown error: ", "user-already-exists": "A user with this data already exists." @@ -215,9 +216,6 @@ "new_wallet": "Create new account", "signin": "Sign in" }, - "register": { - "message-button-text": "Okay" - }, "signup": { "agree": "I agree to the privacy policy.", "dont_match": "Passwords don't match.", diff --git a/frontend/src/pages/ForgotPassword.vue b/frontend/src/pages/ForgotPassword.vue index eea54427a..182df5bc3 100644 --- a/frontend/src/pages/ForgotPassword.vue +++ b/frontend/src/pages/ForgotPassword.vue @@ -13,7 +13,7 @@ - + @@ -75,6 +75,11 @@ export default { success: null, } }, + created() { + if (this.$route.params.comingFrom) { + this.subtitle = 'settings.password.resend_subtitle' + } + }, methods: { async onSubmit() { this.$apollo @@ -95,10 +100,10 @@ export default { }) }, }, - created() { - if (this.$route.params.comingFrom) { - this.subtitle = 'settings.password.resend_subtitle' - } + computed: { + enterData() { + return !this.showPageMessage + }, }, } diff --git a/frontend/src/pages/Login.spec.js b/frontend/src/pages/Login.spec.js index 80f507a1c..715f297e1 100644 --- a/frontend/src/pages/Login.spec.js +++ b/frontend/src/pages/Login.spec.js @@ -219,7 +219,7 @@ describe('Login', () => { describe('login fails with "User email not validated"', () => { beforeEach(async () => { - await createError('GraphQL error: User email not validated') + await createError('GraphQL error: User email not validated.') }) it('hides the spinner', () => { @@ -251,7 +251,7 @@ describe('Login', () => { describe('login fails with "User has no password set yet"', () => { beforeEach(async () => { - await createError('GraphQL error: User has no password set yet') + await createError('GraphQL error: User has no password set yet.') }) it('shows error title, subtitle, login button', () => { @@ -277,26 +277,35 @@ describe('Login', () => { }) }) + describe('login fails with "No user with this credentials"', () => { + beforeEach(async () => { + await createError('GraphQL error: No user with this credentials.') + }) + + it('shows no error message on the page', () => { + // don't show any error on the page! against boots + expect(wrapper.vm.showPageMessage).toBe(false) + expect(wrapper.find('.test-message-headline').exists()).toBe(false) + expect(wrapper.find('.test-message-subtitle').exists()).toBe(false) + expect(wrapper.find('.test-message-button').exists()).toBe(false) + }) + + it('toasts the error message', () => { + expect(toastErrorSpy).toBeCalledWith('error.no-user') + }) + }) + describe('login fails with an unknow error', () => { beforeEach(async () => { await createError(' – Unknow error') }) - it('shows error title, subtitle, login button', () => { - expect(wrapper.vm.showPageMessage).toBe(true) - expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.errorTitle') - expect(wrapper.find('.test-message-subtitle').text()).toBe( - 'error.unknown-error – Unknow error', - ) - expect(wrapper.find('.test-message-button').text()).toBe('settings.password.reset') - }) - - it('button link directs to "/forgot-password"', () => { - expect(wrapper.find('.test-message-button').attributes('href')).toBe('/forgot-password') - }) - - it.skip('click redirects to "/forgot-password"', () => { - // expect(mockRouterPush).toBeCalledWith('/forgot-password') + it('shows no error message on the page', () => { + // don't show any error on the page! against boots + expect(wrapper.vm.showPageMessage).toBe(false) + expect(wrapper.find('.test-message-headline').exists()).toBe(false) + expect(wrapper.find('.test-message-subtitle').exists()).toBe(false) + expect(wrapper.find('.test-message-button').exists()).toBe(false) }) it('toasts the error message', () => { diff --git a/frontend/src/pages/Login.vue b/frontend/src/pages/Login.vue index 4cfd62e69..10fcca649 100755 --- a/frontend/src/pages/Login.vue +++ b/frontend/src/pages/Login.vue @@ -13,7 +13,7 @@ - + @@ -134,17 +134,21 @@ export default { this.errorSubtitle = this.$t('site.thx.unsetPassword') this.errorLinkTo = '/reset-password/login' this.toastError(this.$t('error.no-account')) + } else if (error.message.includes('No user with this credentials')) { + // don't show any error on the page! against boots + this.toastError(this.$t('error.no-user')) } else { - // appeared errors: 'GraphQL error: No user with this credentials' - const errorMessage = this.$t('error.unknown-error') + error.message - this.showPageMessage = true - this.errorSubtitle = errorMessage - this.errorLinkTo = '/forgot-password' - this.toastError(errorMessage) + // don't show any error on the page! against boots + this.toastError(this.$t('error.unknown-error') + error.message) } loader.hide() }) }, }, + computed: { + enterData() { + return !this.showPageMessage + }, + }, } diff --git a/frontend/src/pages/Register.spec.js b/frontend/src/pages/Register.spec.js index e889f0ca7..f7a6c0ac8 100644 --- a/frontend/src/pages/Register.spec.js +++ b/frontend/src/pages/Register.spec.js @@ -234,24 +234,17 @@ describe('Register', () => { await createError('GraphQL error: User already exists.') }) - it('shows success title, subtitle, login button', () => { - expect(wrapper.vm.showPageMessage).toBe(true) - expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.errorTitle') - expect(wrapper.find('.test-message-subtitle').text()).toBe('error.user-already-exists') - expect(wrapper.find('.test-message-button').text()).toBe( - 'site.register.message-button-text', - ) + it('shows no error message on the page', () => { + // don't show any error on the page! against boots + expect(wrapper.vm.showPageMessage).toBe(false) + expect(wrapper.find('.test-message-headline').exists()).toBe(false) + expect(wrapper.find('.test-message-subtitle').exists()).toBe(false) + expect(wrapper.find('.test-message-button').exists()).toBe(false) }) it('toasts the error message', () => { expect(toastErrorSpy).toBeCalledWith('error.user-already-exists') }) - - it('click calls "solveError"', async () => { - wrapper.find('.test-message-button').trigger('click') - await wrapper.vm.$nextTick() - expect(wrapper.vm.showPageMessage).toBe(false) - }) }) describe('server sends back error "Unknown error"', () => { @@ -259,26 +252,17 @@ describe('Register', () => { await createError(' – Unknown error.') }) - it('shows success title, subtitle, login button', () => { - expect(wrapper.vm.showPageMessage).toBe(true) - expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.errorTitle') - expect(wrapper.find('.test-message-subtitle').text()).toBe( - 'error.unknown-error – Unknown error.', - ) - expect(wrapper.find('.test-message-button').text()).toBe( - 'site.register.message-button-text', - ) + it('shows no error message on the page', () => { + // don't show any error on the page! against boots + expect(wrapper.vm.showPageMessage).toBe(false) + expect(wrapper.find('.test-message-headline').exists()).toBe(false) + expect(wrapper.find('.test-message-subtitle').exists()).toBe(false) + expect(wrapper.find('.test-message-button').exists()).toBe(false) }) it('toasts the error message', () => { expect(toastErrorSpy).toBeCalledWith('error.unknown-error – Unknown error.') }) - - it('click calls "solveError"', async () => { - wrapper.find('.test-message-button').trigger('click') - await wrapper.vm.$nextTick() - expect(wrapper.vm.showPageMessage).toBe(false) - }) }) }) diff --git a/frontend/src/pages/Register.vue b/frontend/src/pages/Register.vue index a41952030..39230cb1e 100755 --- a/frontend/src/pages/Register.vue +++ b/frontend/src/pages/Register.vue @@ -15,7 +15,7 @@ - + @@ -165,18 +165,7 @@ - - +