Skip to content

Commit

Permalink
Merge pull request #50 from elDub/write-plural-payload
Browse files Browse the repository at this point in the history
Persisting new resources with already persisted plural relationship members fails
  • Loading branch information
richmolj authored Dec 27, 2019
2 parents 87b3ac4 + dc40bb7 commit cae16da
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 33 deletions.
2 changes: 1 addition & 1 deletion src/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -710,7 +710,7 @@ export class SpraypaintBase {
relatedModel: SpraypaintBase
): boolean {
const dc = new DirtyChecker(this)
return dc.checkRelation(relationName, relatedModel)
return !this.isPersisted || dc.checkRelation(relationName, relatedModel)
}

dup(): this {
Expand Down
3 changes: 1 addition & 2 deletions src/util/write-payload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,7 @@ export class WritePayload<T extends SpraypaintBase> {
!this._isNewAndMarkedForDestruction(relatedModels) &&
(idOnly ||
this.model.hasDirtyRelation(key, relatedModels) ||
relatedModels.isDirty(nested) ||
!this.model.isPersisted)
relatedModels.isDirty(nested))
) {
data = this._processRelatedModel(relatedModels, nested, idOnly)
}
Expand Down
11 changes: 0 additions & 11 deletions test/integration/nested-persistence.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -273,17 +273,6 @@ describe("nested persistence", () => {
expect(instance.books[0].genre.name).to.eq("name from server")
})

describe("when a hasMany relationship has no dirty members", () => {
beforeEach(() => {
instance.books[0] = new Book()
})

it("should not be sent in the payload", async () => {
await instance.save({ with: { books: "genre" } })
expect((<any>payloads)[0].data.relationships).to.eq(undefined)
})
})

describe("when a belongsTo relationship has unpersisted members that are marked for destruction", () => {
beforeEach(() => {
instance.books[0].genre.isMarkedForDestruction = true
Expand Down
61 changes: 42 additions & 19 deletions test/unit/write-payload.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { sinon, expect } from "../test-helper"
import { WritePayload } from "../../src/util/write-payload"
import { Person, PersonWithDasherizedKeys, Author, Genre } from "../fixtures"
import { Person, PersonWithDasherizedKeys, Author, Genre, Book } from "../fixtures"

describe("WritePayload", () => {
it("Does not serialize number attributes as empty string", () => {
Expand Down Expand Up @@ -46,13 +46,10 @@ describe("WritePayload", () => {
})
})

it("sends persisted relationships defined via direct assignment", () => {
describe("sends persisted singular relationships defined via", () => {
const genre = new Genre({ name: "Horror", id: "1" })
genre.isPersisted = true
const author = new Author()
author.genre = genre
const payload = new WritePayload(author, ["genre"])
expect(payload.asJSON()).to.deep.equal({
const expectedPayload = {
data: {
type: "authors",
relationships: {
Expand All @@ -71,33 +68,59 @@ describe("WritePayload", () => {
type: "genres"
}
]
}

it("constructor", () => {
const author = new Author({ genre: genre })
const payload = new WritePayload(author, ["genre"])
expect(payload.asJSON()).to.deep.equal(expectedPayload)
})

it("direct assignment", () => {
const author = new Author()
author.genre = genre
const payload = new WritePayload(author, ["genre"])
expect(payload.asJSON()).to.deep.equal(expectedPayload)
})
})

it("sends persisted relationships defined via constructor", () => {
const genre = new Genre({ name: "Horror", id: "1" })
genre.isPersisted = true
const author = new Author({ genre })
const payload = new WritePayload(author, ["genre"])
expect(payload.asJSON()).to.deep.equal({
describe("sends persisted plural relationships defined via", () => {
const book = new Book({ title: "Horror", id: "1" })
book.isPersisted = true
const expectedPayload = {
data: {
type: "authors",
relationships: {
genre: {
data: {
id: "1",
type: "genres",
method: "update"
}
books: {
data: [
{
id: "1",
type: "books",
method: "update"
}
]
}
}
},
included: [
{
id: "1",
type: "genres"
type: "books"
}
]
}

it("constructor", () => {
const author = new Author({ books: [book] })
const payload = new WritePayload(author, ["books"])
expect(payload.asJSON()).to.deep.equal(expectedPayload)
})

it("direct assignment", () => {
const author = new Author()
author.books.push(book)
const payload = new WritePayload(author, ["books"])
expect(payload.asJSON()).to.deep.equal(expectedPayload)
})
})

Expand Down

0 comments on commit cae16da

Please sign in to comment.