Browse Source

Maintenance: Improve error message for admin account creation.

Co-authored-by: Dusan Vuckovic <dv@zammad.com>
Martin Gruner 9 months ago
parent
commit
0b42a5faa2

+ 26 - 0
app/frontend/apps/desktop/pages/guided-setup/__tests__/guided-setup-manual-admin.spec.ts

@@ -1,5 +1,6 @@
 // Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
 
+import { getTestRouter } from '#tests/support/components/renderComponent.ts'
 import { visitView } from '#tests/support/components/visitView.ts'
 import { mockApplicationConfig } from '#tests/support/mock-applicationConfig.ts'
 
@@ -7,6 +8,7 @@ import { EnumSystemSetupInfoStatus } from '#shared/graphql/types.ts'
 import { useAuthenticationStore } from '#shared/stores/authentication.ts'
 
 import { mockSystemSetupInfoQuery } from '../graphql/queries/systemSetupInfo.mocks.ts'
+import { useSystemSetupInfoStore } from '../stores/systemSetupInfo.ts'
 
 describe('guided setup admin user creation', () => {
   describe('when system initialization is done', () => {
@@ -33,6 +35,10 @@ describe('guided setup admin user creation', () => {
       })
     })
 
+    afterEach(() => {
+      vi.clearAllMocks()
+    })
+
     it('shows guided setup screen and opens manual setup on click', async () => {
       mockSystemSetupInfoQuery({
         systemSetupInfo: {
@@ -86,6 +92,26 @@ describe('guided setup admin user creation', () => {
       })
 
       expect(useAuthenticationStore().authenticated).toBe(true)
+
+      // Redirects to home screen on back navigation, if the setup was completed.
+      mockSystemSetupInfoQuery({
+        systemSetupInfo: {
+          status: EnumSystemSetupInfoStatus.Done,
+          type: null,
+        },
+      })
+
+      const { setSystemSetupInfo } = useSystemSetupInfoStore()
+
+      await setSystemSetupInfo()
+
+      const router = getTestRouter()
+
+      router.back()
+
+      await vi.waitFor(() => {
+        expect(view, 'correctly redirects to home screen').toHaveCurrentUrl('/')
+      })
     })
   })
 })

+ 41 - 0
app/frontend/apps/desktop/pages/guided-setup/__tests__/guided-setup-start.spec.ts

@@ -1,5 +1,6 @@
 // Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
 
+import { getTestRouter } from '#tests/support/components/renderComponent.ts'
 import { visitView } from '#tests/support/components/visitView.ts'
 import { mockApplicationConfig } from '#tests/support/mock-applicationConfig.ts'
 
@@ -10,6 +11,7 @@ import {
 
 import { mockSystemSetupLockMutation } from '../graphql/mutations/systemSetupLock.mocks.ts'
 import { mockSystemSetupInfoQuery } from '../graphql/queries/systemSetupInfo.mocks.ts'
+import { useSystemSetupInfoStore } from '../stores/systemSetupInfo.ts'
 
 import { mockSystemSetupInfo } from './mocks/mock-systemSetupInfo.ts'
 
@@ -145,5 +147,44 @@ describe('guided setup start', () => {
       expect(view.getByRole('button', { name: 'Go Back' })).toBeInTheDocument()
       expect(view.getByText('Create Administrator Account')).toBeInTheDocument()
     })
+
+    it('redirects to home screen on back navigation, if the setup was completed', async () => {
+      mockSystemSetupInfoQuery({
+        systemSetupInfo: {
+          status: EnumSystemSetupInfoStatus.New,
+          type: null,
+        },
+      })
+
+      const view = await visitView('/guided-setup')
+
+      await view.events.click(view.getByText('Set up a new system'))
+
+      await vi.waitFor(() => {
+        expect(
+          view,
+          'correctly redirects to guided setup manual',
+        ).toHaveCurrentUrl('/guided-setup/manual')
+      })
+
+      mockSystemSetupInfoQuery({
+        systemSetupInfo: {
+          status: EnumSystemSetupInfoStatus.Done,
+          type: null,
+        },
+      })
+
+      const { setSystemSetupInfo } = useSystemSetupInfoStore()
+
+      await setSystemSetupInfo()
+
+      const router = getTestRouter()
+
+      router.back()
+
+      await vi.waitFor(() => {
+        expect(view, 'correctly redirects to home screen').toHaveCurrentUrl('/')
+      })
+    })
   })
 })

+ 13 - 0
app/frontend/apps/desktop/pages/guided-setup/router/guards/systemSetupBeforeRouteEnterGuard.ts

@@ -0,0 +1,13 @@
+// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
+
+import { useSystemSetupInfoStore } from '#desktop/pages/guided-setup/stores/systemSetupInfo.ts'
+
+export const systemSetupBeforeRouteEnterGuard = () => {
+  const { systemSetupDone } = useSystemSetupInfoStore()
+
+  if (systemSetupDone) {
+    return '/'
+  }
+
+  return true
+}

+ 5 - 0
app/frontend/apps/desktop/pages/guided-setup/views/GuidedSetupManual/GuidedSetupManualAdmin.vue

@@ -16,8 +16,13 @@ import { useSignupForm } from '#desktop/composables/authentication/useSignupForm
 import GuidedSetupActionFooter from '../../components/GuidedSetupActionFooter.vue'
 import { useSystemSetup } from '../../composables/useSystemSetup.ts'
 import { useUserAddFirstAdminMutation } from '../../graphql/mutations/userAddFirstAdmin.api.ts'
+import { systemSetupBeforeRouteEnterGuard } from '../../router/guards/systemSetupBeforeRouteEnterGuard.ts'
 import { useSystemSetupInfoStore } from '../../stores/systemSetupInfo.ts'
 
+defineOptions({
+  beforeRouteEnter: systemSetupBeforeRouteEnterGuard,
+})
+
 const { setTitle } = useSystemSetup()
 
 setTitle(__('Create Administrator Account'))

+ 5 - 0
app/frontend/apps/desktop/pages/guided-setup/views/GuidedSetupStart.vue

@@ -13,8 +13,13 @@ import CommonButton from '#desktop/components/CommonButton/CommonButton.vue'
 import LayoutPublicPage from '#desktop/components/layout/LayoutPublicPage/LayoutPublicPage.vue'
 
 import { useSystemSetupLockMutation } from '../graphql/mutations/systemSetupLock.api.ts'
+import { systemSetupBeforeRouteEnterGuard } from '../router/guards/systemSetupBeforeRouteEnterGuard.ts'
 import { useSystemSetupInfoStore } from '../stores/systemSetupInfo.ts'
 
+defineOptions({
+  beforeRouteEnter: systemSetupBeforeRouteEnterGuard,
+})
+
 const router = useRouter()
 
 const systemSetupInfoStore = useSystemSetupInfoStore()

+ 2 - 0
app/graphql/gql/mutations/user/add_first_admin.rb

@@ -22,6 +22,8 @@ module Gql::Mutations
       create_session(user, false, 'password')
 
       authenticate_result
+    rescue Service::System::CheckSetup::SystemSetupError => e
+      error_response({ message: e.message })
     rescue PasswordPolicy::Error => e
       error_response({ message: e.message, field: 'password' })
     end

+ 3 - 1
spec/graphql/gql/mutations/user/add_first_admin_spec.rb

@@ -102,7 +102,9 @@ RSpec.describe Gql::Mutations::User::AddFirstAdmin, :aggregate_failures, set_up:
       end
 
       it 'fails with an error' do
-        expect(graphql_response['errors'].first['message']).to eq('This system has already been configured and an administrator account exists.')
+        expect(graphql_response['data']['userAddFirstAdmin']['errors']).to eq(
+          [{ 'message' => 'This system has already been configured and an administrator account exists.', 'field' => nil }]
+        )
       end
     end
   end