Correctly chain up async calls on emoji store loading to avoid race conditions and intermittent test failures.

This commit is contained in:
Stefan Ceriu 2022-02-08 13:17:14 +02:00 committed by Stefan Ceriu
parent b35407bab2
commit c9d0a4f4b4

View file

@ -20,14 +20,6 @@ import XCTest
class EmojiStoreTests: XCTestCase {
private var emojiStore: EmojiStore!
override func setUp() {
emojiStore = loadStore()
}
// MARK: - Tests
func testFinds💯WhenSearchingForHundred() {
find("hundred", expect: "💯")
}
@ -44,33 +36,25 @@ class EmojiStoreTests: XCTestCase {
find("2", expect: "2")
}
// MARK: - Helpers
// MARK: - Private
private func loadStore() -> EmojiStore {
let store = EmojiStore()
let emojiService = EmojiMartService()
let expectation = self.expectation(description: "The wai-ai-ting is the hardest part")
private func find(_ searchText: String, expect emoji: String) {
loadEmojiStore { emojiStore in
let emojis = emojiStore.findEmojiItemsSortedByCategory(with: searchText).flatMap { $0.emojis.map { $0.value } }
XCTAssert(emojis.contains(emoji), "Search text \"\(searchText)\" should find \"\(emoji)\" but only found \(emojis)")
}
}
emojiService.getEmojiCategories { response in
private func loadEmojiStore(_ completion: @escaping (EmojiStore) -> Void) {
EmojiMartService().getEmojiCategories { response in
switch response {
case .success(let categories):
let store = EmojiStore()
store.set(categories)
expectation.fulfill()
completion(store)
case .failure(let error):
XCTFail("Failed to load emojis: \(error)")
}
}
waitForExpectations(timeout: 2) { error in
XCTAssertNil(error)
}
return store
}
private func find(_ searchText: String, expect emoji: String) {
let emojis = emojiStore.findEmojiItemsSortedByCategory(with: searchText).flatMap { $0.emojis.map { $0.value } }
XCTAssert(emojis.contains(emoji), "Search text \"\(searchText)\" should find \"\(emoji)\" but only found \(emojis)")
}
}