This repository has been archived on 2021-08-17. You can view files and clone it, but cannot push or open issues or pull requests.
TaskBoard/test/app/board/task/task.component.spec.ts
2020-05-14 13:12:47 -04:00

299 lines
8.1 KiB
TypeScript

import { TestBed, ComponentFixture } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { FormsModule } from '@angular/forms';
import { TaskDisplayComponent } from 'src/app/board/task/task.component';
import {
AuthService,
StringsService,
ModalService,
NotificationsService
} from 'src/app/shared/services';
import { BoardService } from 'src/app/board/board.service';
import { SharedModule } from 'src/app/shared/shared.module';
describe('TaskDisplay', () => {
let component: TaskDisplayComponent;
let fixture: ComponentFixture<TaskDisplayComponent>;
const eventMock = {
target: {
tagName: 'SELECT',
parentElement: {
parentElement: { click: () => {} }
}
}
};
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
HttpClientTestingModule,
RouterTestingModule,
FormsModule,
SharedModule
],
declarations: [
TaskDisplayComponent
],
providers: [
AuthService,
NotificationsService,
ModalService,
StringsService,
BoardService
]
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(TaskDisplayComponent);
component = fixture.componentInstance;
});
it('can be constructed', () => {
expect(component).toBeTruthy();
});
it('implements OnInit', () => {
component.taskData = { id: 1, description: '' } as any;
component.activeBoard = { id: 1, columns: [{ id: 1, name: 'test' }] } as any;
component.ngOnInit();
component.taskData = { id: 1, description: '', due_date: '' } as any;
component.ngOnInit();
component.taskData = { id: 1, description: '', due_date: '1/1/2018' } as any;
component.ngOnInit();
const today = new Date();
component.taskData = {
id: 1, description: '',
due_date: (today.getMonth() + 1) + '/' +
(today.getDate() + 1) + '/' + today.getFullYear()
} as any;
component.ngOnInit();
expect(component.taskData.id).toEqual(1);
});
it('parses task description markdown into text', done => {
setupBoard();
component.taskData.description = '# Make this HTML';
component.activeBoard.issue_trackers = [
{ id: 1, regex: 'test', url: '%BUGID%' }
];
component.ngOnInit();
setTimeout(() => {
// tslint:disable-next-line
expect(component.taskData.html['changingThisBreaksApplicationSecurity'])
.toEqual('<h1 id="make-this-html">Make this HTML</h1>\n');
done();
}, 100);
});
it('handles checklists in markdown', done => {
setupBoard();
component.taskData.description = ' - [x] One\n - [ ] Two';
component.ngOnInit();
setTimeout(() => {
// tslint:disable-next-line
expect(component.taskData.html['changingThisBreaksApplicationSecurity'])
.toEqual('<ul>\n<li><i class="icon icon-check"></i>One</li>\n' +
'<li><i class="icon icon-check-empty"></i>Two</li>\n</ul>\n');
done();
}, 100);
});
it('adds attributes to links in markdown', done => {
setupBoard();
component.taskData.description = '[link](google.com)';
component.ngOnInit();
setTimeout(() => {
// tslint:disable-next-line
expect(component.taskData.html['changingThisBreaksApplicationSecurity'])
.toContain('target="tb_external" rel="noreferrer"');
done();
}, 100);
});
it('handles issue trackers in markdown', done => {
setupBoard();
component.activeBoard.issue_trackers = [
{ id: 1, url: 'TaskBoard/issues/%BUGID%', regex: '(?:Issue)?#(\\d+)' }
];
component.taskData.description = '#123';
component.ngOnInit();
setTimeout(() => {
// tslint:disable-next-line
expect(component.taskData.html['changingThisBreaksApplicationSecurity'])
.toContain('href="TaskBoard/issues/123"');
done();
}, 100);
});;
it('provides a custom style for percentage of task completed', done => {
component.percentComplete = .5;
const actual = component.getPercentStyle();
setTimeout(() => {
// tslint:disable-next-line
expect((actual as any)['changingThisBreaksApplicationSecurity'])
.toContain('width: 50%;');
done();
}, 100);
});
it('provides a custom title for percentage of task completed', () => {
component.percentComplete = .5;
component.strings = {
boards_task: 'Task',
boards_taskComplete: 'complete'
};
const actual = component.getPercentTitle();
expect(actual).toEqual('Task 50% complete');
});
it('has a function to determine text color by bg color', () => {
let color = component.getTextColor('#ffffff');
expect(color).toEqual('#333333');
color = component.getTextColor('#000000');
expect(color).toEqual('#efefef');
});
it('calls a service to change a task\'s column', () => {
const select = document.createElement('select');
const option = document.createElement('option');
select.id = 'columnsList1';
select.selectedIndex = 0;
option.value = '0';
select.appendChild(option);
document.body.appendChild(select);
component.taskData = { id: 1 } as any;
component.changeTaskColumn(eventMock);
const secondOpt = document.createElement('option');
secondOpt.value = '1';
select.appendChild(secondOpt);
select.selectedIndex = 1;
(component.boardService.updateTask as any) = () => {
return { subscribe: (fn: any) => fn({
status: 'success',
alerts: [{}],
data: [{}, {}, [{}]]
} as any) };
};
component.changeTaskColumn(eventMock);
expect(component.taskData.column_id).toEqual(1);
});
it('calls a service to copy a task to another board', () => {
const sel = document.createElement('select');
const opt = document.createElement('option');
sel.id = 'boardsList1Copy';
sel.selectedIndex = 0;
opt.value = '1';
sel.appendChild(opt);
document.body.appendChild(sel);
component.strings = { boards_copyTaskTo: 'Copy To' } as any;
component.taskData = { id: 1 } as any;
component.boardsList = [
{ id: 1, name: 'one', columns: [{ id: 1 }] },
{ id: 2, name: 'test' }
] as any;
let emitted = false;
component.onUpdateBoards.subscribe(() => emitted = true);
(component.boardService.addTask as any) = () => {
return { subscribe: (fn: any) => fn({ status: 'success' } as any) };
};
component.copyTaskToBoard(eventMock);
(component.boardService.addTask as any) = () => {
return { subscribe: (fn: any) => fn({ status: 'asdf', alerts: [{}] } as any) };
};
component.copyTaskToBoard(eventMock);
expect(emitted).toEqual(true);
});
it('calls a service to move a task to another board', () => {
const sel = document.createElement('select');
const opt = document.createElement('option');
sel.id = 'boardsList1Move';
sel.selectedIndex = 0;
opt.value = '1';
sel.appendChild(opt);
document.body.appendChild(sel);
component.strings = { boards_moveTaskTo: 'Move To' } as any;
component.taskData = { id: 1 } as any;
component.boardsList = [
{ id: 1, name: 'one', columns: [{ id: 1 }] },
{ id: 2, name: 'test' }
] as any;
let emitted = false;
component.onUpdateBoards.subscribe(() => emitted = true);
(component.boardService.updateTask as any) = () => {
return { subscribe: (fn: any) => fn({ status: 'success' } as any) };
};
component.moveTaskToBoard(eventMock);
(component.boardService.updateTask as any) = () => {
return { subscribe: (fn: any) => fn({ status: 'asdf', alerts: [{}] } as any) };
};
component.moveTaskToBoard(eventMock);
expect(emitted).toEqual(true);
});
function setupBoard() {
const today = new Date();
component.activeBoard = {
id: 1,
columns: [{ id: 1, name: 'test' }],
issue_trackers: []
} as any;
component.taskData = {
id: 1, description: '',
due_date: (today.getMonth() + 1) + '/' +
(today.getDate() + 1) + '/' + today.getFullYear()
} as any;
}
});