Skip to content

Commit 9d37691

Browse files
93747: Test cases
1 parent 6773ad9 commit 9d37691

6 files changed

Lines changed: 446 additions & 6 deletions

File tree

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
2+
import { VarDirective } from '../../../shared/utils/var.directive';
3+
import { TranslateModule } from '@ngx-translate/core';
4+
import { RouterTestingModule } from '@angular/router/testing';
5+
import { NO_ERRORS_SCHEMA } from '@angular/core';
6+
import { DsoEditMetadataFieldValuesComponent } from './dso-edit-metadata-field-values.component';
7+
import { DsoEditMetadataForm } from '../dso-edit-metadata-form';
8+
import { DSpaceObject } from '../../../core/shared/dspace-object.model';
9+
import { MetadataValue } from '../../../core/shared/metadata.models';
10+
import { of } from 'rxjs/internal/observable/of';
11+
import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
12+
import { By } from '@angular/platform-browser';
13+
14+
describe('DsoEditMetadataFieldValuesComponent', () => {
15+
let component: DsoEditMetadataFieldValuesComponent;
16+
let fixture: ComponentFixture<DsoEditMetadataFieldValuesComponent>;
17+
18+
let form: DsoEditMetadataForm;
19+
let dso: DSpaceObject;
20+
let mdField: string;
21+
let draggingMdField$: BehaviorSubject<string>;
22+
23+
beforeEach(waitForAsync(() => {
24+
dso = Object.assign(new DSpaceObject(), {
25+
metadata: {
26+
'dc.title': [
27+
Object.assign(new MetadataValue(), {
28+
value: 'Test Title',
29+
language: 'en',
30+
place: 0,
31+
}),
32+
],
33+
'dc.subject': [
34+
Object.assign(new MetadataValue(), {
35+
value: 'Subject One',
36+
language: 'en',
37+
place: 0,
38+
}),
39+
Object.assign(new MetadataValue(), {
40+
value: 'Subject Two',
41+
language: 'en',
42+
place: 1,
43+
}),
44+
Object.assign(new MetadataValue(), {
45+
value: 'Subject Three',
46+
language: 'en',
47+
place: 2,
48+
}),
49+
],
50+
},
51+
});
52+
form = new DsoEditMetadataForm(dso.metadata);
53+
mdField = 'dc.subject';
54+
draggingMdField$ = new BehaviorSubject<string>(null);
55+
56+
TestBed.configureTestingModule({
57+
declarations: [DsoEditMetadataFieldValuesComponent, VarDirective],
58+
imports: [TranslateModule.forRoot(), RouterTestingModule.withRoutes([])],
59+
providers: [
60+
],
61+
schemas: [NO_ERRORS_SCHEMA]
62+
}).compileComponents();
63+
}));
64+
65+
beforeEach(() => {
66+
fixture = TestBed.createComponent(DsoEditMetadataFieldValuesComponent);
67+
component = fixture.componentInstance;
68+
component.dso = dso;
69+
component.form = form;
70+
component.mdField = mdField;
71+
component.saving$ = of(false);
72+
component.draggingMdField$ = draggingMdField$;
73+
fixture.detectChanges();
74+
});
75+
76+
describe('when draggingMdField$ emits a value equal to mdField', () => {
77+
beforeEach(() => {
78+
draggingMdField$.next(mdField);
79+
fixture.detectChanges();
80+
});
81+
82+
it('should not disable the list', () => {
83+
expect(fixture.debugElement.query(By.css('.ds-drop-list.disabled'))).toBeNull();
84+
});
85+
});
86+
87+
describe('when draggingMdField$ emits a value different to mdField', () => {
88+
beforeEach(() => {
89+
draggingMdField$.next(`${mdField}.fake`);
90+
fixture.detectChanges();
91+
});
92+
93+
it('should disable the list', () => {
94+
expect(fixture.debugElement.query(By.css('.ds-drop-list.disabled'))).toBeTruthy();
95+
});
96+
});
97+
98+
describe('when draggingMdField$ emits null', () => {
99+
beforeEach(() => {
100+
draggingMdField$.next(null);
101+
fixture.detectChanges();
102+
});
103+
104+
it('should not disable the list', () => {
105+
expect(fixture.debugElement.query(By.css('.ds-drop-list.disabled'))).toBeNull();
106+
});
107+
});
108+
109+
describe('dropping a value on a different index', () => {
110+
beforeEach(() => {
111+
component.drop(Object.assign({
112+
previousIndex: 0,
113+
currentIndex: 2,
114+
}));
115+
});
116+
117+
it('should physically move the relevant metadata value within the form', () => {
118+
expect(form.fields[mdField][0].newValue.value).toEqual('Subject Two');
119+
expect(form.fields[mdField][1].newValue.value).toEqual('Subject Three');
120+
expect(form.fields[mdField][2].newValue.value).toEqual('Subject One');
121+
});
122+
123+
it('should update the metadata values their new place to match the new physical order', () => {
124+
expect(form.fields[mdField][0].newValue.place).toEqual(0);
125+
expect(form.fields[mdField][1].newValue.place).toEqual(1);
126+
expect(form.fields[mdField][2].newValue.place).toEqual(2);
127+
});
128+
129+
it('should maintain the metadata values their original place in their original value so it can be used later to determine the patch operations', () => {
130+
expect(form.fields[mdField][0].originalValue.place).toEqual(1);
131+
expect(form.fields[mdField][1].originalValue.place).toEqual(2);
132+
expect(form.fields[mdField][2].originalValue.place).toEqual(0);
133+
});
134+
});
135+
});
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { DsoEditMetadataHeadersComponent } from './dso-edit-metadata-headers.component';
2+
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
3+
import { VarDirective } from '../../../shared/utils/var.directive';
4+
import { TranslateModule } from '@ngx-translate/core';
5+
import { RouterTestingModule } from '@angular/router/testing';
6+
import { NO_ERRORS_SCHEMA } from '@angular/core';
7+
import { By } from '@angular/platform-browser';
8+
9+
describe('DsoEditMetadataHeadersComponent', () => {
10+
let component: DsoEditMetadataHeadersComponent;
11+
let fixture: ComponentFixture<DsoEditMetadataHeadersComponent>;
12+
13+
beforeEach(waitForAsync(() => {
14+
TestBed.configureTestingModule({
15+
declarations: [DsoEditMetadataHeadersComponent, VarDirective],
16+
imports: [TranslateModule.forRoot(), RouterTestingModule.withRoutes([])],
17+
providers: [
18+
],
19+
schemas: [NO_ERRORS_SCHEMA]
20+
}).compileComponents();
21+
}));
22+
23+
beforeEach(() => {
24+
fixture = TestBed.createComponent(DsoEditMetadataHeadersComponent);
25+
component = fixture.componentInstance;
26+
fixture.detectChanges();
27+
});
28+
29+
it('should display three headers', () => {
30+
expect(fixture.debugElement.queryAll(By.css('.ds-flex-cell')).length).toEqual(3);
31+
});
32+
});

src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,24 @@
1818
<div class="text-center ds-flex-cell ds-edit-cell">
1919
<div class="btn-group edit-field">
2020
<div class="btn-group" [ngbTooltip]="isVirtual ? (dsoType + '.edit.metadata.edit.buttons.virtual' | translate) : null">
21-
<button class="btn btn-outline-primary btn-sm ng-star-inserted" ngbTooltip="{{ dsoType + '.edit.metadata.edit.buttons.edit' | translate }}" *ngIf="!mdValue.editing"
21+
<button class="btn btn-outline-primary btn-sm ng-star-inserted" id="metadata-edit-btn" ngbTooltip="{{ dsoType + '.edit.metadata.edit.buttons.edit' | translate }}" *ngIf="!mdValue.editing"
2222
[disabled]="isVirtual || mdValue.change === DsoEditMetadataChangeTypeEnum.REMOVE || (saving$ | async)" (click)="edit.emit()">
2323
<i class="fas fa-edit fa-fw"></i>
2424
</button>
25-
<button class="btn btn-outline-success btn-sm ng-star-inserted" ngbTooltip="{{ dsoType + '.edit.metadata.edit.buttons.confirm' | translate }}" *ngIf="mdValue.editing"
25+
<button class="btn btn-outline-success btn-sm ng-star-inserted" id="metadata-confirm-btn" ngbTooltip="{{ dsoType + '.edit.metadata.edit.buttons.confirm' | translate }}" *ngIf="mdValue.editing"
2626
[disabled]="isVirtual || (saving$ | async)" (click)="confirm.emit(true)">
2727
<i class="fas fa-check fa-fw"></i>
2828
</button>
29-
<button class="btn btn-outline-danger btn-sm" ngbTooltip="{{ dsoType + '.edit.metadata.edit.buttons.remove' | translate }}"
29+
<button class="btn btn-outline-danger btn-sm" id="metadata-remove-btn" ngbTooltip="{{ dsoType + '.edit.metadata.edit.buttons.remove' | translate }}"
3030
[disabled]="isVirtual || (mdValue.change && mdValue.change !== DsoEditMetadataChangeTypeEnum.ADD) || mdValue.editing || (saving$ | async)" (click)="remove.emit()">
3131
<i class="fas fa-trash-alt fa-fw"></i>
3232
</button>
33-
<button class="btn btn-outline-warning btn-sm" ngbTooltip="{{ dsoType + '.edit.metadata.edit.buttons.undo' | translate }}"
33+
<button class="btn btn-outline-warning btn-sm" id="metadata-undo-btn" ngbTooltip="{{ dsoType + '.edit.metadata.edit.buttons.undo' | translate }}"
3434
[disabled]="isVirtual || (!mdValue.change && mdValue.reordered) || (!mdValue.change && !mdValue.editing) || (saving$ | async)" (click)="undo.emit()">
3535
<i class="fas fa-undo-alt fa-fw"></i>
3636
</button>
3737
</div>
38-
<button class="btn btn-outline-secondary ds-drag-handle btn-sm" cdkDragHandle
38+
<button class="btn btn-outline-secondary ds-drag-handle btn-sm" id="metadata-drag-btn" cdkDragHandle
3939
[ngClass]="{'disabled': isOnlyValue || (saving$ | async)}" ngbTooltip="{{ dsoType + '.edit.metadata.edit.buttons.drag' | translate }}" [disabled]="isOnlyValue || (saving$ | async)">
4040
<i class="fas fa-grip-vertical fa-fw"></i>
4141
</button>
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
import { DsoEditMetadataValueComponent } from './dso-edit-metadata-value.component';
2+
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
3+
import { VarDirective } from '../../../shared/utils/var.directive';
4+
import { TranslateModule } from '@ngx-translate/core';
5+
import { RouterTestingModule } from '@angular/router/testing';
6+
import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core';
7+
import { RelationshipService } from '../../../core/data/relationship.service';
8+
import { DSONameService } from '../../../core/breadcrumbs/dso-name.service';
9+
import { of } from 'rxjs/internal/observable/of';
10+
import { ItemMetadataRepresentation } from '../../../core/shared/metadata-representation/item/item-metadata-representation.model';
11+
import { MetadataValue, VIRTUAL_METADATA_PREFIX } from '../../../core/shared/metadata.models';
12+
import { DsoEditMetadataChangeType, DsoEditMetadataValue } from '../dso-edit-metadata-form';
13+
import { By } from '@angular/platform-browser';
14+
15+
const EDIT_BTN = 'edit';
16+
const CONFIRM_BTN = 'confirm';
17+
const REMOVE_BTN = 'remove';
18+
const UNDO_BTN = 'undo';
19+
const DRAG_BTN = 'drag';
20+
21+
describe('DsoEditMetadataValueComponent', () => {
22+
let component: DsoEditMetadataValueComponent;
23+
let fixture: ComponentFixture<DsoEditMetadataValueComponent>;
24+
25+
let relationshipService: RelationshipService;
26+
let dsoNameService: DSONameService;
27+
28+
let editMetadataValue: DsoEditMetadataValue;
29+
let metadataValue: MetadataValue;
30+
31+
function initServices(): void {
32+
relationshipService = jasmine.createSpyObj('relationshipService', {
33+
resolveMetadataRepresentation: of(new ItemMetadataRepresentation(metadataValue)),
34+
});
35+
dsoNameService = jasmine.createSpyObj('dsoNameService', {
36+
getName: 'Related Name',
37+
});
38+
}
39+
40+
beforeEach(waitForAsync(() => {
41+
metadataValue = Object.assign(new MetadataValue(), {
42+
value: 'Regular Name',
43+
language: 'en',
44+
place: 0,
45+
authority: undefined,
46+
});
47+
editMetadataValue = new DsoEditMetadataValue(metadataValue);
48+
49+
initServices();
50+
51+
TestBed.configureTestingModule({
52+
declarations: [DsoEditMetadataValueComponent, VarDirective],
53+
imports: [TranslateModule.forRoot(), RouterTestingModule.withRoutes([])],
54+
providers: [
55+
{ provide: RelationshipService, useValue: relationshipService },
56+
{ provide: DSONameService, useValue: dsoNameService },
57+
],
58+
schemas: [NO_ERRORS_SCHEMA]
59+
}).compileComponents();
60+
}));
61+
62+
beforeEach(() => {
63+
fixture = TestBed.createComponent(DsoEditMetadataValueComponent);
64+
component = fixture.componentInstance;
65+
component.mdValue = editMetadataValue;
66+
component.saving$ = of(false);
67+
fixture.detectChanges();
68+
});
69+
70+
it('should not show a badge', () => {
71+
expect(fixture.debugElement.query(By.css('ds-type-badge'))).toBeNull();
72+
});
73+
74+
describe('when no changes have been made', () => {
75+
assertButton(EDIT_BTN, true, false);
76+
assertButton(CONFIRM_BTN, false);
77+
assertButton(REMOVE_BTN, true, false);
78+
assertButton(UNDO_BTN, true, true);
79+
assertButton(DRAG_BTN, true, false);
80+
});
81+
82+
describe('when this is the only metadata value within its field', () => {
83+
beforeEach(() => {
84+
component.isOnlyValue = true;
85+
fixture.detectChanges();
86+
});
87+
88+
assertButton(DRAG_BTN, true, true);
89+
});
90+
91+
describe('when the value is marked for removal', () => {
92+
beforeEach(() => {
93+
editMetadataValue.change = DsoEditMetadataChangeType.REMOVE;
94+
fixture.detectChanges();
95+
});
96+
97+
assertButton(REMOVE_BTN, true, true);
98+
assertButton(UNDO_BTN, true, false);
99+
});
100+
101+
describe('when the value is being edited', () => {
102+
beforeEach(() => {
103+
editMetadataValue.editing = true;
104+
fixture.detectChanges();
105+
});
106+
107+
assertButton(EDIT_BTN, false);
108+
assertButton(CONFIRM_BTN, true, false);
109+
assertButton(UNDO_BTN, true, false);
110+
});
111+
112+
describe('when the value is new', () => {
113+
beforeEach(() => {
114+
editMetadataValue.change = DsoEditMetadataChangeType.ADD;
115+
fixture.detectChanges();
116+
});
117+
118+
assertButton(REMOVE_BTN, true, false);
119+
assertButton(UNDO_BTN, true, false);
120+
});
121+
122+
describe('when the metadata value is virtual', () => {
123+
beforeEach(() => {
124+
metadataValue = Object.assign(new MetadataValue(), {
125+
value: 'Virtual Name',
126+
language: 'en',
127+
place: 0,
128+
authority: `${VIRTUAL_METADATA_PREFIX}authority-key`,
129+
});
130+
editMetadataValue = new DsoEditMetadataValue(metadataValue);
131+
component.mdValue = editMetadataValue;
132+
component.ngOnInit();
133+
fixture.detectChanges();
134+
});
135+
136+
it('should show a badge', () => {
137+
expect(fixture.debugElement.query(By.css('ds-type-badge'))).toBeTruthy();
138+
});
139+
140+
assertButton(EDIT_BTN, true, true);
141+
assertButton(CONFIRM_BTN, false);
142+
assertButton(REMOVE_BTN, true, true);
143+
assertButton(UNDO_BTN, true, true);
144+
assertButton(DRAG_BTN, true, false);
145+
});
146+
147+
function assertButton(name: string, exists: boolean, disabled: boolean = false): void {
148+
describe(`${name} button`, () => {
149+
let btn: DebugElement;
150+
151+
beforeEach(() => {
152+
btn = fixture.debugElement.query(By.css(`#metadata-${name}-btn`));
153+
});
154+
155+
if (exists) {
156+
it('should exist', () => {
157+
expect(btn).toBeTruthy();
158+
});
159+
160+
it(`should${disabled ? ' ' : ' not '}be disabled`, () => {
161+
expect(btn.nativeElement.disabled).toBe(disabled);
162+
});
163+
} else {
164+
it('should not exist', () => {
165+
expect(btn).toBeNull();
166+
});
167+
}
168+
});
169+
}
170+
});

0 commit comments

Comments
 (0)