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 { class EmojiStoreTests: XCTestCase {
private var emojiStore: EmojiStore!
override func setUp() {
emojiStore = loadStore()
}
// MARK: - Tests
func testFinds💯WhenSearchingForHundred() { func testFinds💯WhenSearchingForHundred() {
find("hundred", expect: "💯") find("hundred", expect: "💯")
} }
@ -44,33 +36,25 @@ class EmojiStoreTests: XCTestCase {
find("2", expect: "2") find("2", expect: "2")
} }
// MARK: - Helpers // MARK: - Private
private func loadStore() -> EmojiStore { private func find(_ searchText: String, expect emoji: String) {
let store = EmojiStore() loadEmojiStore { emojiStore in
let emojiService = EmojiMartService() let emojis = emojiStore.findEmojiItemsSortedByCategory(with: searchText).flatMap { $0.emojis.map { $0.value } }
let expectation = self.expectation(description: "The wai-ai-ting is the hardest part") 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 { switch response {
case .success(let categories): case .success(let categories):
let store = EmojiStore()
store.set(categories) store.set(categories)
expectation.fulfill() completion(store)
case .failure(let error): case .failure(let error):
XCTFail("Failed to load emojis: \(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)")
}
} }