// // AuthTests.swift // AutoCatTests // // Created by Selim Mustafaev on 06.04.2025. // Copyright © 2025 Selim Mustafaev. All rights reserved. // import Testing import Mockable import AutoCatCore @testable import AutoCat @MainActor struct AuthTests { let apiServiceMock = MockApiServiceProtocol() let storageServiceMock = MockStorageServiceProtocol() var settingsServiceMock = MockSettingsServiceProtocol() var viewModel: AuthViewModel init() { viewModel = AuthViewModel( apiService: apiServiceMock, storageService: storageServiceMock, settingsService: settingsServiceMock ) } @Test("Initial load") func initialLoad() async throws { given(settingsServiceMock) .user.willReturn(User()) viewModel.onAppear() #expect(viewModel.email == "") } @Test("Initial load (existing user)") func initialLoadExistingUser() { given(settingsServiceMock) .user.willReturn(User(email: "test@example.com", token: "123")) viewModel.onAppear() #expect(viewModel.email == "test@example.com") } @Test("Login", arguments: [false, true]) func login(sameUser: Bool) async { let existingUser = User(email: "test@example.com") let newUser = User(email: "test2@example.com") given(settingsServiceMock) .user.willReturn(existingUser) given(apiServiceMock) .login(email: .any, password: .any) .willReturn(sameUser ? existingUser : newUser) given(storageServiceMock) .deleteAll() .willReturn() await viewModel.login() verify(settingsServiceMock) .user() .getCalled(.once) verify(settingsServiceMock) .user() .setCalled(.once) verify(apiServiceMock) .login(email: .any, password: .any) .called(.once) verify(storageServiceMock) .deleteAll() .called(sameUser ? .never : .once) #expect(viewModel.hud == nil) } @Test("Login (api failed)") func loginApiFailed() async { given(apiServiceMock) .login(email: .any, password: .any) .willThrow(TestError.generic) await viewModel.login() verify(apiServiceMock) .login(email: .any, password: .any) .called(.once) #expect(viewModel.hud == .error(TestError.generic)) } @Test("Login (DB failed)") func loginDbFailed() async { let existingUser = User(email: "test@example.com") let newUser = User(email: "test2@example.com") given(settingsServiceMock) .user.willReturn(existingUser) given(apiServiceMock) .login(email: .any, password: .any) .willReturn(newUser) given(storageServiceMock) .deleteAll() .willThrow(TestError.generic) await viewModel.login() verify(settingsServiceMock) .user() .getCalled(.once) verify(settingsServiceMock) .user() .setCalled(.never) verify(apiServiceMock) .login(email: .any, password: .any) .called(.once) verify(storageServiceMock) .deleteAll() .called(.once) #expect(viewModel.hud == .error(TestError.generic)) } @Test("Signup", arguments: [false, true]) func signup(sameUser: Bool) async { let existingUser = User(email: "test@example.com") let newUser = User(email: "test2@example.com") given(settingsServiceMock) .user.willReturn(existingUser) given(apiServiceMock) .signUp(email: .any, password: .any) .willReturn(sameUser ? existingUser : newUser) given(storageServiceMock) .deleteAll() .willReturn() await viewModel.signup() verify(settingsServiceMock) .user() .getCalled(.once) verify(settingsServiceMock) .user() .setCalled(.once) verify(apiServiceMock) .signUp(email: .any, password: .any) .called(.once) verify(storageServiceMock) .deleteAll() .called(sameUser ? .never : .once) #expect(viewModel.hud == nil) } @Test("Signup (api failed)") func signupApiFailed() async { given(apiServiceMock) .signUp(email: .any, password: .any) .willThrow(TestError.generic) await viewModel.signup() verify(apiServiceMock) .signUp(email: .any, password: .any) .called(.once) #expect(viewModel.hud == .error(TestError.generic)) } @Test("Signup (DB failed)") func signupDbFailed() async { let existingUser = User(email: "test@example.com") let newUser = User(email: "test2@example.com") given(settingsServiceMock) .user.willReturn(existingUser) given(apiServiceMock) .signUp(email: .any, password: .any) .willReturn(newUser) given(storageServiceMock) .deleteAll() .willThrow(TestError.generic) await viewModel.signup() verify(settingsServiceMock) .user() .getCalled(.once) verify(settingsServiceMock) .user() .setCalled(.never) verify(apiServiceMock) .signUp(email: .any, password: .any) .called(.once) verify(storageServiceMock) .deleteAll() .called(.once) #expect(viewModel.hud == .error(TestError.generic)) } }