import {Input, provide, Component} from 'ng-forward'; import {ArticleViewComponent, ArticleDefaultViewComponent} from './article-default-view.component'; import {ComponentTestHelper, createClass} from './../../spec/component-test-helper'; import * as helpers from "../../spec/helpers"; // this htmlTemplate will be re-used between the container components in this spec file const htmlTemplate: string = ''; describe("Components", () => { // the karma preprocessor html2js transform the templates html into js files which put // the templates to the templateCache into the module templates // we need to load the module templates here as the template for the // component Noosfero ArtileView will be load on our tests beforeEach(angular.mock.module("templates")); describe("Article Default View Component", () => { let helper: ComponentTestHelper; const defaultViewTemplate: string = ''; let notificationService = helpers.mocks.notificationService; let articleService: any = helpers.mocks.articleService; let article = { id: 1, profile: { identifier: "1" } }; let state = jasmine.createSpyObj("state", ["go", "transitionTo"]); let providers = [ provide('$state', { useValue: state }), provide('ArticleService', { useValue: articleService }), helpers.createProviderToValue('NotificationService', notificationService), ].concat(helpers.provideFilters("translateFilter")); /** * The beforeEach procedure will initialize the helper and parse * the component according to the given providers. Unfortunetly, in * this mode, the providers and properties given to the construtor * can't be overriden. */ beforeEach((done) => { // Create the component bed for the test. Optionally, this could be done // in each test if one needs customization of these parameters per test let cls = createClass({ template: defaultViewTemplate, directives: [ArticleDefaultViewComponent], providers: providers, properties: { article: article } }); helper = new ComponentTestHelper(cls, done); }); function getArticle() { return this.article; } it("it should delete article when delete is activated", () => { expect(helper.component.article).toEqual(article); // Spy the state service doDeleteArticle(); expect(state.transitionTo).toHaveBeenCalled(); }); it("hide button to delete article when user doesn't have permission", () => { expect(helper.find(".article-toolbar .delete-article").attr('style')).toEqual("display: none; "); }); it("hide button to edit article when user doesn't have permission", () => { expect(helper.find(".article-toolbar .edit-article").attr('style')).toEqual("display: none; "); }); it("show button to edit article when user has permission", () => { (helper.component['article'])['permissions'] = ['allow_edit']; helper.detectChanges(); expect(helper.find(".article-toolbar .edit-article").attr('style')).toEqual(''); }); it("show button to delete article when user has permission", () => { (helper.component['article'])['permissions'] = ['allow_delete']; helper.detectChanges(); expect(helper.find(".article-toolbar .delete-article").attr('style')).toEqual(''); }); /** * Execute the delete method on the target component */ function doDeleteArticle() { // Create a mock for the notification service confirmation spyOn(helper.component.notificationService, 'confirmation').and.callFake(function(params: Function) { }); // Create a mock for the ArticleService removeArticle method spyOn(helper.component.articleService, 'remove').and.callFake(function(param: noosfero.Article) { return { catch: () => { } }; }); helper.component.delete(); expect(notificationService.confirmation).toHaveBeenCalled(); helper.component.doDelete(); expect(articleService.remove).toHaveBeenCalled(); // After the component delete method execution, fire the // ArticleEvent.removed event simulateRemovedEvent(); } /** * Simulate the Notification Service confirmation and ArticleService * notifyArticleRemovedListeners event */ function simulateRemovedEvent() { helper.component.notificationService["confirmation"]({ title: "Title", message: "Message" }, () => { }); helper.component.articleService["modelRemovedEventEmitter"].next(article); } }); });