blob: 880ed6b2c6dc9928a50c9ce17d4e5c422c01db5b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { expect } from 'chai'
import sinon from 'sinon'
import service from '../../../services/broadcast-channel/index'
import { MessageEvent } from '../../../services/broadcast-channel/message-event'
const { BroadcastChannel } = service.create('foo').instance
describe('BroadcastChannel', () => {
it('is a function', () => {
expect(BroadcastChannel).is.an('function')
})
it('has standard APIs', () => {
const JamesBond = new BroadcastChannel('007')
expect(JamesBond.name).is.an('string')
expect(JamesBond.onmessage).is.an('null')
expect(JamesBond.postMessage).is.an('function')
expect(JamesBond.close).is.an('function')
expect(JamesBond).to.have.ownProperty('name')
expect(JamesBond).to.have.ownProperty('onmessage')
expect(JamesBond).not.to.have.ownProperty('postMessage')
expect(JamesBond).not.to.have.ownProperty('close')
JamesBond.close()
})
it('name attribute is readonly', () => {
const Wolverine = new BroadcastChannel('Logan')
expect(Wolverine.name).to.equal('Logan')
Wolverine.name = 'Wolverine'
expect(Wolverine.name).to.equal('Logan')
Wolverine.close()
})
describe('basci usage', () => {
const Hulk = new BroadcastChannel('Avengers')
const Stack = new BroadcastChannel('Avengers')
const Steven = new BroadcastChannel('Avengers')
const Logan = new BroadcastChannel('Mutants')
const Erik = new BroadcastChannel('Mutants')
beforeEach(() => {
Hulk.onmessage = sinon.spy()
Stack.onmessage = sinon.spy()
Steven.onmessage = sinon.spy()
Logan.onmessage = sinon.spy()
})
afterEach(() => {
Hulk.onmessage = null
Stack.onmessage = null
Steven.onmessage = null
Logan.onmessage = null
Erik.onmessage = null
})
it('trigger onmessage', () => {
Hulk.postMessage('Hulk Smash !!!')
expect(Hulk.onmessage.callCount).to.be.equal(0)
expect(Logan.onmessage.callCount).to.be.equal(0)
expect(Stack.onmessage.callCount).to.be.equal(1)
expect(Steven.onmessage.callCount).to.be.equal(1)
})
it('don\'t trigger onmessage itself', () => {
Logan.postMessage('Any one here ?')
expect(Hulk.onmessage.callCount).to.be.equal(0)
expect(Logan.onmessage.callCount).to.be.equal(0)
expect(Stack.onmessage.callCount).to.be.equal(0)
expect(Steven.onmessage.callCount).to.be.equal(0)
})
it('send multi messages', () => {
Hulk.postMessage('Hulk Smash !!!')
Logan.postMessage('I will fight you !')
Stack.postMessage('whatever')
Hulk.postMessage('whatever')
Stack.postMessage('whatever')
Steven.postMessage('whatever')
Stack.postMessage('whatever')
expect(Hulk.onmessage.callCount).to.be.equal(4)
expect(Logan.onmessage.callCount).to.be.equal(0)
expect(Stack.onmessage.callCount).to.be.equal(3)
expect(Steven.onmessage.callCount).to.be.equal(5)
})
it('send string message', () => {
Stack.postMessage('I am Iron-Man.')
expect(Hulk.onmessage.callCount).to.be.equal(1)
expect(Steven.onmessage.callCount).to.be.equal(1)
const event = Hulk.onmessage.firstCall.args[0]
expect(event).is.an('object')
expect(event.data).is.a('string')
expect(event.data).to.be.equal('I am Iron-Man.')
})
it('send object message', () => {
const message = {
type: 'SOKOVIA ACCORDS',
approvedCountry: 117,
content: 'The Avengers shall no longer be a private organization.'
}
Stack.postMessage(message)
const event = Steven.onmessage.firstCall.args[0]
expect(event).is.an('object')
expect(event.data).is.a('object')
expect(event.data).to.deep.equal(message)
})
it('close channel', () => {
Hulk.close()
Steven.postMessage('come to fight !')
expect(Hulk.onmessage.callCount).to.be.equal(0)
expect(Stack.onmessage.callCount).to.be.equal(1)
expect(Steven.onmessage.callCount).to.be.equal(0)
})
it('send message after close', () => {
Hulk.close()
expect(() => { Hulk.postMessage('I am leaving.') }).to.throw(Error)
expect(Hulk.onmessage.callCount).to.be.equal(0)
expect(Logan.onmessage.callCount).to.be.equal(0)
expect(Stack.onmessage.callCount).to.be.equal(0)
expect(Steven.onmessage.callCount).to.be.equal(0)
})
it('MessageEvent dafault parameters', () => {
const event = new MessageEvent()
expect(event).is.an('object')
expect(event.data).to.be.null
expect(event.type).to.be.equal('message')
expect(event.origin).to.be.equal('')
expect(event.target).to.be.null
expect(event.source).to.be.null
expect(event.timeStamp).to.be.a('number')
expect(event.ports).to.be.an('array')
})
it('MessageEvent constructor', () => {
const source = { type: 'empty' }
const event = new MessageEvent('custom', {
source,
data: 'Nothing',
origin: 'http://127.0.0.1',
ports: ['8080']
})
expect(event).is.an('object')
expect(event.data).to.be.equal('Nothing')
expect(event.type).to.be.equal('custom')
expect(event.origin).to.be.equal('http://127.0.0.1')
expect(event.target).to.be.null
expect(event.source).to.deep.equal(source)
expect(event.timeStamp).to.be.a('number')
expect(event.ports).to.deep.equal(['8080'])
})
it('use MessageEvent', () => {
Steven.postMessage('Be Together.')
const event = Stack.onmessage.firstCall.args[0]
expect(event).is.an('object')
expect(event.data).to.be.equal('Be Together.')
expect(event.type).to.be.equal('message')
expect(event.origin).to.be.equal('')
expect(event.target).to.be.null
expect(event.timeStamp).to.be.a('number')
})
it('invalid usage', () => {
const stranger = {
name: 'stranger',
close: Erik.close,
postMessage: Erik.postMessage
}
stranger.postMessage('hello world.')
expect(Hulk.onmessage.callCount).to.be.equal(0)
expect(Logan.onmessage.callCount).to.be.equal(0)
expect(Stack.onmessage.callCount).to.be.equal(0)
expect(Steven.onmessage.callCount).to.be.equal(0)
stranger.close()
})
it('close all', () => {
Hulk.close()
Stack.close()
Steven.close()
Logan.close()
Erik.close()
// close again
expect(() => {
Hulk.close()
Stack.close()
Steven.close()
Logan.close()
Erik.close()
}).to.not.throw
})
})
})