Skip to content

Commit

Permalink
Partial update WIP: tests
Browse files Browse the repository at this point in the history
  • Loading branch information
groue committed Jul 28, 2016
1 parent 548ff06 commit 176a23f
Show file tree
Hide file tree
Showing 3 changed files with 181 additions and 2 deletions.
4 changes: 2 additions & 2 deletions GRDB/Record/Persistable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -542,8 +542,8 @@ final class DataMapper {

// Don't update primary key columns
var updatedColumns = Array(persistentDictionary.keys)
.filter { columns.contains($0.lowercaseString) }
.filter { !primaryKeyColumns.contains($0.lowercaseString) }
.filter { columns.contains($0) }
.filter { !primaryKeyColumns.contains($0) }
if updatedColumns.isEmpty {
// IMPLEMENTATION NOTE
//
Expand Down
48 changes: 48 additions & 0 deletions Tests/Public/Core/Persistable/MutablePersistableTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,54 @@ class MutablePersistableTests: GRDBTestCase {
}
}

func testPartialUpdateMutablePersistablePerson() {
assertNoError {
let dbQueue = try makeDatabaseQueue()
try dbQueue.inDatabase { db in
var person1 = MutablePersistablePerson(id: nil, name: "Arthur")
try person1.insert(db)
var person2 = MutablePersistablePerson(id: nil, name: "Barbara")
try person2.insert(db)

do {
person1.name = "Craig"
try person1.update(db, columns: [String]())

let rows = Row.fetchAll(db, "SELECT * FROM persons ORDER BY id")
XCTAssertEqual(rows.count, 2)
XCTAssertEqual(rows[0].value(named: "id") as Int64, person1.id!)
XCTAssertEqual(rows[0].value(named: "name") as String, "Arthur")
XCTAssertEqual(rows[1].value(named: "id") as Int64, person2.id!)
XCTAssertEqual(rows[1].value(named: "name") as String, "Barbara")
}

do {
person1.name = "Craig"
try person1.update(db, columns: [SQLColumn("name")])

let rows = Row.fetchAll(db, "SELECT * FROM persons ORDER BY id")
XCTAssertEqual(rows.count, 2)
XCTAssertEqual(rows[0].value(named: "id") as Int64, person1.id!)
XCTAssertEqual(rows[0].value(named: "name") as String, "Craig")
XCTAssertEqual(rows[1].value(named: "id") as Int64, person2.id!)
XCTAssertEqual(rows[1].value(named: "name") as String, "Barbara")
}

do {
person1.name = "David"
try person1.update(db, columns: ["age"])

let rows = Row.fetchAll(db, "SELECT * FROM persons ORDER BY id")
XCTAssertEqual(rows.count, 2)
XCTAssertEqual(rows[0].value(named: "id") as Int64, person1.id!)
XCTAssertEqual(rows[0].value(named: "name") as String, "Craig")
XCTAssertEqual(rows[1].value(named: "id") as Int64, person2.id!)
XCTAssertEqual(rows[1].value(named: "name") as String, "Barbara")
}
}
}
}

func testSaveMutablePersistablePerson() {
assertNoError {
let dbQueue = try makeDatabaseQueue()
Expand Down
131 changes: 131 additions & 0 deletions Tests/Public/Core/Persistable/PersistableTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,54 @@ class PersistableTests: GRDBTestCase {
}
}

func testPartialUpdatePersistablePersonClass() {
assertNoError {
let dbQueue = try makeDatabaseQueue()
try dbQueue.inDatabase { db in
let person1 = PersistablePersonClass(id: nil, name: "Arthur", age: 42)
try person1.insert(db)
let person2 = PersistablePersonClass(id: nil, name: "Barbara", age: 39)
try person2.insert(db)

do {
person1.name = "Craig"
try person1.update(db, columns: [String]())

let rows = Row.fetchAll(db, "SELECT * FROM persons ORDER BY id")
XCTAssertEqual(rows.count, 2)
XCTAssertEqual(rows[0].value(named: "id") as Int64, person1.id!)
XCTAssertEqual(rows[0].value(named: "name") as String, "Arthur")
XCTAssertEqual(rows[1].value(named: "id") as Int64, person2.id!)
XCTAssertEqual(rows[1].value(named: "name") as String, "Barbara")
}

do {
person1.name = "Craig"
try person1.update(db, columns: [SQLColumn("name")])

let rows = Row.fetchAll(db, "SELECT * FROM persons ORDER BY id")
XCTAssertEqual(rows.count, 2)
XCTAssertEqual(rows[0].value(named: "id") as Int64, person1.id!)
XCTAssertEqual(rows[0].value(named: "name") as String, "Craig")
XCTAssertEqual(rows[1].value(named: "id") as Int64, person2.id!)
XCTAssertEqual(rows[1].value(named: "name") as String, "Barbara")
}

do {
person1.name = "David"
try person1.update(db, columns: ["age"])

let rows = Row.fetchAll(db, "SELECT * FROM persons ORDER BY id")
XCTAssertEqual(rows.count, 2)
XCTAssertEqual(rows[0].value(named: "id") as Int64, person1.id!)
XCTAssertEqual(rows[0].value(named: "name") as String, "Craig")
XCTAssertEqual(rows[1].value(named: "id") as Int64, person2.id!)
XCTAssertEqual(rows[1].value(named: "name") as String, "Barbara")
}
}
}
}

func testSavePersistablePersonClass() {
assertNoError {
let dbQueue = try makeDatabaseQueue()
Expand Down Expand Up @@ -322,6 +370,42 @@ class PersistableTests: GRDBTestCase {
}
}

func testPartialUpdatePersistableCountry() {
assertNoError {
let dbQueue = try makeDatabaseQueue()
try dbQueue.inDatabase { db in
var country1 = PersistableCountry(isoCode: "FR", name: "France")
try country1.insert(db)
let country2 = PersistableCountry(isoCode: "US", name: "United States")
try country2.insert(db)

do {
country1.name = "France Métropolitaine"
try country1.update(db, columns: [String]())

let rows = Row.fetchAll(db, "SELECT * FROM countries ORDER BY isoCode")
XCTAssertEqual(rows.count, 2)
XCTAssertEqual(rows[0].value(named: "isoCode") as String, "FR")
XCTAssertEqual(rows[0].value(named: "name") as String, "France")
XCTAssertEqual(rows[1].value(named: "isoCode") as String, "US")
XCTAssertEqual(rows[1].value(named: "name") as String, "United States")
}

do {
country1.name = "France Métropolitaine"
try country1.update(db, columns: [SQLColumn("name")])

let rows = Row.fetchAll(db, "SELECT * FROM countries ORDER BY isoCode")
XCTAssertEqual(rows.count, 2)
XCTAssertEqual(rows[0].value(named: "isoCode") as String, "FR")
XCTAssertEqual(rows[0].value(named: "name") as String, "France Métropolitaine")
XCTAssertEqual(rows[1].value(named: "isoCode") as String, "US")
XCTAssertEqual(rows[1].value(named: "name") as String, "United States")
}
}
}
}

func testSavePersistableCountry() {
assertNoError {
let dbQueue = try makeDatabaseQueue()
Expand Down Expand Up @@ -478,6 +562,53 @@ class PersistableTests: GRDBTestCase {
}
}

func testPartialUpdatePersistableCustomizedCountry() {
assertNoError {
let dbQueue = try makeDatabaseQueue()
try dbQueue.inDatabase { db in
var insertCount: Int = 0
var updateCount: Int = 0
var saveCount: Int = 0
var deleteCount: Int = 0
var existsCount: Int = 0
var country1 = PersistableCustomizedCountry(
isoCode: "FR",
name: "France",
willInsert: { insertCount += 1 },
willUpdate: { updateCount += 1 },
willSave: { saveCount += 1 },
willDelete: { deleteCount += 1 },
willExists: { existsCount += 1 })
try country1.insert(db)
let country2 = PersistableCustomizedCountry(
isoCode: "US",
name: "United States",
willInsert: { },
willUpdate: { },
willSave: { },
willDelete: { },
willExists: { })
try country2.insert(db)

country1.name = "France Métropolitaine"
try country1.update(db, columns: ["name"])

XCTAssertEqual(insertCount, 1)
XCTAssertEqual(updateCount, 1)
XCTAssertEqual(saveCount, 0)
XCTAssertEqual(deleteCount, 0)
XCTAssertEqual(existsCount, 0)

let rows = Row.fetchAll(db, "SELECT * FROM countries ORDER BY isoCode")
XCTAssertEqual(rows.count, 2)
XCTAssertEqual(rows[0].value(named: "isoCode") as String, "FR")
XCTAssertEqual(rows[0].value(named: "name") as String, "France Métropolitaine")
XCTAssertEqual(rows[1].value(named: "isoCode") as String, "US")
XCTAssertEqual(rows[1].value(named: "name") as String, "United States")
}
}
}

func testSavePersistableCustomizedCountry() {
assertNoError {
let dbQueue = try makeDatabaseQueue()
Expand Down

0 comments on commit 176a23f

Please sign in to comment.