239 lines
6.1 KiB
Swift
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))
|
|
}
|
|
}
|