From bcd46cec1f78d1aaaaed75223c3fd8f5db9c1d0c Mon Sep 17 00:00:00 2001 From: Randall Morey Date: Sat, 12 Sep 2020 11:40:21 -0400 Subject: [PATCH] =?UTF-8?q?fix:=20=F0=9F=90=9B=20handle=20missing=20princi?= =?UTF-8?q?pals=20array=20in=20role=20response?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addons/api/addon/models/role.js | 5 ++- .../unit/serializers/application-test.js | 3 +- .../tests/unit/serializers/host-set-test.js | 3 +- .../api/tests/unit/serializers/role-test.js | 31 +++++++++++++++++++ .../api/tests/unit/serializers/target-test.js | 3 +- ui/core/mirage/serializers/role.js | 1 + 6 files changed, 39 insertions(+), 7 deletions(-) diff --git a/addons/api/addon/models/role.js b/addons/api/addon/models/role.js index dd7e8bb2b..83d1a99a7 100644 --- a/addons/api/addon/models/role.js +++ b/addons/api/addon/models/role.js @@ -12,7 +12,10 @@ export default class RoleModel extends GeneratedRoleModel { * see obvious. Instead, the application layer is expected to load referenced * users and groups as needed. */ - @fragmentArray('fragment-principal', {readOnly: true}) principals; + @fragmentArray('fragment-principal', { + readOnly: true, + emptyArrayIfMissing: true + }) principals; /** * Grants is read-only _most_ under normal circumstances. But grants can diff --git a/addons/api/tests/unit/serializers/application-test.js b/addons/api/tests/unit/serializers/application-test.js index f1962477b..094e0ffb3 100644 --- a/addons/api/tests/unit/serializers/application-test.js +++ b/addons/api/tests/unit/serializers/application-test.js @@ -140,7 +140,7 @@ module('Unit | Serializer | application', function (hooks) { }); test('it normalizes missing arrays in single responses if annotated in model attributes', function (assert) { - assert.expect(2); + assert.expect(1); const store = this.owner.lookup('service:store'); const serializer = store.serializerFor('target'); const target = store.createRecord('target').constructor; @@ -154,7 +154,6 @@ module('Unit | Serializer | application', function (hooks) { target, payload ); - assert.notOk(payload.bogusArrayField); assert.deepEqual(normalized, { included: [], data: { diff --git a/addons/api/tests/unit/serializers/host-set-test.js b/addons/api/tests/unit/serializers/host-set-test.js index 41d5505fd..be9d51436 100644 --- a/addons/api/tests/unit/serializers/host-set-test.js +++ b/addons/api/tests/unit/serializers/host-set-test.js @@ -76,7 +76,7 @@ module('Unit | Serializer | host set', function(hooks) { }); test('it normalizes missing host_ids to empty array', function (assert) { - assert.expect(2); + assert.expect(1); const store = this.owner.lookup('service:store'); const serializer = store.serializerFor('host-set'); const hostSet = store.createRecord('host-set').constructor; @@ -90,7 +90,6 @@ module('Unit | Serializer | host set', function(hooks) { hostSet, payload ); - assert.notOk(payload.bogusArrayField); assert.deepEqual(normalized, { included: [], data: { diff --git a/addons/api/tests/unit/serializers/role-test.js b/addons/api/tests/unit/serializers/role-test.js index 1293d28b4..7a3d6e59d 100644 --- a/addons/api/tests/unit/serializers/role-test.js +++ b/addons/api/tests/unit/serializers/role-test.js @@ -68,6 +68,37 @@ module('Unit | Serializer | role', function(hooks) { attributes: { name: 'Role 1', grants: [{value: '*'}, {value: '*'}], + principals: [] + }, + relationships: {}, + }, + }); + }); + + test('it normalizes missing principals to empty array', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('role'); + const role = store.createRecord('role').constructor; + const payload = { + id: '1', + name: 'Role 1', + scope: { id: 'o_123' } + }; + const normalized = serializer.normalizeSingleResponse( + store, + role, + payload + ); + assert.deepEqual(normalized, { + included: [], + data: { + id: '1', + type: 'role', + attributes: { + name: 'Role 1', + scope: { scope_id: 'o_123' }, + principals: [] }, relationships: {}, }, diff --git a/addons/api/tests/unit/serializers/target-test.js b/addons/api/tests/unit/serializers/target-test.js index ab1a07635..94cab05e5 100644 --- a/addons/api/tests/unit/serializers/target-test.js +++ b/addons/api/tests/unit/serializers/target-test.js @@ -95,7 +95,7 @@ module('Unit | Serializer | target', function(hooks) { }); test('it normalizes missing host_sets to empty array', function (assert) { - assert.expect(2); + assert.expect(1); const store = this.owner.lookup('service:store'); const serializer = store.serializerFor('target'); const target = store.createRecord('target').constructor; @@ -109,7 +109,6 @@ module('Unit | Serializer | target', function(hooks) { target, payload ); - assert.notOk(payload.bogusArrayField); assert.deepEqual(normalized, { included: [], data: { diff --git a/ui/core/mirage/serializers/role.js b/ui/core/mirage/serializers/role.js index 159bdc56c..06009a6f3 100644 --- a/ui/core/mirage/serializers/role.js +++ b/ui/core/mirage/serializers/role.js @@ -16,6 +16,7 @@ export default ApplicationSerializer.extend({ type: 'group' })); json.principals = [ ...serializedUsers, ...serializedGroups ]; + if (!json.principals.length) delete json.principals; return json; } });