VulpesOS/gaia/apps/camera/test/unit/lib/sounds_test.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

230 lines
6.2 KiB
JavaScript
Executable file

require('/shared/test/unit/mocks/mock_audio.js')
var mocksHelperForSounds = new MocksHelper([
'Audio'
]).init();
suite('Sounds', function() {
/*jshint maxlen:false*/
'use strict';
/**
* Locals
*/
var Sounds;
var list = [
{
name: 'shutter',
url: 'resources/sounds/shutter.opus',
setting: 'camera.sound.enabled'
},
{
name: 'countdown',
url: 'resources/sounds/countdown.opus',
setting: 'camera.sound.enabled'
},
{
name: 'recordingStart',
url: 'resources/sounds/camcorder_start.opus',
setting: 'camera.sound.enabled'
},
{
name: 'recordingEnd',
url: 'resources/sounds/camcorder_end.opus',
setting: 'camera.sound.enabled'
}
];
mocksHelperForSounds.attachTestHelpers();
suiteSetup(function(done) {
requirejs(['lib/sounds'], function(sounds) {
Sounds = sounds;
done();
});
});
setup(function() {
this.sandbox = sinon.sandbox.create();
this.clock = sinon.useFakeTimers();
this.sounds = new Sounds();
// A sound to pass to APIs
this.mockSound = {
name: 'camera',
url: 'resources/sounds/shutter.opus',
setting: 'camera.sound.enabled'
};
// Keep reference of
// things we want to restore
this.backup = {
mozSettings: navigator.mozSettings
};
});
teardown(function() {
navigator.mozSettings = this.backup.mozSettings;
this.sandbox.restore();
this.clock.restore();
});
suite('Sounds()', function() {
test('Should have an empty items object', function() {
var items = this.sounds.items;
assert.ok(this.sounds.hasOwnProperty('items'));
assert.ok(typeof items === 'object');
assert.ok(Object.keys(items).length === 0);
});
});
suite('Sounds#add()', function() {
setup(function() {
// Stub `isEnabled` and call the callback with `true`
this.sandbox.stub(this.sounds, 'isEnabled');
this.sounds.isEnabled.callsArgWith(1, true);
// Simple stubs
this.sandbox.stub(this.sounds, 'setEnabled');
this.sandbox.stub(this.sounds, 'observeSetting');
});
test('Should add each of the sounds to the this.items hash', function() {
this.sounds.add(list[0]);
this.sounds.add(list[1]);
this.sounds.add(list[2]);
this.sounds.add(list[3]);
assert.ok(this.sounds.items.shutter);
assert.ok(this.sounds.items.countdown);
assert.ok(this.sounds.items.recordingStart);
assert.ok(this.sounds.items.recordingEnd);
});
test('Should call `isEnabled`', function() {
this.sounds.add(list[0]);
assert.ok(this.sounds.isEnabled.called);
});
test('Should call `setEnabled` with the result of `isEnabled`', function() {
var setEnabled = this.sounds.setEnabled;
this.sounds.add(list[0]);
assert.ok(setEnabled.calledWith(this.sounds.items.shutter, true));
});
});
suite('Sounds#isEnabled()', function() {
setup(function() {
var self = this;
// Mock object that mimicks
// mozSettings get API. Inside
// tests set this.mozSettingsGetResult
// define the result of the mock call.
navigator.mozSettings = {
createLock: function() { return this; },
get: function(key) {
var mozSettings = this;
setTimeout(function() {
var result = {};
result[key] = 'the-result';
mozSettings.onsuccess({
target: {
result: result
}
});
});
return this;
}
};
});
test('Should not error if navigator.mozSettings is undefined', function() {
navigator.mozSettings = undefined;
this.sounds.isEnabled(this.mockSound);
});
test('Should return the result from mozSettings API', function() {
this.sounds.isEnabled(this.mockSound, function(result) {
assert.ok(result === 'the-result');
});
// Move time forwards
// so the callback fires
this.clock.tick(1);
});
});
suite('Sounds#observeSetting()', function() {
setup(function() {
this.sandbox.stub(this.sounds, 'setEnabled');
navigator.mozSettings = {
addObserver: function(key, callback) {
this.callback = callback;
}
};
});
test('Should not error if navigator.mozSettings is undefined', function() {
navigator.mozSettings = undefined;
this.sounds.observeSetting(this.mockSound);
});
test('Should call setEnabled with the value passed' +
'to the observe callback', function() {
this.sounds.observeSetting(this.mockSound);
// Manually call the callback
// checking that `setEnabled` was
// called with the expected arguments
navigator.mozSettings.callback({ settingValue: true });
assert.ok(this.sounds.setEnabled.calledWith(this.mockSound, true));
});
});
suite('Sounds#createAudio()', function() {
test('Should return an Audio object with the given src', function() {
var url = this.mockSound.url;
var audio = this.sounds.createAudio(url);
assert.ok(audio instanceof window.Audio);
assert.ok(~audio.src.indexOf(url));
});
test('Should set the mozAudioChannel type', function() {
var audio = this.sounds.createAudio(this.mockSound.url);
assert.ok(audio.mozAudioChannelType === 'notification');
});
});
suite('Sounds#playSound()', function() {
setup(function() {
this.mockSound.audio = {
play: sinon.spy(),
cloneNode: function() { return this; }
};
});
test('Should *not* play the sound if it\'s not enabled', function() {
this.sounds.playSound(this.mockSound);
assert.ok(this.mockSound.audio.play.notCalled);
});
test('Should play the sound if it\'s enabled', function() {
this.mockSound.enabled = true;
this.sounds.playSound(this.mockSound);
assert.ok(this.mockSound.audio.play.called);
});
test('Should throw exception if sound is undefined', function() {
try {
this.sounds.playSound();
} catch (e) {
assert.ok('correctly threw exception');
return;
}
assert.ok(false);
});
});
});