From b74b14ecfaeb60e1746447c18a73f74f42c9516f Mon Sep 17 00:00:00 2001 From: Jeff Cuevas-Koch <4649003+cuevaskoch@users.noreply.github.com> Date: Fri, 24 Apr 2020 10:01:54 -0700 Subject: [PATCH] feat(signs): EN-5907: Update approach announcements for signs. (#73) Co-authored-by: Jeff Cuevas-Koch --- src/examples/get_signs.test.js | 23 +++++++++++++++++++++++ src/mocks/signs.js | 6 +++++- src/resources/Sign.js | 22 ++++++++++++++++++++++ src/resources/Sign.test.js | 23 +++++++++++++++++++++++ 4 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/examples/get_signs.test.js b/src/examples/get_signs.test.js index da4e544..0846553 100644 --- a/src/examples/get_signs.test.js +++ b/src/examples/get_signs.test.js @@ -46,3 +46,26 @@ describe('When retrieving a sign by ID', () => { return signPromise; }); }); + +describe('When updating a sign', () => { + const api = new Track({ autoRenew: false }); + + beforeEach(() => charlie.setUpSuccessfulMock(api.client)); + beforeEach(() => mockSigns.setUpSuccessfulMock(api.client)); + beforeEach(() => fetchMock.catch(503)); + afterEach(fetchMock.restore); + + it('should update approach announcements', () => { + api.logIn({ username: 'charlie@example.com', password: 'securepassword' }); + + const signPromise = api.customer('SYNC').sign(1) + .fetch() + .then(sign => { + sign.approach_announcements_enabled = true; + sign.approach_announcements_seconds = 120; + sign.update(); + }); + + return signPromise; + }); +}) diff --git a/src/mocks/signs.js b/src/mocks/signs.js index 54d8b85..7bb0742 100644 --- a/src/mocks/signs.js +++ b/src/mocks/signs.js @@ -11,10 +11,14 @@ const signs = { }, }); const singleResponse = () => new Response(Client.toBlob(signs.getById(1))); + const patchResponse = () => new Response(undefined, { + headers: {}, + }); fetchMock .get(client.resolve('/1/SYNC/signs?page=1&per_page=10&q=first&sort='), listResponse) - .get(client.resolve('/1/SYNC/signs/1'), singleResponse); + .get(client.resolve('/1/SYNC/signs/1'), singleResponse) + .patch(client.resolve('/1/SYNC/signs/1'), patchResponse); }, getById: id => signs.list.find(v => v.id === id), list: [{ diff --git a/src/resources/Sign.js b/src/resources/Sign.js index 0dd8450..bad6fa0 100644 --- a/src/resources/Sign.js +++ b/src/resources/Sign.js @@ -52,6 +52,28 @@ class Sign extends Resource { .then(response => response.json()) .then(sign => new Sign(this.client, this, sign)); } + + /** + * Updates data for a sign via the client. + * Note: only updates approach_announcements_enabled and approach_announcements_seconds. + * @returns {Promise} if successful returns instance of this sign + */ + update() { + return this.client.patch(this.href, { + body: [ + { + op: 'replace', + path: 'approach_announcements_enabled', + value: this.approach_announcements_enabled, + }, + { + op: 'replace', + path: 'approach_announcements_seconds', + value: this.approach_announcements_seconds, + }, + ], + }); + } } export default Sign; diff --git a/src/resources/Sign.test.js b/src/resources/Sign.test.js index 7cbf567..3a91da7 100644 --- a/src/resources/Sign.test.js +++ b/src/resources/Sign.test.js @@ -42,3 +42,26 @@ describe('When fetching a sign based on customer and ID', () => { it('should set the href', () => promise.then(v => v.href).should.eventually.equal('/1/SYNC/signs/1')); it('should be hydrated', () => promise.then(v => v.hydrated).should.eventually.equal(true)); }); + +describe('When updating a sign', () => { + const client = new Client(); + + beforeEach(() => mockSigns.setUpSuccessfulMock(client)); + beforeEach(() => fetchMock.catch(503)); + afterEach(fetchMock.restore); + + let promise; + beforeEach(() => { + promise = new Sign(client, Sign.makeHref('SYNC', 1)).fetch() + .then(sign => { + sign.approach_announcements_enabled = true; + sign.approach_announcements_seconds = 120; + return sign; + }) + .then(sign => sign.update() + .then(() => sign)); + }); + + it('should resolve the promise', () => promise.should.be.fulfilled); + it('should set the href', () => promise.then(v => v.href).should.eventually.equal('/1/SYNC/signs/1')); +})