From e6fcbbb9061d0957cb4dd974d3945a95c7d16b05 Mon Sep 17 00:00:00 2001 From: kreuzerk Date: Mon, 10 Sep 2018 08:24:51 +0200 Subject: [PATCH] Fix messages with unique lifetime --- .../src/lib/adv-growl.component.spec.ts | 195 +++++----- .../src/lib/adv-growl.component.ts | 297 +++++++-------- .../src/lib/adv-growl.model.ts | 1 + .../src/lib/adv-growl.service.spec.ts | 351 +++++++++++++++++- .../src/lib/adv-growl.service.ts | 10 +- 5 files changed, 606 insertions(+), 248 deletions(-) diff --git a/projects/primeng-advanced-growl/src/lib/adv-growl.component.spec.ts b/projects/primeng-advanced-growl/src/lib/adv-growl.component.spec.ts index 0a8cfc6..36e8d85 100644 --- a/projects/primeng-advanced-growl/src/lib/adv-growl.component.spec.ts +++ b/projects/primeng-advanced-growl/src/lib/adv-growl.component.spec.ts @@ -2,7 +2,8 @@ * Created by kevinkreuzer on 08.07.17. */ import {TestBed, inject, ComponentFixture} from '@angular/core/testing'; -import {GrowlModule, Message} from 'primeng/primeng'; +import {Message} from 'primeng/api'; +import {GrowlModule} from 'primeng/growl'; import {AdvGrowlComponent} from './adv-growl.component'; import {AdvGrowlService} from './adv-growl.service'; import {AdvPrimeMessage} from './adv-growl.model'; @@ -219,99 +220,105 @@ describe('Message Component', () => { describe('Life time detection', () => { - it('should have a lifeTime if the lifeTime property is bigger than the DEFAULT_LIFETIME', () => { - // given - component.lifeTime = 2000; - // when - const hasLifeTime = component.hasLifeTime(); - // then - expect(hasLifeTime).toBeTruthy(); - }); - - it('should not have a lifeTime if the lifeTime property is small or equal to the DEFAULT_LIFETIME', () => { - // given - component.lifeTime = 0; - // when - const hasLifeTime = component.hasLifeTime(); - // then - expect(hasLifeTime).toBeFalsy(); - }); - }); - - describe('Get LifeTime Stream', () => { - - it('should get an finit stream if the message has a lifetime', () => { - // given - const messageId = '42'; - spyOn(component, 'hasLifeTime').and.returnValue(true); - spyOn(component, 'getFinitStream'); - // when - component.getLifeTimeStream(messageId); - // then - expect(component.getFinitStream).toHaveBeenCalled(); - }); + it('should have a lifeTime if the lifeTime property is bigger than the DEFAULT_LIFETIME', () => { + // given + const lifeTime = 2000 + // when + const hasLifeTime = component.hasLifeTime(lifeTime) + // then + expect(hasLifeTime).toBeTruthy() + }) + + it('should not have a lifeTime if the lifeTime property is small or equal to the DEFAULT_LIFETIME', () => { + // given + const lifeTime = 0 + // when + const hasLifeTime = component.hasLifeTime(lifeTime) + // then + expect(hasLifeTime).toBeFalsy() + }) + }) - it('should get an infinit stream if the message has no lifetime', () => { - // given - const messageId = '42'; - spyOn(component, 'hasLifeTime').and.returnValue(false); - spyOn(component, 'getInifiniteStream'); - // when - component.getLifeTimeStream(messageId); - // then - expect(component.getInifiniteStream).toHaveBeenCalled(); - }); - }); + describe('Get LifeTime Stream', () => { + + it('should get an finit stream if the message has a lifetime', () => { + // given + const messageId = '42' + spyOn(component, 'hasLifeTime').and.returnValue(true) + spyOn(component, 'getFinitStream') + // when + component.getLifeTimeStream(messageId) + // then + expect(component.getFinitStream).toHaveBeenCalled() + }) + + it('should get an infinit stream if the message has no lifetime', () => { + // given + const messageId = '42' + spyOn(component, 'hasLifeTime').and.returnValue(false) + spyOn(component, 'getInifiniteStream') + // when + component.getLifeTimeStream(messageId) + // then + expect(component.getInifiniteStream).toHaveBeenCalled() + }) + }) - describe('Get finit stream', () => { + describe('Get finit stream', () => { - it('should get a pausable stream if freezeMessagesOnHover is set to true', () => { - // given - const messageId = '42'; - const freezeMessagesOnHover = true; - const lifeTime = 2000; - const pauseOnlyHovered = false; - component.freezeMessagesOnHover = freezeMessagesOnHover; - component.lifeTime = lifeTime; - component.pauseOnlyHoveredMessage = pauseOnlyHovered; - - component.hoverHelper = { - getPausableMessageStream: () => of(1) - } as any; - spyOn(component.hoverHelper, 'getPausableMessageStream').and.returnValue(of(1)); + it('should get a pausable stream if freezeMessagesOnHover is set to true', () => { + // given + const messageId = '42' + const freezeMessagesOnHover = true + const lifeTime = 2000 + const pauseOnlyHovered = false + component.freezeMessagesOnHover = freezeMessagesOnHover + component.pauseOnlyHoveredMessage = pauseOnlyHovered - // when - const finitStream = component.getFinitStream(messageId); - // then - expect(component.hoverHelper.getPausableMessageStream).toHaveBeenCalledWith(messageId, lifeTime, pauseOnlyHovered); - expect(finitStream.subscribe(hoveredMessageId => expect(hoveredMessageId).toBe(messageId))); - }); + component.hoverHelper = { + getPausableMessageStream: (param1, param2) => of(1) + } as any + spyOn(component.hoverHelper, 'getPausableMessageStream').and.returnValue(of(1)) - it('should get an unpausable stream if freezeMessagesOnHover is set to false', () => { - // given - const messageId = '42'; - const freezeMessagesOnHover = false; - component.freezeMessagesOnHover = freezeMessagesOnHover; - spyOn(component, 'getUnPausableMessageStream').and.returnValue(of(1)); - // when - const finitStream = component.getFinitStream(messageId); - // then - expect(component.getUnPausableMessageStream).toHaveBeenCalled(); - expect(finitStream.subscribe(hoveredMessageId => expect(hoveredMessageId).toBe(messageId))); - }); + const asserter = { + next: hoveredMessageId => expect(hoveredMessageId).toBe(messageId) + } - it('should return a timed observable when we call getUnpausable message stream', done => { - // given - const lifeTime = 0; - component.lifeTime = lifeTime; - // when - component.getUnPausableMessageStream() - .subscribe(() => done(), - error => fail(error) - ); - }); - }); - }); + // when + const finitStream = component.getFinitStream(messageId, lifeTime) + // then + expect(component.hoverHelper.getPausableMessageStream).toHaveBeenCalledWith(messageId, lifeTime, pauseOnlyHovered) + expect(finitStream.subscribe(asserter)); + }) + + it('should get an unpausable stream if freezeMessagesOnHover is set to false', () => { + // given + const messageId = '42' + const freezeMessagesOnHover = false + const lifeTime = 3000; + component.freezeMessagesOnHover = freezeMessagesOnHover + spyOn(component, 'getUnPausableMessageStream').and.returnValue(of(1)) + // when + const finitStream = component.getFinitStream(messageId, lifeTime) + // then + expect(component.getUnPausableMessageStream).toHaveBeenCalledWith(lifeTime) + expect(finitStream.subscribe(hoveredMessageId => expect(hoveredMessageId).toBe(messageId))) + }) + + // TODO Migrate test + /* + it('should return a timed observable when we call getUnpausable message stream', () => { + // given + const lifeTime = 3000 + spyOn(Observable, 'timer') + // when + component.getUnPausableMessageStream(lifeTime) + // then + expect(Observable.timer).toHaveBeenCalledWith(lifeTime) + }) + */ + }) + }) describe('Emitting Events', () => { @@ -349,10 +356,22 @@ describe('Message Component', () => { expect(component.emitMessage).toHaveBeenCalledWith($event, component.onClick); }); + it('must deallocate a message spot when a message is closed', () => { + // given + component.ngOnInit() + const $event = {message: 'Sample Message'} + spyOn(component.messageCache, 'deallocateMessageSpot') + // when + component.messageClosed($event) + // then + expect(component.messageCache.deallocateMessageSpot).toHaveBeenCalled() + }) + it('should call emit with the event and the onClose emitter when a message is closed', () => { // given const $event = {message: 'Sample Message'}; spyOn(component, 'emitMessage'); + component.ngOnInit() // when component.messageClosed($event); // then diff --git a/projects/primeng-advanced-growl/src/lib/adv-growl.component.ts b/projects/primeng-advanced-growl/src/lib/adv-growl.component.ts index e8af3fc..a9f51d7 100644 --- a/projects/primeng-advanced-growl/src/lib/adv-growl.component.ts +++ b/projects/primeng-advanced-growl/src/lib/adv-growl.component.ts @@ -2,15 +2,15 @@ * Created by kevinkreuzer on 08.07.17. */ import { - Component, - EventEmitter, - Input, - OnChanges, - OnInit, - Output, - SimpleChange, - SimpleChanges, - ViewChild + Component, + EventEmitter, + Input, + OnChanges, + OnInit, + Output, + SimpleChange, + SimpleChanges, + ViewChild } from '@angular/core'; import {mapTo, mergeMap, takeUntil, tap} from 'rxjs/operators'; import {AdvPrimeMessage} from './adv-growl.model'; @@ -19,153 +19,154 @@ import {AdvGrowlHoverHelper} from './adv-growl.hoverHelper'; import {AdvGrowlMessageCache} from './adv-growl.messageCache'; import {fromEvent, merge, Observable, Observer, Subject, timer, NEVER} from 'rxjs'; -const DEFAULT_LIFETIME = 0; +const NO_LIFETIME = 0; const FREEZE_MESSAGES_DEFAULT = false; const PAUSE_ONLY_HOVERED_DEFAULT = false; const DEFAULT_MESSAGE_SPOTS = 0; @Component({ - selector: 'adv-growl', - templateUrl: './adv-growl.component.html' + selector: 'adv-growl', + templateUrl: './adv-growl.component.html' }) export class AdvGrowlComponent implements OnInit, OnChanges { - @Input() style: any; - @Input() styleClass: any; - @Input('life') lifeTime = DEFAULT_LIFETIME; - @Input() freezeMessagesOnHover = FREEZE_MESSAGES_DEFAULT; - @Input() messageSpots = DEFAULT_MESSAGE_SPOTS; - @Input() pauseOnlyHoveredMessage = PAUSE_ONLY_HOVERED_DEFAULT; - @Output() onClose = new EventEmitter(); - @Output() onClick = new EventEmitter(); - @Output() onMessagesChanges = new EventEmitter>(); - - @ViewChild('growlMessage') growlMessage; - - public messages: Array = []; - messageEnter$ = new Subject(); - messageSpotChange$ = new Subject(); - hoverHelper: AdvGrowlHoverHelper; - messageCache: AdvGrowlMessageCache; - private messageObserver: Observer; - - constructor(private messageService: AdvGrowlService) { - this.messageObserver = this.createMessageObserver(); - } - - ngOnInit(): void { - const mouseLeave$ = fromEvent(this.growlMessage.el.nativeElement, 'mouseleave'); - this.hoverHelper = new AdvGrowlHoverHelper(this.messageEnter$, mouseLeave$); - this.messageCache = new AdvGrowlMessageCache(); - this.subscribeForMessages(); - } - - ngOnChanges(changes: SimpleChanges): void { - const messageSpotChange = changes.messageSpots; - if (messageSpotChange != null && this.haveMessageSpotsChanged(messageSpotChange)) { - this.messageSpotChange$.next(); - } - } - - haveMessageSpotsChanged(messageSpotChange: SimpleChange) { - const currentValue = messageSpotChange.currentValue; - const previousValue = messageSpotChange.previousValue; - const firstChange = messageSpotChange.firstChange; - const hasValueChanged = currentValue !== previousValue; - if (currentValue != null && !firstChange && hasValueChanged) { - return true; - } - return false; - } - - createMessageObserver(): Observer { - return { - next: (messageId: string) => { - this.messageCache.deallocateMessageSpot(); - this.removeMessage(messageId); - }, - error: (error) => { - throw error; - }, - complete: () => { - this.messageCache.clearCache(); + @Input() style: any; + @Input() styleClass: any; + @Input('life') lifeTime = NO_LIFETIME; + @Input() freezeMessagesOnHover = FREEZE_MESSAGES_DEFAULT; + @Input() messageSpots = DEFAULT_MESSAGE_SPOTS; + @Input() pauseOnlyHoveredMessage = PAUSE_ONLY_HOVERED_DEFAULT; + @Output() onClose = new EventEmitter(); + @Output() onClick = new EventEmitter(); + @Output() onMessagesChanges = new EventEmitter>(); + + @ViewChild('growlMessage') growlMessage; + + public messages: Array = []; + messageEnter$ = new Subject(); + messageSpotChange$ = new Subject(); + hoverHelper: AdvGrowlHoverHelper; + messageCache: AdvGrowlMessageCache; + private messageObserver: Observer; + + constructor(private messageService: AdvGrowlService) { + this.messageObserver = this.createMessageObserver(); + } + + ngOnInit(): void { + const mouseLeave$ = fromEvent(this.growlMessage.el.nativeElement, 'mouseleave'); + this.hoverHelper = new AdvGrowlHoverHelper(this.messageEnter$, mouseLeave$); + this.messageCache = new AdvGrowlMessageCache(); this.subscribeForMessages(); - } - }; - } - - public subscribeForMessages() { - this.messages = []; - this.messageCache.getMessages(this.messageService.getMessageStream(), this.messageSpots) - .pipe( - tap(message => { - this.messages.push(message); - this.onMessagesChanges.emit(this.messages); - }), - mergeMap(message => this.getLifeTimeStream(message.id)), - takeUntil(merge( - this.messageService.getCancelStream(), - this.messageSpotChange$) - ) - ) - .subscribe(this.messageObserver); - } - - removeMessage(messageId: string) { - const index = this.messages.findIndex(message => message.id === messageId); - if (index >= 0) { - this.messages.splice(index, 1); - this.onMessagesChanges.emit(this.messages); - } - } - - getLifeTimeStream(messageId: string): Observable { - if (this.hasLifeTime()) { - return this.getFinitStream(messageId); - } - return this.getInifiniteStream(); - } - - hasLifeTime(): boolean { - return this.lifeTime > DEFAULT_LIFETIME; - } - - getInifiniteStream(): Observable { - return NEVER; - } - - getFinitStream(messageId: string): Observable { - let finitStream: Observable; - if (this.freezeMessagesOnHover) { - finitStream = this.hoverHelper.getPausableMessageStream(messageId, this.lifeTime, this.pauseOnlyHoveredMessage); - } else { - finitStream = this.getUnPausableMessageStream(); - } - return finitStream.pipe(mapTo(messageId)); - } - - getUnPausableMessageStream() { - return timer(this.lifeTime); - } - - public messageClosed($event) { - this.emitMessage($event, this.onClose); - } - - public messageClicked($event) { - this.emitMessage($event, this.onClick); - } - - public messageEntered($event) { - const message: AdvPrimeMessage = $event.message; - this.messageEnter$.next(message.id); - } - - emitMessage($event, emitter: EventEmitter) { - const message = $event.message; - if (message) { - emitter.next(message); - } - } + } + + ngOnChanges(changes: SimpleChanges): void { + const messageSpotChange = changes.messageSpots + if (messageSpotChange != null && this.haveMessageSpotsChanged(messageSpotChange)) { + this.messageSpotChange$.next() + } + } + + haveMessageSpotsChanged(messageSpotChange: SimpleChange) { + const currentValue = messageSpotChange.currentValue + const previousValue = messageSpotChange.previousValue + const firstChange = messageSpotChange.firstChange + const hasValueChanged = currentValue !== previousValue + if (currentValue != null && !firstChange && hasValueChanged) { + return true + } + return false + } + + createMessageObserver(): Observer { + return { + next: (messageId: string) => { + this.messageCache.deallocateMessageSpot() + this.removeMessage(messageId) + }, + error: (error) => { + throw error; + }, + complete: () => { + this.messageCache.clearCache() + this.subscribeForMessages() + } + }; + } + + public subscribeForMessages() { + this.messages = []; + this.messageCache.getMessages(this.messageService.getMessageStream(), this.messageSpots) + .pipe( + tap((message: AdvPrimeMessage) => { + this.messages.push(message); + this.onMessagesChanges.emit(this.messages); + }), + mergeMap((message: AdvPrimeMessage) => this.getLifeTimeStream(message.id, message.lifeTime)), + takeUntil(merge( + this.messageService.getCancelStream(), + this.messageSpotChange$) + ) + ) + .subscribe(this.messageObserver); + } + + removeMessage(messageId: string) { + const index = this.messages.findIndex(message => message.id === messageId); + if (index >= 0) { + this.messages.splice(index, 1); + this.onMessagesChanges.emit(this.messages); + } + } + + getLifeTimeStream(messageId: string, lifeTime = this.lifeTime): Observable { + if (this.hasLifeTime(lifeTime)) { + return this.getFinitStream(messageId, lifeTime); + } + return this.getInifiniteStream(); + } + + hasLifeTime(lifeTime: number): boolean { + return lifeTime > NO_LIFETIME; + } + + getInifiniteStream(): Observable { + return NEVER; + } + + getFinitStream(messageId: string, lifeTime: number): Observable { + let finitStream: Observable; + if (this.freezeMessagesOnHover) { + finitStream = this.hoverHelper.getPausableMessageStream(messageId, lifeTime, this.pauseOnlyHoveredMessage); + } else { + finitStream = this.getUnPausableMessageStream(lifeTime); + } + return finitStream.pipe(mapTo(messageId)); + } + + getUnPausableMessageStream(lifeTime: number) { + return timer(lifeTime); + } + + public messageClosed($event) { + this.messageCache.deallocateMessageSpot() + this.emitMessage($event, this.onClose); + } + + public messageClicked($event) { + this.emitMessage($event, this.onClick); + } + + public messageEntered($event) { + const message: AdvPrimeMessage = $event.message; + this.messageEnter$.next(message.id); + } + + emitMessage($event, emitter: EventEmitter) { + const message = $event.message; + if (message) { + emitter.next(message); + } + } } diff --git a/projects/primeng-advanced-growl/src/lib/adv-growl.model.ts b/projects/primeng-advanced-growl/src/lib/adv-growl.model.ts index daa3efd..f3dae07 100644 --- a/projects/primeng-advanced-growl/src/lib/adv-growl.model.ts +++ b/projects/primeng-advanced-growl/src/lib/adv-growl.model.ts @@ -6,5 +6,6 @@ export interface AdvPrimeMessage { severity: string; summary: string; detail: string; + lifeTime?: number; additionalProperties?: any; } diff --git a/projects/primeng-advanced-growl/src/lib/adv-growl.service.spec.ts b/projects/primeng-advanced-growl/src/lib/adv-growl.service.spec.ts index 3a62cc5..5f6d223 100644 --- a/projects/primeng-advanced-growl/src/lib/adv-growl.service.spec.ts +++ b/projects/primeng-advanced-growl/src/lib/adv-growl.service.spec.ts @@ -1,5 +1,5 @@ import {TestBed} from '@angular/core/testing'; -import {GrowlModule} from 'primeng/primeng'; +import {GrowlModule} from 'primeng/growl'; import {AdvGrowlService} from './adv-growl.service'; describe('Message Service', () => { @@ -11,7 +11,7 @@ describe('Message Service', () => { }); }); - describe('Creating simple messages', () => { + describe('createSuccessMessage', () => { it('should create a successmessage and stream it into the message subject', done => { // given @@ -24,7 +24,9 @@ describe('Message Service', () => { id, severity: 'success', summary: messageSummary, - detail: messageContent + detail: messageContent, + lifeTime: undefined, + additionalProperties: undefined }; sut.getMessageStream() .subscribe(message => { @@ -35,6 +37,34 @@ describe('Message Service', () => { sut.createSuccessMessage(messageContent, messageSummary); }); + it('should create a successmessage with additional properties and stream it into the message subject', done => { + // given + const sut = TestBed.get(AdvGrowlService); + const messageContent = 'Awesome Message'; + const messageSummary = 'Success'; + const additionalProperties = {title: 'test', description: 'Test message'} + const id = 1; + spyOn(sut, 'getTimeStamp').and.returnValue(id); + const expectedMessage = { + id, + severity: 'success', + summary: messageSummary, + detail: messageContent, + lifeTime: undefined, + additionalProperties + }; + sut.getMessageStream() + .subscribe(message => { + expect(message).toEqual(expectedMessage) + done(); + }); + // when + sut.createSuccessMessage(messageContent, messageSummary, additionalProperties); + }) + }) + + describe('createErrorMessage', () => { + it('should create a errormessage and stream it into the message subject', done => { // given const sut = TestBed.get(AdvGrowlService); @@ -46,7 +76,9 @@ describe('Message Service', () => { id, severity: 'error', summary: messageSummary, - detail: messageContent + detail: messageContent, + lifeTime: undefined, + additionalProperties: undefined }; sut.getMessageStream() .subscribe(message => { @@ -57,6 +89,34 @@ describe('Message Service', () => { sut.createErrorMessage(messageContent, messageSummary); }); + it('should create a errormessage with additional properties and stream it into the message subject', done => { + // given + const sut = TestBed.get(AdvGrowlService); + const messageContent = 'Awful Error'; + const messageSummary = 'Error'; + const additionalProperties = {title: 'Error message', description: 'something went wrong'} + const id = 1; + spyOn(sut, 'getTimeStamp').and.returnValue(id); + const expectedMessage = { + id, + severity: 'error', + summary: messageSummary, + detail: messageContent, + lifeTime: undefined, + additionalProperties + }; + sut.getMessageStream() + .subscribe(message => { + expect(message).toEqual(expectedMessage); + done(); + }); + // when + sut.createErrorMessage(messageContent, messageSummary, additionalProperties); + }) + }) + + describe('createInfoMessage', () => { + it('should create a infomessage and stream it into the message subject', done => { // given const sut = TestBed.get(AdvGrowlService); @@ -68,7 +128,9 @@ describe('Message Service', () => { id, severity: 'info', summary: messageSummary, - detail: messageContent + detail: messageContent, + lifeTime: undefined, + additionalProperties: undefined }; sut.getMessageStream() .subscribe(message => { @@ -79,6 +141,34 @@ describe('Message Service', () => { sut.createInfoMessage(messageContent, messageSummary); }); + it('should create a infomessage with additonal properties and stream it into the message subject', done => { + // given + const sut = TestBed.get(AdvGrowlService); + const messageContent = 'Super important information'; + const messageSummary = 'Information'; + const additionalProperties = {title: 'Info message', description: 'Just some information'} + const id = 1; + spyOn(sut, 'getTimeStamp').and.returnValue(id); + const expectedMessage = { + id, + severity: 'info', + summary: messageSummary, + detail: messageContent, + lifeTime: undefined, + additionalProperties + }; + sut.getMessageStream() + .subscribe(message => { + expect(message).toEqual(expectedMessage); + done(); + }); + // when + sut.createInfoMessage(messageContent, messageSummary, additionalProperties); + }) + }) + + describe('createWarningMessage', () => { + it('should create a warningmessage and stream it into the message subject', done => { // given const sut = TestBed.get(AdvGrowlService); @@ -90,7 +180,9 @@ describe('Message Service', () => { id, severity: 'warn', summary: messageSummary, - detail: messageContent + detail: messageContent, + lifeTime: undefined, + additionalProperties: undefined }; sut.getMessageStream() .subscribe(message => { @@ -100,6 +192,31 @@ describe('Message Service', () => { // when sut.createWarningMessage(messageContent, messageSummary); }); + + it('should create a warningmessage with additional properties and stream it into the message subject', done => { + // given + const sut = TestBed.get(AdvGrowlService); + const messageContent = 'Super important warning'; + const messageSummary = 'Warning'; + const additionalProperties = {title: 'Warning message', description: 'Some warnings'} + const id = 1; + spyOn(sut, 'getTimeStamp').and.returnValue(id); + const expectedMessage = { + id, + severity: 'warn', + summary: messageSummary, + detail: messageContent, + lifeTime: undefined, + additionalProperties + }; + sut.getMessageStream() + .subscribe(message => { + expect(message).toEqual(expectedMessage); + done(); + }); + // when + sut.createWarningMessage(messageContent, messageSummary, additionalProperties); + }); }) describe('Streaming messages with additional properties', () => { @@ -119,6 +236,7 @@ describe('Message Service', () => { severity: 'success', summary: messageSummary, detail: messageContent, + lifeTime: undefined, additionalProperties }; sut.getMessageStream() @@ -145,6 +263,7 @@ describe('Message Service', () => { severity: 'error', summary: messageSummary, detail: messageContent, + lifeTime: undefined, additionalProperties }; sut.getMessageStream() @@ -171,6 +290,7 @@ describe('Message Service', () => { severity: 'info', summary: messageSummary, detail: messageContent, + lifeTime: undefined, additionalProperties }; sut.getMessageStream() @@ -197,6 +317,7 @@ describe('Message Service', () => { severity: 'warn', summary: messageSummary, detail: messageContent, + lifeTime: undefined, additionalProperties }; sut.getMessageStream() @@ -209,7 +330,223 @@ describe('Message Service', () => { }); }) - describe('Clearing messages', () => { + describe('createTimedSuccessMessage', () => { + + it('should create a timed successmessage and stream it into the message subject', done => { + // given + const sut = TestBed.get(AdvGrowlService); + const messageContent = 'Awesome Message'; + const messageSummary = 'Success'; + const lifeTime = 2000; + const id = 1; + spyOn(sut, 'getTimeStamp').and.returnValue(id); + const expectedMessage = { + id, + severity: 'success', + summary: messageSummary, + detail: messageContent, + lifeTime, + additionalProperties: undefined + }; + sut.getMessageStream() + .subscribe(message => { + expect(message).toEqual(expectedMessage) + done(); + }); + // when + sut.createTimedSuccessMessage(messageContent, messageSummary, lifeTime); + }); + + it('should create a timed successmessage with additional properties and stream it into the message subject', done => { + // given + const sut = TestBed.get(AdvGrowlService) + const messageContent = 'Awesome Message' + const messageSummary = 'Success' + const lifeTime = 2000 + const additionalProperties = {title: 'test', description: 'Test message'} + const id = 1; + spyOn(sut, 'getTimeStamp').and.returnValue(id); + const expectedMessage = { + id, + severity: 'success', + summary: messageSummary, + detail: messageContent, + lifeTime, + additionalProperties + }; + sut.getMessageStream() + .subscribe(message => { + expect(message).toEqual(expectedMessage) + done(); + }); + // when + sut.createTimedSuccessMessage(messageContent, messageSummary, lifeTime, additionalProperties); + }) + }) + + describe('createTimedErrorMessage', () => { + + it('should create a timed errormessage and stream it into the message subject', done => { + // given + const sut = TestBed.get(AdvGrowlService); + const messageContent = 'Awful Error'; + const messageSummary = 'Error'; + const lifeTime = 2000; + const id = 1; + spyOn(sut, 'getTimeStamp').and.returnValue(id); + const expectedMessage = { + id, + severity: 'error', + summary: messageSummary, + detail: messageContent, + lifeTime, + additionalProperties: undefined + }; + sut.getMessageStream() + .subscribe(message => { + expect(message).toEqual(expectedMessage); + done(); + }); + // when + sut.createTimedErrorMessage(messageContent, messageSummary, lifeTime); + }); + + it('should create a timed errormessage with additional properties and stream it into the message subject', done => { + // given + const sut = TestBed.get(AdvGrowlService) + const messageContent = 'Awful Error' + const messageSummary = 'Error' + const lifeTime = 2000 + const additionalProperties = {title: 'Error message', description: 'something went wrong'} + const id = 1; + spyOn(sut, 'getTimeStamp').and.returnValue(id); + const expectedMessage = { + id, + severity: 'error', + summary: messageSummary, + detail: messageContent, + lifeTime, + additionalProperties + }; + sut.getMessageStream() + .subscribe(message => { + expect(message).toEqual(expectedMessage); + done(); + }); + // when + sut.createTimedErrorMessage(messageContent, messageSummary, lifeTime, additionalProperties); + }) + }) + + describe('createTimedInfoMessage', () => { + + it('should create a timed infomessage and stream it into the message subject', done => { + // given + const sut = TestBed.get(AdvGrowlService) + const messageContent = 'Super important information' + const messageSummary = 'Information' + const lifeTime = 2000 + const id = 1; + spyOn(sut, 'getTimeStamp').and.returnValue(id); + const expectedMessage = { + id, + severity: 'info', + summary: messageSummary, + detail: messageContent, + lifeTime, + additionalProperties: undefined + }; + sut.getMessageStream() + .subscribe(message => { + expect(message).toEqual(expectedMessage); + done(); + }); + // when + sut.createTimedInfoMessage(messageContent, messageSummary, lifeTime); + }); + + it('should create a timed infomessage with additonal properties and stream it into the message subject', done => { + // given + const sut = TestBed.get(AdvGrowlService) + const messageContent = 'Super important information' + const messageSummary = 'Information' + const lifeTime = 2000 + const additionalProperties = {title: 'Info message', description: 'Just some information'} + const id = 1; + spyOn(sut, 'getTimeStamp').and.returnValue(id); + const expectedMessage = { + id, + severity: 'info', + summary: messageSummary, + detail: messageContent, + lifeTime, + additionalProperties + }; + sut.getMessageStream() + .subscribe(message => { + expect(message).toEqual(expectedMessage); + done(); + }); + // when + sut.createTimedInfoMessage(messageContent, messageSummary, lifeTime, additionalProperties); + }) + }) + + describe('createTimedWarningMessage', () => { + + it('should create a timed warningmessage and stream it into the message subject', done => { + // given + const sut = TestBed.get(AdvGrowlService) + const messageContent = 'Super important warning' + const messageSummary = 'Warning' + const lifeTime = 2000 + const id = 1; + spyOn(sut, 'getTimeStamp').and.returnValue(id); + const expectedMessage = { + id, + severity: 'warn', + summary: messageSummary, + detail: messageContent, + lifeTime, + additionalProperties: undefined + }; + sut.getMessageStream() + .subscribe(message => { + expect(message).toEqual(expectedMessage); + done(); + }); + // when + sut.createTimedWarningMessage(messageContent, messageSummary, lifeTime); + }); + + it('should create a timed warningmessage with additional properties and stream it into the message subject', done => { + // given + const sut = TestBed.get(AdvGrowlService) + const messageContent = 'Super important warning' + const messageSummary = 'Warning' + const lifeTime = 2000 + const additionalProperties = {title: 'Warning message', description: 'Some warnings'} + const id = 1; + spyOn(sut, 'getTimeStamp').and.returnValue(id); + const expectedMessage = { + id, + severity: 'warn', + summary: messageSummary, + detail: messageContent, + lifeTime, + additionalProperties + }; + sut.getMessageStream() + .subscribe(message => { + expect(message).toEqual(expectedMessage); + done(); + }) + // when + sut.createTimedWarningMessage(messageContent, messageSummary, lifeTime, additionalProperties); + }) + }) + + describe('clearMessages', () => { it('should stream a new message in the clearStream when calling clearMessages', done => { // given const sut = TestBed.get(AdvGrowlService); diff --git a/projects/primeng-advanced-growl/src/lib/adv-growl.service.ts b/projects/primeng-advanced-growl/src/lib/adv-growl.service.ts index 614cdc3..8ff8911 100644 --- a/projects/primeng-advanced-growl/src/lib/adv-growl.service.ts +++ b/projects/primeng-advanced-growl/src/lib/adv-growl.service.ts @@ -23,13 +23,13 @@ export class AdvGrowlService { private message$: Subject = new Subject(); private cancel$: Subject = new Subject(); - private readonly USE_DEFAULT_LIFETIME = undefined; + private readonly NO_LIFETIME_SPECIFIED = undefined; constructor() { } public createSuccessMessage(messageContent: string, summary: string, additionalProperties?: any): AdvPrimeMessage { - return this.createMessage(MessageSeverities.SUCCESS, summary, messageContent, this.USE_DEFAULT_LIFETIME, additionalProperties); + return this.createMessage(MessageSeverities.SUCCESS, summary, messageContent, this.NO_LIFETIME_SPECIFIED, additionalProperties); } public createTimedSuccessMessage( @@ -38,7 +38,7 @@ export class AdvGrowlService { } public createInfoMessage(messageContent: string, summary: string, additionalProperties?: any): AdvPrimeMessage { - return this.createMessage(MessageSeverities.INFO, summary, messageContent, additionalProperties); + return this.createMessage(MessageSeverities.INFO, summary, messageContent, this.NO_LIFETIME_SPECIFIED, additionalProperties); } public createTimedInfoMessage(messageContent: string, summary: string, lifeTime: number, additionalProperties?: any): AdvPrimeMessage { @@ -46,7 +46,7 @@ export class AdvGrowlService { } public createWarningMessage(messageContent: string, summary: string, additionalProperties?: any): AdvPrimeMessage { - return this.createMessage(MessageSeverities.WARN, summary, messageContent, additionalProperties); + return this.createMessage(MessageSeverities.WARN, summary, messageContent, this.NO_LIFETIME_SPECIFIED, additionalProperties); } public createTimedWarningMessage( @@ -55,7 +55,7 @@ export class AdvGrowlService { } public createErrorMessage(messageContent: string, summary: string, additionalProperties?: any): AdvPrimeMessage { - return this.createMessage(MessageSeverities.ERROR, summary, messageContent, additionalProperties); + return this.createMessage(MessageSeverities.ERROR, summary, messageContent, this.NO_LIFETIME_SPECIFIED, additionalProperties); } public createTimedErrorMessage(messageContent: string, summary: string, lifeTime: number, additionalProperties?: any): AdvPrimeMessage {