diff --git a/src/model.ts b/src/model.ts index 635e895..59d92bf 100644 --- a/src/model.ts +++ b/src/model.ts @@ -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 { diff --git a/src/util/write-payload.ts b/src/util/write-payload.ts index bc277f9..54e3df0 100644 --- a/src/util/write-payload.ts +++ b/src/util/write-payload.ts @@ -123,8 +123,7 @@ export class WritePayload { !this._isNewAndMarkedForDestruction(relatedModels) && (idOnly || this.model.hasDirtyRelation(key, relatedModels) || - relatedModels.isDirty(nested) || - !this.model.isPersisted) + relatedModels.isDirty(nested)) ) { data = this._processRelatedModel(relatedModels, nested, idOnly) } diff --git a/test/integration/nested-persistence.test.ts b/test/integration/nested-persistence.test.ts index 4181b01..5eb00be 100644 --- a/test/integration/nested-persistence.test.ts +++ b/test/integration/nested-persistence.test.ts @@ -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((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 diff --git a/test/unit/write-payload.test.ts b/test/unit/write-payload.test.ts index 674ce8e..8805a31 100644 --- a/test/unit/write-payload.test.ts +++ b/test/unit/write-payload.test.ts @@ -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", () => { @@ -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: { @@ -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) }) })