Skip to content

Commit

Permalink
Add core data db url, fix a bug in any stores, add more tests (#12)
Browse files Browse the repository at this point in the history
  • Loading branch information
omaralbeik authored Aug 27, 2022
1 parent 1658701 commit 2b0c610
Show file tree
Hide file tree
Showing 12 changed files with 77 additions and 15 deletions.
3 changes: 3 additions & 0 deletions Sources/Blueprints/AnyMultiObjectStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,9 @@ public extension MultiObjectStore {
/// Create a type erased store.
/// - Returns: ``AnyMultiObjectStore``.
func eraseToAnyStore() -> AnyMultiObjectStore<Object> {
if let anyStore = self as? AnyMultiObjectStore<Object> {
return anyStore
}
return .init(self)
}
}
3 changes: 3 additions & 0 deletions Sources/Blueprints/AnySingleObjectStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ public extension SingleObjectStore {
/// Create a type erased store.
/// - Returns: ``AnySingleObjectStore``.
func eraseToAnyStore() -> AnySingleObjectStore<Object> {
if let anyStore = self as? AnySingleObjectStore<Object> {
return anyStore
}
return .init(self)
}
}
7 changes: 5 additions & 2 deletions Sources/CoreData/Database.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,19 @@ private final class Container: NSPersistentContainer {

final class Database {
let context: NSManagedObjectContext
private(set) var url: URL?

init(name: String) {
let container = Container(name: name, managedObjectModel: Self.entityModel)
container.loadPersistentStores { _, error in
context = container.viewContext
container.loadPersistentStores { description, error in
if let error = error {
preconditionFailure(
"Failed to load store with error: \(error.localizedDescription)."
)
}
self.url = description.url
}
context = container.viewContext
}

static let entityModel: NSManagedObjectModel = {
Expand Down Expand Up @@ -64,6 +66,7 @@ final class Database {
let entityFetchRequest: (String) -> NSFetchRequest<Entity> = { id in
let request = NSFetchRequest<Entity>(entityName: "Entity")
request.predicate = NSPredicate(format: "id == %@", id)
request.fetchLimit = 1
return request
}
}
Expand Down
5 changes: 5 additions & 0 deletions Sources/CoreData/MultiCoreDataStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ public final class MultiCoreDataStore<
database = .init(name: databaseName)
}

/// URL for where the core data SQLite database is stored.
public var databaseURL: URL? {
database.url
}

// MARK: - MultiObjectStore

/// Saves an object to store.
Expand Down
7 changes: 6 additions & 1 deletion Sources/CoreData/SingleCoreDataStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,12 @@ public final class SingleCoreDataStore<Object: Codable>: SingleObjectStore {
database = .init(name: databaseName)
}

// MARK: - Store
/// URL for where the core data SQLite database is stored.
public var databaseURL: URL? {
database.url
}

// MARK: - SingleObjectStore

/// Saves an object to store.
/// - Parameter object: object to be saved.
Expand Down
1 change: 1 addition & 0 deletions Tests/Blueprints/AnyMultiObjectStoreTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ private extension AnyMultiObjectStoreTests {
func createFreshUsersStores() -> Stores {
let fakeStore = MultiObjectStoreFake<User>()
let anyStore = fakeStore.eraseToAnyStore()
XCTAssert(anyStore.eraseToAnyStore() === anyStore)
return (fakeStore, anyStore)
}
}
1 change: 1 addition & 0 deletions Tests/Blueprints/AnySingleObjectStoreTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ private extension AnySingleObjectStoreTests {
func createFreshUserStores() -> Stores {
let fakeStore = SingleObjectStoreFake<User>()
let anyStore = fakeStore.eraseToAnyStore()
XCTAssert(anyStore.eraseToAnyStore() === anyStore)
return (fakeStore, anyStore)
}
}
42 changes: 33 additions & 9 deletions Tests/CoreData/DatabaseTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,41 @@ final class DatabaseTests: XCTestCase {
}
XCTAssertEqual(properties.count, 3)

XCTAssertEqual(properties[0].name, "id")
XCTAssertEqual(properties[0].attributeType, .stringAttributeType)
XCTAssertFalse(properties[0].isOptional)
let sortedProperties = properties.sorted { $0.name < $1.name }

XCTAssertEqual(properties[1].name, "data")
XCTAssertEqual(properties[1].attributeType, .binaryDataAttributeType)
XCTAssertFalse(properties[1].isOptional)
XCTAssertEqual(sortedProperties[0].name, "data")
XCTAssertEqual(sortedProperties[0].attributeType, .binaryDataAttributeType)
XCTAssertFalse(sortedProperties[0].isOptional)

XCTAssertEqual(properties[2].name, "lastUpdated")
XCTAssertEqual(properties[2].attributeType, .dateAttributeType)
XCTAssertFalse(properties[2].isOptional)
XCTAssertEqual(sortedProperties[1].name, "id")
XCTAssertEqual(sortedProperties[1].attributeType, .stringAttributeType)
XCTAssertFalse(sortedProperties[1].isOptional)

XCTAssertEqual(sortedProperties[2].name, "lastUpdated")
XCTAssertEqual(sortedProperties[2].attributeType, .dateAttributeType)
XCTAssertFalse(sortedProperties[2].isOptional)
}

func testEntitiesFetchRequest() {
let database = Database(name: "test")
let request = database.entitiesFetchRequest()
XCTAssertEqual(request.entityName, "Entity")
XCTAssertEqual(
request.sortDescriptors,
[.init(key: "lastUpdated", ascending: true)]
)
}

func testEntityFetchRequest() {
let database = Database(name: "test")
let id = "test-id"
let request = database.entityFetchRequest(id)
XCTAssertEqual(request.entityName, "Entity")
XCTAssertEqual(
request.predicate,
NSPredicate(format: "id == %@", id)
)
XCTAssertEqual(request.fetchLimit, 1)
}
}

Expand Down
13 changes: 12 additions & 1 deletion Tests/CoreData/MultiCoreDataStoreTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,20 @@ final class MultiCoreDataStoreTests: XCTestCase {
try store?.removeAll()
}

func testSaveObject() throws {
func testCreateStore() {
let databaseName = UUID().uuidString
let store = createFreshUsersStore(databaseName: databaseName)
XCTAssertEqual(store.databaseName, databaseName)
}

func testDatabaseURL() {
let store = createFreshUsersStore()
let path = store.databaseURL?.pathComponents.suffix(2)
XCTAssertEqual(path, ["CoreDataStore", "\(store.databaseName).sqlite"])
}

func testSaveObject() throws {
let store = createFreshUsersStore()
try store.save(.ahmad)
XCTAssertEqual(store.objectsCount, 1)
XCTAssertEqual(store.allObjects(), [.ahmad])
Expand Down
6 changes: 6 additions & 0 deletions Tests/CoreData/SingleCoreDataStoreTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ final class SingleCoreDataStoreTests: XCTestCase {
XCTAssertEqual(store.databaseName, databaseName)
}

func testDatabaseURL() {
let store = createFreshUserStore()
let path = store.databaseURL?.pathComponents.suffix(2)
XCTAssertEqual(path, ["CoreDataStore", "\(store.databaseName).sqlite"])
}

func testSaveObject() throws {
let store = createFreshUserStore()
try store.save(.ahmad)
Expand Down
2 changes: 1 addition & 1 deletion Tests/Utils/MultiObjectStoreFake.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public final class MultiObjectStoreFake<
self.error = error
}

// MARK: - Store
// MARK: - MultiObjectStore

/// Saves an object to store.
/// - Parameter object: object to be saved.
Expand Down
2 changes: 1 addition & 1 deletion Tests/Utils/SingleObjectStoreFake.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public final class SingleObjectStoreFake<Object: Codable>: SingleObjectStore {
self.error = error
}

// MARK: - Store
// MARK: - SingleObjectStore

/// Saves an object to store.
/// - Parameter object: object to be saved.
Expand Down

0 comments on commit 2b0c610

Please sign in to comment.