diff --git a/packages/frontend/app/components/school-vocabularies-expanded.hbs b/packages/frontend/app/components/school-vocabularies-expanded.hbs index 321ce4dcc3..46405d39c6 100644 --- a/packages/frontend/app/components/school-vocabularies-expanded.hbs +++ b/packages/frontend/app/components/school-vocabularies-expanded.hbs @@ -32,6 +32,7 @@ {{/if}} diff --git a/packages/frontend/app/components/school-vocabulary-term-manager.hbs b/packages/frontend/app/components/school-vocabulary-term-manager.hbs index 18bc4434a2..6a63ad87fa 100644 --- a/packages/frontend/app/components/school-vocabulary-term-manager.hbs +++ b/packages/frontend/app/components/school-vocabulary-term-manager.hbs @@ -75,6 +75,7 @@ @icon="trash" class="clickable remove enabled" {{on "click" (perform this.deleteTerm)}} + data-test-delete /> {{else}} diff --git a/packages/frontend/tests/acceptance/school/competencies-test.js b/packages/frontend/tests/acceptance/school/competencies-test.js new file mode 100644 index 0000000000..0b45c79de7 --- /dev/null +++ b/packages/frontend/tests/acceptance/school/competencies-test.js @@ -0,0 +1,184 @@ +import { module, test, todo } from 'qunit'; +import { currentURL } from '@ember/test-helpers'; +import { setupApplicationTest } from 'frontend/tests/helpers'; +import { setupAuthentication } from 'ilios-common'; +import page from 'frontend/tests/pages/school'; +import percySnapshot from '@percy/ember'; + +module('Acceptance | school/competencies', function (hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(async function () { + this.school = this.server.create('school'); + await setupAuthentication({ administeredSchools: [this.school] }); + + const domains = this.server.createList('competency', 2, { + school: this.school, + }); + this.server.create('aamc-pcrs', { + competencies: [domains[0]], + }); + this.server.createList('aamc-pcrs', 3); + + this.server.createList('competency', 1, { + school: this.school, + parent: domains[0], + }); + }); + + test('collapsed competencies', async function (assert) { + assert.expect(7); + await page.visit({ schoolId: this.school.id }); + assert.strictEqual(currentURL(), '/schools/1'); + await percySnapshot(assert); + + assert.strictEqual(page.manager.schoolCompetenciesCollapsed.title.text, 'Competencies (2/1)'); + const { domains } = page.manager.schoolCompetenciesCollapsed; + assert.strictEqual(domains.length, 2); + assert.strictEqual(domains[0].title, 'competency 0'); + assert.strictEqual(domains[0].summary, 'There is 1 subcompetency'); + assert.strictEqual(domains[1].title, 'competency 1'); + assert.strictEqual(domains[1].summary, 'There are 0 subcompetencies'); + }); + + test('expanded competencies', async function (assert) { + assert.expect(11); + await page.visit({ schoolId: this.school.id, schoolCompetencyDetails: true }); + await percySnapshot(assert); + + assert.strictEqual( + page.manager.schoolCompetenciesExpanded.collapser.text, + 'Competencies (2/1)', + ); + const { items } = page.manager.schoolCompetenciesExpanded.competenciesList; + assert.strictEqual(items.length, 3); + assert.strictEqual(items[0].title.text, 'competency 0'); + assert.strictEqual(items[1].title.text, 'competency 2'); + assert.strictEqual(items[2].title.text, 'competency 1'); + + assert.strictEqual(items[0].pcrs.items.length, 1); + assert.strictEqual(items[0].pcrs.items[0].text, '1 aamc pcrs 0'); + + assert.strictEqual(items[1].pcrs.items.length, 1); + assert.strictEqual(items[1].pcrs.items[0].text, 'Click to edit'); + + assert.strictEqual(items[2].pcrs.items.length, 1); + assert.strictEqual(items[2].pcrs.items[0].text, 'Click to edit'); + }); + + test('manager', async function (assert) { + assert.expect(5); + await page.visit({ schoolId: this.school.id, schoolCompetencyDetails: true }); + + await page.manager.schoolCompetenciesExpanded.manage(); + await percySnapshot(assert); + const { domains } = page.manager.schoolCompetenciesExpanded.competenciesManager; + + assert.strictEqual(domains.length, 2); + assert.strictEqual(domains[0].details.editor.text, 'competency 0'); + assert.strictEqual(domains[0].competencies.length, 1); + assert.strictEqual(domains[0].competencies[0].editor.text, 'competency 2'); + assert.strictEqual(domains[1].details.editor.text, 'competency 1'); + }); + + test('add new domain', async function (assert) { + assert.expect(8); + await page.visit({ schoolId: this.school.id, schoolCompetencyDetails: true }); + + const { schoolCompetenciesExpanded: e } = page.manager; + await e.manage(); + await e.competenciesManager.newDomain.newCompetency.title.set('new domain'); + await e.competenciesManager.newDomain.newCompetency.save(); + + const { domains } = e.competenciesManager; + assert.strictEqual(domains.length, 3); + assert.strictEqual(domains[0].details.editor.text, 'competency 0'); + assert.strictEqual(domains[0].competencies.length, 1); + assert.strictEqual(domains[0].competencies[0].editor.text, 'competency 2'); + assert.strictEqual(domains[1].details.editor.text, 'competency 1'); + assert.strictEqual(domains[1].competencies.length, 0); + assert.strictEqual(domains[2].details.editor.text, 'new domain'); + assert.strictEqual(domains[2].competencies.length, 0); + }); + + test('add new sub competency', async function (assert) { + assert.expect(7); + await page.visit({ schoolId: this.school.id, schoolCompetencyDetails: true }); + + const { schoolCompetenciesExpanded: e } = page.manager; + await e.manage(); + const { domains } = e.competenciesManager; + await domains[0].newCompetency.title.set('new sub competency'); + await domains[0].newCompetency.save(); + + assert.strictEqual(domains.length, 2); + assert.strictEqual(domains[0].details.editor.text, 'competency 0'); + assert.strictEqual(domains[0].competencies.length, 2); + assert.strictEqual(domains[0].competencies[0].editor.text, 'competency 2'); + assert.strictEqual(domains[0].competencies[1].editor.text, 'new sub competency'); + assert.strictEqual(domains[1].details.editor.text, 'competency 1'); + assert.strictEqual(domains[1].competencies.length, 0); + }); + + test('edit domain title', async function (assert) { + assert.expect(3); + await page.visit({ schoolId: this.school.id, schoolCompetencyDetails: true }); + + const { schoolCompetenciesExpanded: e } = page.manager; + await e.manage(); + const { domains } = e.competenciesManager; + await domains[0].details.editor.title.edit(); + await domains[0].details.editor.title.set('new title'); + await domains[0].details.editor.title.save(); + assert.strictEqual(domains.length, 2); + assert.strictEqual(domains[0].details.editor.text, 'competency 1'); + assert.strictEqual(domains[1].details.editor.text, 'new title'); + }); + + test('edit competency title', async function (assert) { + assert.expect(5); + await page.visit({ schoolId: this.school.id, schoolCompetencyDetails: true }); + + await page.manager.schoolCompetenciesExpanded.manage(); + await percySnapshot(assert); + const { domains } = page.manager.schoolCompetenciesExpanded.competenciesManager; + + await domains[0].competencies[0].editor.title.edit(); + await domains[0].competencies[0].editor.title.set('new title'); + await domains[0].competencies[0].editor.title.save(); + + assert.strictEqual(domains.length, 2); + assert.strictEqual(domains[0].details.editor.text, 'competency 0'); + assert.strictEqual(domains[0].competencies.length, 1); + assert.strictEqual(domains[0].competencies[0].editor.text, 'new title'); + assert.strictEqual(domains[1].details.editor.text, 'competency 1'); + }); + + todo('save changes', async function (assert) { + assert.expect(4); + await page.visit({ schoolId: this.school.id, schoolCompetencyDetails: true }); + const { schoolCompetenciesExpanded: e } = page.manager; + await e.manage(); + const { domains } = e.competenciesManager; + await domains[0].details.editor.title.edit(); + await domains[0].details.editor.title.set('aa domain'); + await domains[0].details.editor.title.save(); + await domains[0].competencies[0].editor.title.edit(); + await domains[0].competencies[0].editor.title.set('aa competency'); + await domains[0].competencies[0].editor.title.save(); + await domains[0].newCompetency.title.set('new sub competency'); + await domains[0].newCompetency.save(); + await domains[1].remove(); + await domains[0].competencies[0].remove(); + await e.competenciesManager.newDomain.newCompetency.title.set('new domain'); + await e.competenciesManager.newDomain.newCompetency.save(); + + await e.save(); + + const { items } = e.competenciesList; + assert.strictEqual(items.length, 3); + assert.strictEqual(items[0].title.text, 'aa domain'); + assert.strictEqual(items[1].title.text, 'new sub competency'); + assert.strictEqual(items[2].title.text, 'new domain'); + }); +}); diff --git a/packages/frontend/tests/acceptance/school/emails-test.js b/packages/frontend/tests/acceptance/school/emails-test.js new file mode 100644 index 0000000000..ec7f9a3198 --- /dev/null +++ b/packages/frontend/tests/acceptance/school/emails-test.js @@ -0,0 +1,49 @@ +import { module, test } from 'qunit'; +import { currentURL } from '@ember/test-helpers'; +import { setupApplicationTest } from 'frontend/tests/helpers'; +import { setupAuthentication } from 'ilios-common'; +import page from 'frontend/tests/pages/school'; +import percySnapshot from '@percy/ember'; + +module('Acceptance | school/emails', function (hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(async function () { + this.school = this.server.create('school', { + iliosAdministratorEmail: 'admin@school.edu', + changeAlertRecipients: 'email1@school.edu, email2@school.edu', + }); + await setupAuthentication({ administeredSchools: [this.school] }); + }); + + test('view', async function (assert) { + assert.expect(7); + await page.visit({ schoolId: this.school.id }); + assert.strictEqual(currentURL(), '/schools/1'); + await percySnapshot(assert); + const { emails: c } = page.manager; + + assert.strictEqual(c.title, 'Emails'); + assert.ok(c.canManage); + assert.strictEqual(c.changeAlertRecipients.label, 'Change-alert Recipients:'); + assert.strictEqual(c.changeAlertRecipients.value, 'email1@school.edu, email2@school.edu'); + assert.strictEqual(c.administratorEmail.label, 'Administrator Email:'); + assert.strictEqual(c.administratorEmail.value, 'admin@school.edu'); + }); + + test('manage', async function (assert) { + assert.expect(2); + await page.visit({ schoolId: this.school.id, schoolManageEmails: true }); + await percySnapshot(assert); + const { emailsEditor: c } = page.manager; + + await c.administratorEmail.set('new-admin@school.edu'); + await c.changeAlertRecipients.set('third@school.edu'); + await c.save(); + + const { emails } = page.manager; + + assert.strictEqual(emails.administratorEmail.value, 'new-admin@school.edu'); + assert.strictEqual(emails.changeAlertRecipients.value, 'third@school.edu'); + }); +}); diff --git a/packages/frontend/tests/acceptance/school/leadership-test.js b/packages/frontend/tests/acceptance/school/leadership-test.js new file mode 100644 index 0000000000..c5609a6948 --- /dev/null +++ b/packages/frontend/tests/acceptance/school/leadership-test.js @@ -0,0 +1,222 @@ +import { module, test } from 'qunit'; +import { currentURL } from '@ember/test-helpers'; +import { setupApplicationTest } from 'frontend/tests/helpers'; +import { setupAuthentication } from 'ilios-common'; +import page from 'frontend/tests/pages/school'; +import percySnapshot from '@percy/ember'; + +module('Acceptance | school/leadership', function (hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(async function () { + this.school = this.server.create('school'); + await setupAuthentication({ administeredSchools: [this.school] }); + + this.server.createList('user', 2, { + directedSchools: [this.school], + school: this.school, + }); + this.server.createList('user', 1, { + administeredSchools: [this.school], + school: this.school, + }); + this.server.createList('user', 2, { + school: this.school, + }); + }); + + test('collapsed leadership', async function (assert) { + assert.expect(9); + await page.visit({ schoolId: this.school.id }); + assert.strictEqual(currentURL(), '/schools/1'); + await percySnapshot(assert); + + assert.strictEqual(page.manager.schoolLeadershipCollapsed.title, 'Leadership (4)'); + assert.strictEqual(page.manager.schoolLeadershipCollapsed.headers.length, 1); + assert.strictEqual(page.manager.schoolLeadershipCollapsed.headers[0].title, 'Summary'); + + assert.strictEqual(page.manager.schoolLeadershipCollapsed.summary.length, 2); + assert.strictEqual(page.manager.schoolLeadershipCollapsed.summary[0].name, 'Directors'); + assert.strictEqual( + page.manager.schoolLeadershipCollapsed.summary[0].value, + 'There are 2 directors', + ); + assert.strictEqual(page.manager.schoolLeadershipCollapsed.summary[1].name, 'Administrators'); + assert.strictEqual( + page.manager.schoolLeadershipCollapsed.summary[1].value, + 'There are 2 administrators', + ); + }); + + test('list leadership', async function (assert) { + assert.expect(7); + await page.visit({ + schoolId: this.school.id, + schoolLeadershipDetails: true, + }); + await percySnapshot(assert); + + assert.strictEqual(page.manager.schoolLeadershipExpanded.title, 'Leadership (4)'); + const { directors, administrators } = page.manager.schoolLeadershipExpanded.leadershipList; + assert.strictEqual(directors.length, 2); + assert.strictEqual(directors[0].text, '1 guy M. Mc1son'); + assert.strictEqual(directors[1].text, '2 guy M. Mc2son'); + + assert.strictEqual(administrators.length, 2); + assert.strictEqual(administrators[0].text, '0 guy M. Mc0son'); + assert.strictEqual(administrators[1].text, '3 guy M. Mc3son'); + }); + + test('search administrators', async function (assert) { + await page.visit({ + schoolId: this.school.id, + schoolLeadershipDetails: true, + }); + await page.manager.schoolLeadershipExpanded.manage(); + const manager = page.manager.schoolLeadershipExpanded.leadershipManager; + await manager.administratorSearch.search('guy'); + assert.strictEqual(manager.administratorSearch.results.length, 6); + assert.strictEqual( + manager.administratorSearch.results[0].text, + '0 guy M. Mc0son user@example.edu', + ); + assert.ok(manager.administratorSearch.results[0].isSelected); + assert.strictEqual( + manager.administratorSearch.results[1].text, + '1 guy M. Mc1son user@example.edu', + ); + assert.ok(manager.administratorSearch.results[1].isSelectable); + assert.strictEqual( + manager.administratorSearch.results[2].text, + '2 guy M. Mc2son user@example.edu', + ); + assert.ok(manager.administratorSearch.results[2].isSelectable); + assert.strictEqual( + manager.administratorSearch.results[3].text, + '3 guy M. Mc3son user@example.edu', + ); + assert.ok(manager.administratorSearch.results[3].isSelected); + assert.strictEqual( + manager.administratorSearch.results[4].text, + '4 guy M. Mc4son user@example.edu', + ); + assert.ok(manager.administratorSearch.results[4].isSelectable); + assert.strictEqual( + manager.administratorSearch.results[5].text, + '5 guy M. Mc5son user@example.edu', + ); + assert.ok(manager.administratorSearch.results[5].isSelectable); + }); + + test('search directors', async function (assert) { + await page.visit({ + schoolId: this.school.id, + schoolLeadershipDetails: true, + }); + await page.manager.schoolLeadershipExpanded.manage(); + const manager = page.manager.schoolLeadershipExpanded.leadershipManager; + await manager.directorSearch.search('guy'); + assert.strictEqual(manager.directorSearch.results.length, 6); + assert.strictEqual(manager.directorSearch.results[0].text, '0 guy M. Mc0son user@example.edu'); + assert.ok(manager.directorSearch.results[0].isSelectable); + assert.strictEqual(manager.directorSearch.results[1].text, '1 guy M. Mc1son user@example.edu'); + assert.ok(manager.directorSearch.results[1].isSelected); + assert.strictEqual(manager.directorSearch.results[2].text, '2 guy M. Mc2son user@example.edu'); + assert.ok(manager.directorSearch.results[2].isSelected); + assert.strictEqual(manager.directorSearch.results[3].text, '3 guy M. Mc3son user@example.edu'); + assert.ok(manager.directorSearch.results[3].isSelectable); + assert.strictEqual(manager.directorSearch.results[4].text, '4 guy M. Mc4son user@example.edu'); + assert.ok(manager.directorSearch.results[4].isSelectable); + assert.strictEqual(manager.directorSearch.results[5].text, '5 guy M. Mc5son user@example.edu'); + assert.ok(manager.directorSearch.results[5].isSelectable); + }); + + test('manage leadership', async function (assert) { + await page.visit({ + schoolId: this.school.id, + schoolLeadershipDetails: true, + }); + await page.manager.schoolLeadershipExpanded.manage(); + const manager = page.manager.schoolLeadershipExpanded.leadershipManager; + + const { selectedDirectors, selectedAdministrators } = manager; + assert.strictEqual(selectedDirectors.length, 2); + assert.strictEqual(selectedDirectors[0].text, '1 guy M. Mc1son'); + assert.strictEqual(selectedDirectors[1].text, '2 guy M. Mc2son'); + + assert.strictEqual(selectedAdministrators.length, 2); + assert.strictEqual(selectedAdministrators[0].text, '0 guy M. Mc0son'); + assert.strictEqual(selectedAdministrators[1].text, '3 guy M. Mc3son'); + + await selectedDirectors[0].remove(); + await selectedAdministrators[1].remove(); + await manager.directorSearch.search('guy'); + await manager.directorSearch.results[0].add(); + + await manager.administratorSearch.search('guy'); + await manager.administratorSearch.results[1].add(); + + assert.strictEqual(selectedDirectors.length, 2); + assert.strictEqual(selectedDirectors[0].text, '0 guy M. Mc0son'); + assert.strictEqual(selectedDirectors[1].text, '2 guy M. Mc2son'); + + assert.strictEqual(selectedAdministrators.length, 2); + assert.strictEqual(selectedAdministrators[0].text, '0 guy M. Mc0son'); + assert.strictEqual(selectedAdministrators[1].text, '1 guy M. Mc1son'); + }); + + test('cancel leadership changes', async function (assert) { + await page.visit({ + schoolId: this.school.id, + schoolLeadershipDetails: true, + }); + await page.manager.schoolLeadershipExpanded.manage(); + const manager = page.manager.schoolLeadershipExpanded.leadershipManager; + const { selectedDirectors, selectedAdministrators } = manager; + await selectedDirectors[0].remove(); + await selectedAdministrators[1].remove(); + + await manager.directorSearch.search('guy'); + await manager.directorSearch.results[3].add(); + + await manager.administratorSearch.search('guy'); + await manager.administratorSearch.results[1].add(); + + await page.manager.schoolLeadershipExpanded.cancel(); + const { directors, administrators } = page.manager.schoolLeadershipExpanded.leadershipList; + assert.strictEqual(directors.length, 2); + assert.strictEqual(directors[0].text, '1 guy M. Mc1son'); + assert.strictEqual(directors[1].text, '2 guy M. Mc2son'); + + assert.strictEqual(administrators.length, 2); + assert.strictEqual(administrators[0].text, '0 guy M. Mc0son'); + assert.strictEqual(administrators[1].text, '3 guy M. Mc3son'); + }); + + test('save leadership changes', async function (assert) { + await page.visit({ + schoolId: this.school.id, + schoolLeadershipDetails: true, + }); + await page.manager.schoolLeadershipExpanded.manage(); + const manager = page.manager.schoolLeadershipExpanded.leadershipManager; + const { selectedDirectors, selectedAdministrators } = manager; + await selectedDirectors[0].remove(); + await selectedAdministrators[1].remove(); + await manager.directorSearch.search('guy'); + await manager.directorSearch.results[0].add(); + + await manager.administratorSearch.search('guy'); + await manager.administratorSearch.results[1].add(); + + await page.manager.schoolLeadershipExpanded.save(); + const { directors, administrators } = page.manager.schoolLeadershipExpanded.leadershipList; + assert.strictEqual(directors.length, 2); + assert.strictEqual(directors[0].text, '0 guy M. Mc0son'); + assert.strictEqual(directors[1].text, '2 guy M. Mc2son'); + + assert.strictEqual(administrators.length, 2); + assert.strictEqual(administrators[0].text, '0 guy M. Mc0son'); + assert.strictEqual(administrators[1].text, '1 guy M. Mc1son'); + }); +}); diff --git a/packages/frontend/tests/acceptance/school/vocabularies-test.js b/packages/frontend/tests/acceptance/school/vocabularies-test.js new file mode 100644 index 0000000000..20541ab943 --- /dev/null +++ b/packages/frontend/tests/acceptance/school/vocabularies-test.js @@ -0,0 +1,146 @@ +import { module, test } from 'qunit'; +import { currentURL } from '@ember/test-helpers'; +import { setupApplicationTest } from 'frontend/tests/helpers'; +import { setupAuthentication } from 'ilios-common'; +import page from 'frontend/tests/pages/school'; +import percySnapshot from '@percy/ember'; + +module('Acceptance | school/vocabularies', function (hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(async function () { + this.school = this.server.create('school'); + await setupAuthentication({ administeredSchools: [this.school] }); + + this.server.create('vocabulary', { + school: this.school, + terms: this.server.createList('term', 2), + }); + + this.server.create('vocabulary', { + school: this.school, + terms: this.server.createList('term', 1), + }); + }); + + test('collapsed', async function (assert) { + assert.expect(7); + await page.visit({ schoolId: this.school.id }); + assert.strictEqual(currentURL(), '/schools/1'); + await percySnapshot(assert); + const { schoolVocabulariesCollapsed: c } = page.manager; + + assert.strictEqual(c.title, 'Vocabularies (2)'); + assert.strictEqual(c.vocabularies.length, 2); + assert.strictEqual(c.vocabularies[0].title, 'Vocabulary 1'); + assert.strictEqual(c.vocabularies[0].summary, 'There are 2 terms'); + assert.strictEqual(c.vocabularies[1].title, 'Vocabulary 2'); + assert.strictEqual(c.vocabularies[1].summary, 'There is 1 term'); + }); + + test('expanded', async function (assert) { + assert.expect(8); + await page.visit({ schoolId: this.school.id, schoolVocabularyDetails: true }); + await percySnapshot(assert); + const { schoolVocabulariesExpanded: c } = page.manager; + + assert.strictEqual(c.title, 'Vocabularies (2)'); + assert.strictEqual(c.vocabulariesList.vocabularies.length, 2); + assert.strictEqual(c.vocabulariesList.vocabularies[0].title.text, 'Vocabulary 1'); + assert.strictEqual(c.vocabulariesList.vocabularies[0].termsCount, '2'); + assert.notOk(c.vocabulariesList.vocabularies[0].hasDeleteButton); + assert.strictEqual(c.vocabulariesList.vocabularies[1].title.text, 'Vocabulary 2'); + assert.strictEqual(c.vocabulariesList.vocabularies[1].termsCount, '1'); + assert.notOk(c.vocabulariesList.vocabularies[1].hasDeleteButton); + }); + + test('add new vocabulary', async function (assert) { + assert.expect(5); + await page.visit({ schoolId: this.school.id, schoolVocabularyDetails: true }); + const { schoolVocabulariesExpanded: c } = page.manager; + + await c.openNewVocabularyForm(); + await c.newVocabularyForm.title.set('New Vocabulary'); + await c.newVocabularyForm.submit.click(); + + assert.strictEqual(c.title, 'Vocabularies (3)'); + assert.strictEqual(c.vocabulariesList.vocabularies.length, 3); + assert.strictEqual(c.vocabulariesList.vocabularies[0].title.text, 'New Vocabulary'); + assert.strictEqual(c.vocabulariesList.vocabularies[1].title.text, 'Vocabulary 1'); + assert.strictEqual(c.vocabulariesList.vocabularies[2].title.text, 'Vocabulary 2'); + }); + + test('add new term', async function (assert) { + assert.expect(7); + await page.visit({ schoolId: this.school.id, schoolVocabularyDetails: true }); + const { schoolVocabulariesExpanded: c } = page.manager; + + await c.vocabulariesList.vocabularies[0].manage(); + assert.ok(c.vocabularyManager.isVisible); + await c.vocabularyManager.terms.newTermForm.setTitle('New Term'); + await c.vocabularyManager.terms.newTermForm.save(); + await c.vocabularyManager.breadcrumbs.returnToList(); + + await c.vocabulariesList.vocabularies[1].manage(); + assert.ok(c.vocabularyManager.isVisible); + await c.vocabularyManager.terms.newTermForm.setTitle('New Term 2'); + await c.vocabularyManager.terms.newTermForm.save(); + await c.vocabularyManager.terms.newTermForm.setTitle('New Term 3'); + await c.vocabularyManager.terms.newTermForm.save(); + await c.vocabularyManager.terms.newTermForm.setTitle('New Term 4'); + await c.vocabularyManager.terms.newTermForm.save(); + await c.vocabularyManager.breadcrumbs.returnToList(); + + assert.strictEqual(c.vocabulariesList.vocabularies.length, 2); + assert.strictEqual(c.vocabulariesList.vocabularies[0].title.text, 'Vocabulary 1'); + assert.strictEqual(c.vocabulariesList.vocabularies[0].termsCount, '3'); + assert.strictEqual(c.vocabulariesList.vocabularies[1].title.text, 'Vocabulary 2'); + assert.strictEqual(c.vocabulariesList.vocabularies[1].termsCount, '4'); + }); + + test('delete terms', async function (assert) { + assert.expect(9); + await page.visit({ schoolId: this.school.id, schoolVocabularyDetails: true }); + const { schoolVocabulariesExpanded: c } = page.manager; + + await c.vocabulariesList.vocabularies[0].manage(); + assert.ok(c.vocabularyManager.isVisible); + await c.vocabularyManager.terms.list[1].click(); + assert.ok(c.termManager.isVisible); + await c.termManager.delete(); + await c.vocabularyManager.breadcrumbs.returnToList(); + + await c.vocabulariesList.vocabularies[1].manage(); + assert.ok(c.vocabularyManager.isVisible); + await c.vocabularyManager.terms.list[0].click(); + assert.ok(c.termManager.isVisible); + await c.termManager.delete(); + await c.vocabularyManager.breadcrumbs.returnToList(); + + assert.strictEqual(c.vocabulariesList.vocabularies.length, 2); + assert.strictEqual(c.vocabulariesList.vocabularies[0].title.text, 'Vocabulary 1'); + assert.strictEqual(c.vocabulariesList.vocabularies[0].termsCount, '1'); + assert.strictEqual(c.vocabulariesList.vocabularies[1].title.text, 'Vocabulary 2'); + assert.strictEqual(c.vocabulariesList.vocabularies[1].termsCount, '0'); + }); + + test('delete vocabulary', async function (assert) { + assert.expect(7); + this.server.create('vocabulary', { + school: this.school, + }); + await page.visit({ schoolId: this.school.id, schoolVocabularyDetails: true }); + const { schoolVocabulariesExpanded: c } = page.manager; + + assert.strictEqual(c.vocabulariesList.vocabularies.length, 3); + assert.strictEqual(c.vocabulariesList.vocabularies[2].title.text, 'Vocabulary 3'); + assert.ok(c.vocabulariesList.vocabularies[2].hasDeleteButton); + await c.vocabulariesList.vocabularies[2].delete(); + assert.ok(c.vocabulariesList.deletionConfirmation.isVisible); + await c.vocabulariesList.deletionConfirmation.submit(); + + assert.strictEqual(c.vocabulariesList.vocabularies.length, 2); + assert.strictEqual(c.vocabulariesList.vocabularies[0].title.text, 'Vocabulary 1'); + assert.strictEqual(c.vocabulariesList.vocabularies[1].title.text, 'Vocabulary 2'); + }); +}); diff --git a/packages/frontend/tests/pages/components/school-vocabularies-expanded.js b/packages/frontend/tests/pages/components/school-vocabularies-expanded.js index 9937c767bb..81a6aa4792 100644 --- a/packages/frontend/tests/pages/components/school-vocabularies-expanded.js +++ b/packages/frontend/tests/pages/components/school-vocabularies-expanded.js @@ -2,14 +2,17 @@ import { clickable, create, text } from 'ember-cli-page-object'; import termManager from './school-vocabulary-term-manager'; import vocabularyManager from './school-vocabulary-manager'; import vocabulariesList from './school-vocabularies-list'; +import newVocabularyForm from './school-new-vocabulary-form'; const definition = { scope: '[data-test-school-vocabularies-expanded]', title: text('[data-test-vocabularies-title]'), collapse: clickable('[data-test-vocabularies-title]'), + openNewVocabularyForm: clickable('[data-test-new-vocabulary] button'), termManager, vocabularyManager, vocabulariesList, + newVocabularyForm, }; export default definition; diff --git a/packages/frontend/tests/pages/components/school-vocabulary-manager.js b/packages/frontend/tests/pages/components/school-vocabulary-manager.js index e0eb44a22e..5e8c21c276 100644 --- a/packages/frontend/tests/pages/components/school-vocabulary-manager.js +++ b/packages/frontend/tests/pages/components/school-vocabulary-manager.js @@ -13,6 +13,7 @@ const definition = { scope: '[data-test-breadcrumbs]', all: text('[data-test-all]'), vocabulary: text('[data-test-vocabulary]'), + returnToList: clickable('[data-test-all]'), }, terms: { scope: '[data-test-terms]', diff --git a/packages/frontend/tests/pages/components/school-vocabulary-term-manager.js b/packages/frontend/tests/pages/components/school-vocabulary-term-manager.js index 70dbb7df4e..01b994bd15 100644 --- a/packages/frontend/tests/pages/components/school-vocabulary-term-manager.js +++ b/packages/frontend/tests/pages/components/school-vocabulary-term-manager.js @@ -11,6 +11,7 @@ const definition = { hasError: isPresent('[data-test-title] .validation-error-message'), errorMessage: text('[data-test-title] .validation-error-message'), description: text('[data-test-description]'), + delete: clickable('[data-test-delete]'), breadcrumbs: { scope: '[data-test-breadcrumbs]', all: text('[data-test-all]'), diff --git a/packages/ilios-common/addon/components/expand-collapse-button.hbs b/packages/ilios-common/addon/components/expand-collapse-button.hbs index eb4c4a5eb7..8a293cd081 100644 --- a/packages/ilios-common/addon/components/expand-collapse-button.hbs +++ b/packages/ilios-common/addon/components/expand-collapse-button.hbs @@ -1,6 +1,7 @@
{{#if @value}}