AutoCat/AutoCatTests/AuthTests.swift
2025-04-06 16:18:28 +03:00

239 lines
6.1 KiB
Swift

//
// 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))
}
}