Files
dspace-angular/src/app/submission/sections/cc-license/submission-section-cc-licenses.component.spec.ts
2023-06-27 17:19:58 +02:00

282 lines
9.6 KiB
TypeScript

import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { SubmissionSectionCcLicensesComponent } from './submission-section-cc-licenses.component';
import { SUBMISSION_CC_LICENSE } from '../../../core/submission/models/submission-cc-licence.resource-type';
import { of as observableOf } from 'rxjs';
import { SubmissionCcLicenseDataService } from '../../../core/submission/submission-cc-license-data.service';
import { DebugElement } from '@angular/core';
import { By } from '@angular/platform-browser';
import { SharedModule } from '../../../shared/shared.module';
import { SectionsService } from '../sections.service';
import { SectionDataObject } from '../models/section-data.model';
import { SectionsType } from '../sections-type';
import { TranslateModule } from '@ngx-translate/core';
import { SubmissionCcLicence } from '../../../core/submission/models/submission-cc-license.model';
import { cold } from 'jasmine-marbles';
import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder';
import { SubmissionCcLicenseUrlDataService } from '../../../core/submission/submission-cc-license-url-data.service';
import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
import { createPaginatedList } from '../../../shared/testing/utils.test';
import {ConfigurationDataService} from '../../../core/data/configuration-data.service';
import {ConfigurationProperty} from '../../../core/shared/configuration-property.model';
describe('SubmissionSectionCcLicensesComponent', () => {
let component: SubmissionSectionCcLicensesComponent;
let fixture: ComponentFixture<SubmissionSectionCcLicensesComponent>;
let de: DebugElement;
const sectionObject: SectionDataObject = {
config: 'test config',
mandatory: true,
data: {},
errorsToShow: [],
serverValidationErrors: [],
header: 'test header',
id: 'test section id',
sectionType: SectionsType.SubmissionForm,
};
const submissionCcLicenses: SubmissionCcLicence[] = [
{
id: 'test license id 1',
type: SUBMISSION_CC_LICENSE,
name: 'test license name 1',
fields: [
{
id: 'test-field-id-1a',
label: 'test field label 1a',
description: 'test field description 1a',
enums: [
{
id: 'test enum id 1a I',
label: 'test enum label 1a I',
description: 'test enum description 1a I',
},
{
id: 'test enum id 1a II',
label: 'test enum label 1a II',
description: 'test enum description 1a II',
},
],
},
{
id: 'test-field-id-1b',
label: 'test field label 1b',
description: 'test field description 1b',
enums: [
{
id: 'test enum id 1b I',
label: 'test enum label 1b I',
description: 'test enum description 1b I',
},
{
id: 'test enum id 1b II',
label: 'test enum label 1b II',
description: 'test enum description 1b II',
},
],
},
],
_links: {
self: {
href: 'test link',
},
},
},
{
id: 'test license id 2',
type: SUBMISSION_CC_LICENSE,
name: 'test license name 2',
fields: [
{
id: 'test-field-id-2a',
label: 'test field label 2a',
description: 'test field description 2a',
enums: [
{
id: 'test enum id 2a I',
label: 'test enum label 2a I',
description: 'test enum description 2a I',
},
{
id: 'test enum id 2a II',
label: 'test enum label 2a II',
description: 'test enum description 2a II',
},
],
},
{
id: 'test-field-id-2b',
label: 'test field label 2b',
description: 'test field description 2b',
enums: [
{
id: 'test enum id 2b I',
label: 'test enum label 2b I',
description: 'test enum description 2b I',
},
{
id: 'test enum id 2b II',
label: 'test enum label 2b II',
description: 'test enum description 2b II',
},
],
},
],
_links: {
self: {
href: 'test link',
},
},
},
];
const submissionCcLicensesDataService = jasmine.createSpyObj('submissionCcLicensesDataService', {
findAll: createSuccessfulRemoteDataObject$(createPaginatedList(submissionCcLicenses)),
});
const submissionCcLicenseUrlDataService = jasmine.createSpyObj('submissionCcLicenseUrlDataService', {
getCcLicenseLink: createSuccessfulRemoteDataObject$(
{
url: 'test cc license link',
},
),
});
const sectionService = {
getSectionState: () => {
return observableOf({});
},
setSectionStatus: () => undefined,
updateSectionData: (submissionId, sectionId, updatedData) => {
component.sectionData.data = updatedData;
},
};
const operationsBuilder = jasmine.createSpyObj('operationsBuilder', {
add: undefined,
remove: undefined,
});
const configurationDataService = jasmine.createSpyObj('configurationDataService', {
findByPropertyName: createSuccessfulRemoteDataObject$({
... new ConfigurationProperty(),
name: 'cc.license.jurisdiction',
values: ['mock-jurisdiction-value'],
}),
});
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [
SharedModule,
TranslateModule.forRoot(),
],
declarations: [
SubmissionSectionCcLicensesComponent,
],
providers: [
{ provide: SubmissionCcLicenseDataService, useValue: submissionCcLicensesDataService },
{ provide: SubmissionCcLicenseUrlDataService, useValue: submissionCcLicenseUrlDataService },
{ provide: SectionsService, useValue: sectionService },
{ provide: JsonPatchOperationsBuilder, useValue: operationsBuilder },
{ provide: ConfigurationDataService, useValue: configurationDataService },
{ provide: 'collectionIdProvider', useValue: 'test collection id' },
{ provide: 'sectionDataProvider', useValue: Object.assign({}, sectionObject) },
{ provide: 'submissionIdProvider', useValue: 'test submission id' },
],
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(SubmissionSectionCcLicensesComponent);
component = fixture.componentInstance;
de = fixture.debugElement;
fixture.detectChanges();
});
it('should display a dropdown with the different cc licenses', () => {
expect(
de.query(By.css('.ccLicense-select ds-select .dropdown-menu button:nth-child(1)')).nativeElement.innerText,
).toContain('test license name 1');
expect(
de.query(By.css('.ccLicense-select ds-select .dropdown-menu button:nth-child(2)')).nativeElement.innerText,
).toContain('test license name 2');
});
describe('when a license is selected', () => {
const ccLicence = submissionCcLicenses[1];
beforeEach(() => {
component.selectCcLicense(ccLicence);
fixture.detectChanges();
});
it('should display the selected cc license', () => {
expect(
de.query(By.css('.ccLicense-select ds-select button.selection')).nativeElement.innerText,
).toContain('test license name 2');
});
it('should display all field labels of the selected cc license only', () => {
expect(de.query(By.css('div.test-field-id-1a'))).toBeNull();
expect(de.query(By.css('div.test-field-id-1b'))).toBeNull();
expect(de.query(By.css('div.test-field-id-2a'))).toBeTruthy();
expect(de.query(By.css('div.test-field-id-2b'))).toBeTruthy();
});
it('should not display a cc license link', () => {
expect(de.query(By.css('.license-link'))).toBeNull();
});
it('should have section status incomplete', () => {
expect(component.getSectionStatus()).toBeObservable(cold('(a|)', { a: false }));
});
describe('when all options have a value selected', () => {
beforeEach(() => {
component.selectOption(ccLicence, ccLicence.fields[0], ccLicence.fields[0].enums[1]);
component.selectOption(ccLicence, ccLicence.fields[1], ccLicence.fields[1].enums[0]);
fixture.detectChanges();
});
it('should call the submission cc licenses data service getCcLicenseLink method', () => {
expect(submissionCcLicenseUrlDataService.getCcLicenseLink).toHaveBeenCalledWith(
ccLicence,
new Map([
[ccLicence.fields[0], ccLicence.fields[0].enums[1]],
[ccLicence.fields[1], ccLicence.fields[1].enums[0]],
]),
);
});
it('should display a cc license link', () => {
expect(de.query(By.css('.license-link'))).toBeTruthy();
});
it('should not be accepted', () => {
expect(component.accepted).toBeFalse();
});
it('should have section status incomplete', () => {
expect(component.getSectionStatus()).toBeObservable(cold('(a|)', { a: false }));
});
describe('when the cc license is accepted', () => {
beforeEach(() => {
component.setAccepted(true);
fixture.detectChanges();
});
it('should have section status complete', () => {
expect(component.getSectionStatus()).toBeObservable(cold('(a|)', { a: true }));
});
});
});
});
});