UNPKG

generator-fountain-angular2

Version:

Yeoman Fountain generator to scaffold a webapp with Angular 2 written in ES6 (Babel), TypeScript through Webpack or SystemJS including tools Gulp 4, ESLint, Browsersync and Karma

158 lines (148 loc) 5.68 kB
var ng = require('@angular/core'); var ngTest = require('@angular/core/testing'); var ngPlatform = require('@angular/platform-browser'); var TodoItemComponent = require('./TodoItem'); var MockTodoTextInputComponent = ng.Component({ selector: 'fountain-todo-text-input', template: '', inputs: ['newTodo', 'editing', 'placeholder', 'text'], outputs: ['onSave'] }) .Class({ constructor: function () { this.onSave = new ng.EventEmitter(false); } }); describe('TodoItem component', function () { beforeEach(ngTest.async(function () { ngTest.TestBed.configureTestingModule({ declarations: [ TodoItemComponent, MockTodoTextInputComponent ] }); ngTest.TestBed.compileComponents(); })); it('should render the correct elements', function () { var fixture = ngTest.TestBed.createComponent(TodoItemComponent); var TodoItemCmp = fixture.componentInstance; TodoItemCmp.todo = { id: 0, text: 'Use ngrx/store', completed: false }; fixture.detectChanges(); var todoItem = fixture.nativeElement; var li = todoItem.querySelector('li'); expect(li).not.toBeNull(); expect(li.className).toBe(''); var div = todoItem.querySelector('div'); expect(div).not.toBeNull(); expect(div.className).toBe('view'); var input = todoItem.querySelector('input'); expect(input).not.toBeNull(); expect(input.checked).toBe(false); var label = todoItem.querySelector('label'); expect(label).not.toBeNull(); expect(label.textContent.trim()).toBe('Use ngrx/store'); var button = todoItem.querySelector('button'); expect(button).not.toBeNull(); expect(button.className).toBe('destroy'); }); it('should call onChange when click on input', function () { var fixture = ngTest.TestBed.createComponent(TodoItemComponent); fixture.detectChanges(); var TodoItemCmp = fixture.componentInstance; TodoItemCmp.todo = { id: 0, text: 'Use ngrx/store', completed: false }; var input = fixture.nativeElement.querySelector('input'); spyOn(TodoItemCmp.onChange, 'emit'); var evt = new CustomEvent('click'); input.dispatchEvent(evt); expect(TodoItemCmp.onChange.emit).toHaveBeenCalledWith(0); }); it('should call onDestroy when click on button', function () { var fixture = ngTest.TestBed.createComponent(TodoItemComponent); fixture.detectChanges(); var TodoItemCmp = fixture.componentInstance; TodoItemCmp.todo = { id: 0, text: 'Use ngrx/store', completed: false }; var button = fixture.nativeElement.querySelector('button'); spyOn(TodoItemCmp.onDestroy, 'emit').and.callThrough(); var evt = new CustomEvent('click'); button.dispatchEvent(evt); expect(TodoItemCmp.onDestroy.emit).toHaveBeenCalledWith(0); }); it(`should change class names to 'editing' when double click on label`, function () { var fixture = ngTest.TestBed.createComponent(TodoItemComponent); fixture.detectChanges(); var TodoItemCmp = fixture.componentInstance; TodoItemCmp.todo = { id: 0, text: 'Use ngrx/store', completed: false }; var label = fixture.nativeElement.querySelector('label'); spyOn(TodoItemCmp.onDestroy, 'emit').and.callThrough(); var evt = new CustomEvent('dblclick'); label.dispatchEvent(evt); fixture.detectChanges(); var li = fixture.nativeElement.querySelector('li'); expect(li.className).toBe('editing'); }); it('should render the correct input when editing is true', function () { var fixture = ngTest.TestBed.createComponent(TodoItemComponent); var TodoItemCmp = fixture.componentInstance; TodoItemCmp.editing = true; TodoItemCmp.todo = { id: 0, text: 'Use ngrx/store', completed: false }; fixture.detectChanges(); var todoTextInput = fixture.debugElement.query(ngPlatform.By.css('fountain-todo-text-input')).componentInstance; expect(todoTextInput).not.toBeNull(); expect(todoTextInput.text).toBe('Use ngrx/store'); expect(todoTextInput.editing).toBe(true); }); it('should call handleSave when onSave event is emitted', function () { var fixture = ngTest.TestBed.createComponent(TodoItemComponent); var TodoItemCmp = fixture.componentInstance; TodoItemCmp.todo = { id: 0, text: 'Use ngrx/store', completed: false }; TodoItemCmp.editing = true; fixture.detectChanges(); spyOn(TodoItemCmp.onSave, 'emit'); var todoTextInput = fixture.debugElement.query(ngPlatform.By.css('fountain-todo-text-input')).componentInstance; spyOn(todoTextInput.onSave, 'emit').and.callThrough(); spyOn(TodoItemCmp, 'handleSave'); fixture.detectChanges(); todoTextInput.onSave.emit('Edit todo'); expect(TodoItemCmp.handleSave).toHaveBeenCalledWith('Edit todo'); }); it('should remove class name when onSave event is emitted', function () { var fixture = ngTest.TestBed.createComponent(TodoItemComponent); var TodoItemCmp = fixture.componentInstance; TodoItemCmp.editing = true; fixture.detectChanges(); spyOn(TodoItemCmp.onSave, 'emit'); var todoTextInput = fixture.debugElement.query(ngPlatform.By.css('fountain-todo-text-input')).componentInstance; spyOn(todoTextInput.onSave, 'emit').and.callThrough(); spyOn(TodoItemCmp, 'handleSave').and.callFake(function () { // eslint-disable-line max-nested-callbacks TodoItemCmp.editing = false; }); todoTextInput.onSave.emit('Use ngrx/store'); fixture.detectChanges(); var li = fixture.nativeElement.querySelector('li'); expect(li.className).toBe(''); }); });