From 26fbe015df6369e8f72d2e91d5ec5aadc6246305 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Wed, 12 Oct 2022 16:39:10 -0700 Subject: [PATCH] adds functionality to check for linked ilms and offerings. recursively check subgroups too. --- addon/models/learner-group.js | 30 +++++ tests/unit/models/learner-group-test.js | 146 ++++++++++++++++++++++++ 2 files changed, 176 insertions(+) diff --git a/addon/models/learner-group.js b/addon/models/learner-group.js index 24a4d19d2..bba1becc7 100644 --- a/addon/models/learner-group.js +++ b/addon/models/learner-group.js @@ -376,4 +376,34 @@ export default class LearnerGroup extends Model { } return uniqueValues(modifiedGroups); } + + get hasOfferings() { + return !!this._offerings?.length; + } + + @use descendantsOfferings = new ResolveFlatMapBy(() => [this.allDescendants, 'offerings']); + + get hasOfferingsInGroupOrSubgroups() { + if (this.hasOfferings) { + return true; + } + return !!this.descendantsOfferings?.length; + } + + get hasIlmSessions() { + return !!this._ilmSessions?.length; + } + + @use descendantsIlmSessions = new ResolveFlatMapBy(() => [this.allDescendants, 'ilmSessions']); + + get hasIlmSessionsInGroupOrSubgroups() { + if (this.hasIlmSessions) { + return true; + } + return !!this.descendantsIlmSessions?.length; + } + + get hasOfferingsOrIlmSessionsInGroupOrSubgroups() { + return this.hasOfferingsInGroupOrSubgroups || this.hasIlmSessionsInGroupOrSubgroups; + } } diff --git a/tests/unit/models/learner-group-test.js b/tests/unit/models/learner-group-test.js index 4e18e76ea..5aed61d0c 100644 --- a/tests/unit/models/learner-group-test.js +++ b/tests/unit/models/learner-group-test.js @@ -820,4 +820,150 @@ module('Unit | Model | LearnerGroup', function (hooks) { const hasNeeds = await waitForResource(learnerGroup, 'hasSubgroupsInNeedOfAccommodation'); assert.ok(hasNeeds); }); + + test('has offerings', async function (assert) { + const store = this.owner.lookup('service:store'); + const learnerGroup = store.createRecord('learner-group'); + await waitForResource(learnerGroup, '_offerings'); + assert.notOk(learnerGroup.hasOfferings); + const offering = store.createRecord('offering'); + learnerGroup.set('offerings', [offering]); + await waitForResource(learnerGroup, '_offerings'); + assert.ok(learnerGroup.hasOfferings); + learnerGroup.set('offerings', []); + await waitForResource(learnerGroup, '_offerings'); + assert.notOk(learnerGroup.hasOfferings); + }); + + test('has Ilm sessions', async function (assert) { + const store = this.owner.lookup('service:store'); + const learnerGroup = store.createRecord('learner-group'); + await waitForResource(learnerGroup, '_ilmSessions'); + assert.notOk(learnerGroup.hasIlmSessions); + const ilmSession = store.createRecord('ilm-session'); + learnerGroup.set('ilmSessions', [ilmSession]); + await waitForResource(learnerGroup, '_ilmSessions'); + assert.ok(learnerGroup.hasIlmSessions); + learnerGroup.set('ilmSessions', []); + await waitForResource(learnerGroup, '_ilmSessions'); + assert.notOk(learnerGroup.hasIlmSessions); + }); + + test('has offerings in group or subgroups', async function (assert) { + const store = this.owner.lookup('service:store'); + const learnerGroup = store.createRecord('learner-group'); + const subgroup = store.createRecord('learner-group', { parent: learnerGroup }); + const offering = store.createRecord('offering'); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + assert.notOk(learnerGroup.hasOfferingsInGroupOrSubgroups); + learnerGroup.set('offerings', [offering]); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + assert.ok(learnerGroup.hasOfferingsInGroupOrSubgroups); + learnerGroup.set('offerings', []); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + assert.notOk(learnerGroup.hasOfferingsInGroupOrSubgroups); + subgroup.set('offerings', [offering]); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + assert.ok(learnerGroup.hasOfferingsInGroupOrSubgroups); + subgroup.set('offerings', []); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + assert.notOk(learnerGroup.hasOfferingsInGroupOrSubgroups); + }); + + test('has ilm sessions in group or subgroups', async function (assert) { + const store = this.owner.lookup('service:store'); + const learnerGroup = store.createRecord('learner-group'); + const subgroup = store.createRecord('learner-group', { parent: learnerGroup }); + const ilmSession = store.createRecord('ilm-session'); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.notOk(learnerGroup.hasIlmSessionsInGroupOrSubgroups); + learnerGroup.set('ilmSessions', [ilmSession]); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.ok(learnerGroup.hasIlmSessionsInGroupOrSubgroups); + learnerGroup.set('ilmSessions', []); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.notOk(learnerGroup.hasIlmSessionsInGroupOrSubgroups); + subgroup.set('ilmSessions', [ilmSession]); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.ok(learnerGroup.hasIlmSessionsInGroupOrSubgroups); + subgroup.set('ilmSessions', []); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.notOk(learnerGroup.hasIlmSessionsInGroupOrSubgroups); + }); + + test('has offerings or ilm sessions in group or subgroups', async function (assert) { + const store = this.owner.lookup('service:store'); + const learnerGroup = store.createRecord('learner-group'); + const subgroup = store.createRecord('learner-group', { parent: learnerGroup }); + const ilmSession = store.createRecord('ilm-session'); + const offering = store.createRecord('offering'); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.notOk(learnerGroup.hasOfferingsOrIlmSessionsInGroupOrSubgroups); + learnerGroup.set('offerings', [offering]); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.ok(learnerGroup.hasOfferingsOrIlmSessionsInGroupOrSubgroups); + learnerGroup.set('offerings', []); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.notOk(learnerGroup.hasOfferingsOrIlmSessionsInGroupOrSubgroups); + subgroup.set('offerings', [offering]); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.ok(learnerGroup.hasOfferingsOrIlmSessionsInGroupOrSubgroups); + subgroup.set('offerings', []); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.notOk(learnerGroup.hasOfferingsOrIlmSessionsInGroupOrSubgroups); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.notOk(learnerGroup.hasOfferingsOrIlmSessionsInGroupOrSubgroups); + learnerGroup.set('ilmSessions', [ilmSession]); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.ok(learnerGroup.hasOfferingsOrIlmSessionsInGroupOrSubgroups); + learnerGroup.set('ilmSessions', []); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.notOk(learnerGroup.hasOfferingsOrIlmSessionsInGroupOrSubgroups); + subgroup.set('ilmSessions', [ilmSession]); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.ok(learnerGroup.hasOfferingsOrIlmSessionsInGroupOrSubgroups); + subgroup.set('ilmSessions', []); + await waitForResource(learnerGroup, '_ilmSessions'); + await waitForResource(learnerGroup, '_offerings'); + await waitForResource(learnerGroup, 'descendantsOfferings'); + await waitForResource(learnerGroup, 'descendantsIlmSessions'); + assert.notOk(learnerGroup.hasOfferingsOrIlmSessionsInGroupOrSubgroups); + }); });