// // ProfileDatabaseTests.swift // damusTests // // Created by Bryan Montz on 5/13/23. // import XCTest @testable import damus class ProfileDatabaseTests: XCTestCase { static let cache_url = (FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first?.appendingPathComponent("test-profiles"))! let database = ProfileDatabase(cache_url: ProfileDatabaseTests.cache_url) override func tearDownWithError() throws { // This method is called after the invocation of each test method in the class. try database.remove_all_profiles() } var test_profile: Profile { Profile(name: "test-name", display_name: "test-display-name", about: "test-about", picture: "test-picture", banner: "test-banner", website: "test-website", lud06: "test-lud06", lud16: "test-lud16", nip05: "test-nip05") } func testStoreAndRetrieveProfile() throws { let id = "test-id" let profile = test_profile // make sure it's not there yet XCTAssertNil(database.get(id: id)) // store the profile try database.upsert(id: id, profile: profile, last_update: .now) // read the profile out of the database let retrievedProfile = try XCTUnwrap(database.get(id: id)) XCTAssertEqual(profile.name, retrievedProfile.name) XCTAssertEqual(profile.display_name, retrievedProfile.display_name) XCTAssertEqual(profile.about, retrievedProfile.about) XCTAssertEqual(profile.picture, retrievedProfile.picture) XCTAssertEqual(profile.banner, retrievedProfile.banner) XCTAssertEqual(profile.website, retrievedProfile.website) XCTAssertEqual(profile.lud06, retrievedProfile.lud06) XCTAssertEqual(profile.lud16, retrievedProfile.lud16) XCTAssertEqual(profile.nip05, retrievedProfile.nip05) } func testRejectOutdatedProfile() throws { let id = "test-id" // store a profile let profile = test_profile let profile_last_updated = Date.now try database.upsert(id: id, profile: profile, last_update: profile_last_updated) // try to store a profile with the same id but the last_update date is older than the previously stored profile let outdatedProfile = test_profile let outdated_last_updated = profile_last_updated.addingTimeInterval(-60) XCTAssertThrowsError(try database.upsert(id: id, profile: outdatedProfile, last_update: outdated_last_updated)) { error in XCTAssertEqual(error as? ProfileDatabaseError, ProfileDatabaseError.outdated_input) } } func testUpdateExistingProfile() throws { let id = "test-id" // store a profile let profile = test_profile let profile_last_update = Date.now try database.upsert(id: id, profile: profile, last_update: profile_last_update) // update the same profile let updated_profile = test_profile updated_profile.nip05 = "updated-nip05" let updated_profile_last_update = profile_last_update.addingTimeInterval(60) try database.upsert(id: id, profile: updated_profile, last_update: updated_profile_last_update) // retrieve the profile and make sure it was updated let retrieved_profile = database.get(id: id) XCTAssertEqual(retrieved_profile?.nip05, "updated-nip05") } func testStoreMultipleAndRemoveAllProfiles() throws { XCTAssertEqual(database.count, 0) // store a profile let id = "test-id" let profile = test_profile let profile_last_update = Date.now try database.upsert(id: id, profile: profile, last_update: profile_last_update) XCTAssertEqual(database.count, 1) // store another profile let id2 = "test-id-2" let profile2 = test_profile let profile_last_update2 = Date.now try database.upsert(id: id2, profile: profile2, last_update: profile_last_update2) XCTAssertEqual(database.count, 2) try database.remove_all_profiles() XCTAssertEqual(database.count, 0) } }