/* global require, marionette, setup, suite, test, __dirname */ 'use strict'; var assert = require('chai').assert; var Messages = require('./lib/messages.js'); var MessagesActivityCaller = require('./lib/messages_activity_caller.js'); var Storage = require('./lib/storage.js'); marionette('Messages as "new" activity target', function() { var apps = {}; apps[MessagesActivityCaller.ORIGIN] = __dirname + '/apps/activitycaller'; var client = marionette.client({ profile: { apps: apps } }); var messagesApp, activityCallerApp, storage; function launchAsActivity(activityData) { var smsMessage = { id: 1, iccId: null, threadId: 1, sender: null, receiver: '+200', type: 'sms', delivery: 'sent', body: 'Workload message', timestamp: Date.now() }; storage.setMessagesStorage([{ id: smsMessage.threadId, body: smsMessage.body, lastMessageType: smsMessage.type, timestamp: smsMessage.timestamp, messages: [smsMessage], participants: [smsMessage.receiver] }]); storage.setContactsStorage([{ name: ['Alan Turing'], tel: [{ value: '+100', type: 'Mobile' }] }]); activityCallerApp.sendMessage(activityData); messagesApp.switchTo(); } function assertIsFocused(element, message) { assert.isTrue(element.scriptWith(function(el) { return document.activeElement === el; }), message); } setup(function() { messagesApp = Messages.create(client); activityCallerApp = MessagesActivityCaller.create(client); storage = Storage.create(client); client.loader.getMockManager('sms').inject([ 'test_storages', 'test_blobs', 'navigator_moz_icc_manager', 'navigator_moz_mobile_message', 'navigator_moz_contacts' ]); }); suite('Send new message', function() { var content = 'Let\'s rock - http://mozilla.org!'; var number = '+123456'; setup(function() { activityCallerApp.launch(); }); test('Activity with malicious content', function() { var maliciousContent = content + ''; launchAsActivity({ number: number, body: maliciousContent }); // Wait until message input is filled with the content client.scope({ searchTimeout: 100 }).waitFor(function() { return messagesApp.Composer.messageInput.text() === maliciousContent; }); // Verify that xss wasn't successful for composer case assert.isTrue(client.executeScript(function() { return !!window.wrappedJSObject.Compose; }), 'XSS should not be performed'); client.waitFor(() => messagesApp.Composer.sendButton.enabled()); assert.equal( messagesApp.NewMessage.header.getAttribute('action'), 'close', 'Close activity button should be visible' ); messagesApp.send(); // Verify that everything is fine with rendered message content var message = messagesApp.Conversation.message; assert.equal( messagesApp.Conversation.getMessageContent(message).text(), maliciousContent ); // Validate that header is correctly set even that thread list hasn't // been loaded yet. assert.equal(messagesApp.Conversation.headerTitle.text(), number); assert.equal( messagesApp.NewMessage.header.getAttribute('action'), 'close', 'Close activity button should be visible' ); // Verify that xss wasn't successful for thread case assert.isTrue(client.executeScript(function() { return !!window.wrappedJSObject.Compose; }), 'XSS should not be performed'); }); test('Activity with "body" only', function() { launchAsActivity({ body: content }); // Wait until message input is filled with the content client.waitFor( () => messagesApp.Composer.messageInput.text() === content ); assert.isFalse(messagesApp.Composer.sendButton.enabled()); assert.equal(messagesApp.NewMessage.recipients.length, 0); assert.equal( messagesApp.NewMessage.header.getAttribute('action'), 'close', 'Close activity button should be visible' ); assertIsFocused( messagesApp.NewMessage.recipientsInput, 'Recipient input should be focused' ); }); test('Activity with "body" and unknown "number"', function() { launchAsActivity({ number: number, body: content }); // Wait until message input is filled with the content client.waitFor( () => messagesApp.Composer.messageInput.text() === content ); var recipients = messagesApp.NewMessage.recipients; assert.equal(recipients.length, 1); assert.equal(recipients[0].text(), number); assert.equal(recipients[0].getAttribute('data-source'), 'manual'); client.waitFor(() => messagesApp.Composer.sendButton.enabled()); assert.equal( messagesApp.NewMessage.header.getAttribute('action'), 'close', 'Close activity button should be visible' ); assertIsFocused( messagesApp.Composer.messageInput, 'Message input should be focused' ); }); test('Activity with "body" and contact "number"', function() { // Send message to number that has contact associated with it launchAsActivity({ number: '+100', body: content }); // Wait until message input is filled with the content client.waitFor( () => messagesApp.Composer.messageInput.text() === content ); var recipients = messagesApp.NewMessage.recipients; assert.equal(recipients.length, 1); assert.equal(recipients[0].text(), 'Alan Turing'); assert.equal(recipients[0].getAttribute('data-source'), 'contacts'); client.waitFor(() => messagesApp.Composer.sendButton.enabled()); assert.equal( messagesApp.NewMessage.header.getAttribute('action'), 'close', 'Close activity button should be visible' ); assertIsFocused( messagesApp.Composer.messageInput, 'Message input should be focused' ); }); test('Activity with thread "number"', function() { // Send message to number that has thread associated with it launchAsActivity({ number: '+200' }); // Verify that we entered the right thread var message = messagesApp.Conversation.message; assert.equal( messagesApp.Conversation.getMessageContent(message).text(), 'Workload message' ); assert.isFalse(messagesApp.Composer.sendButton.enabled()); assert.equal( messagesApp.NewMessage.header.getAttribute('action'), 'close', 'Close activity button should be visible' ); // Validate that header is correctly set even that thread list hasn't // been loaded yet. assert.equal(messagesApp.Conversation.headerTitle.text(), '+200'); assertIsFocused( messagesApp.Composer.messageInput, 'Message input should be focused' ); }); test('Activity with thread "number" and "body"', function() { // Send message to number that has thread associated with it launchAsActivity({ number: '+200', body: content }); // Wait until message input is filled with the content client.waitFor( () => messagesApp.Composer.messageInput.text() === content ); var recipients = messagesApp.NewMessage.recipients; assert.equal(recipients.length, 1); assert.equal(recipients[0].text(), '+200'); assert.equal(recipients[0].getAttribute('data-source'), 'manual'); client.waitFor(() => messagesApp.Composer.sendButton.enabled()); assert.equal( messagesApp.NewMessage.header.getAttribute('action'), 'close', 'Close activity button should be visible' ); assertIsFocused( messagesApp.Composer.messageInput, 'Message input should be focused' ); }); }); });