123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- // For these tests we use a fake DBus daemon to verify libnotify interaction
- // with the session bus. This requires python-dbusmock to be installed and
- // running at $DBUS_SESSION_BUS_ADDRESS.
- //
- // script/test.py spawns dbusmock, which sets DBUS_SESSION_BUS_ADDRESS.
- //
- // See https://pypi.python.org/pypi/python-dbusmock to read about dbusmock.
- const assert = require('assert')
- const dbus = require('dbus-native')
- const Promise = require('bluebird')
- const {remote} = require('electron')
- const {app} = remote.require('electron')
- const skip = process.platform !== 'linux' ||
- process.arch === 'ia32' ||
- !process.env.DBUS_SESSION_BUS_ADDRESS;
- (skip ? describe.skip : describe)('Notification module (dbus)', () => {
- let mock, Notification, getCalls, reset
- const realAppName = app.getName()
- const realAppVersion = app.getVersion()
- const appName = 'api-notification-dbus-spec'
- const serviceName = 'org.freedesktop.Notifications'
- before(async () => {
- // init app
- app.setName(appName)
- app.setDesktopName(appName + '.desktop')
- // init dbus
- const path = '/org/freedesktop/Notifications'
- const iface = 'org.freedesktop.DBus.Mock'
- const bus = dbus.sessionBus()
- console.log('session bus: ' + process.env.DBUS_SESSION_BUS_ADDRESS)
- const service = bus.getService(serviceName)
- const getInterface = Promise.promisify(service.getInterface, {context: service})
- mock = await getInterface(path, iface)
- getCalls = Promise.promisify(mock.GetCalls, {context: mock})
- reset = Promise.promisify(mock.Reset, {context: mock})
- })
- after(async () => {
- // cleanup dbus
- await reset()
- // cleanup app
- app.setName(realAppName)
- app.setVersion(realAppVersion)
- })
- describe('Notification module using ' + serviceName, () => {
- function onMethodCalled (done) {
- function cb (name) {
- console.log('onMethodCalled: ' + name)
- if (name === 'Notify') {
- mock.removeListener('MethodCalled', cb)
- console.log('done')
- done()
- }
- }
- return cb
- }
- function unmarshalDBusNotifyHints (dbusHints) {
- let o = {}
- for (let hint of dbusHints) {
- let key = hint[0]
- let value = hint[1][1][0]
- o[key] = value
- }
- return o
- }
- function unmarshalDBusNotifyArgs (dbusArgs) {
- return {
- app_name: dbusArgs[0][1][0],
- replaces_id: dbusArgs[1][1][0],
- app_icon: dbusArgs[2][1][0],
- title: dbusArgs[3][1][0],
- body: dbusArgs[4][1][0],
- actions: dbusArgs[5][1][0],
- hints: unmarshalDBusNotifyHints(dbusArgs[6][1][0])
- }
- }
- before((done) => {
- mock.on('MethodCalled', onMethodCalled(done))
- // lazy load Notification after we listen to MethodCalled mock signal
- Notification = require('electron').remote.Notification
- const n = new Notification({
- title: 'title',
- subtitle: 'subtitle',
- body: 'body',
- replyPlaceholder: 'replyPlaceholder',
- sound: 'sound',
- closeButtonText: 'closeButtonText'
- })
- n.show()
- })
- it('should call ' + serviceName + ' to show notifications', async () => {
- const calls = await getCalls()
- assert(calls.length >= 1)
- let lastCall = calls[calls.length - 1]
- let methodName = lastCall[1]
- assert.equal(methodName, 'Notify')
- let args = unmarshalDBusNotifyArgs(lastCall[2])
- assert.deepEqual(args, {
- app_name: appName,
- replaces_id: 0,
- app_icon: '',
- title: 'title',
- body: 'body',
- actions: [],
- hints: {
- 'append': 'true',
- 'desktop-entry': appName
- }
- })
- })
- })
- })
|