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}}