|  |  |  | describe('MessageView', function() { | 
					
						
							|  |  |  |   var conversations = new Whisper.ConversationCollection(); | 
					
						
							|  |  |  |   before(function(done) { | 
					
						
							|  |  |  |     conversations.fetch().then(done); | 
					
						
							|  |  |  |     storage.put('number_id', '+18088888888.1'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var convo = conversations.add({id: 'foo'}); | 
					
						
							|  |  |  |   var message = convo.messageCollection.add({ | 
					
						
							|  |  |  |     conversationId: convo.id, | 
					
						
							|  |  |  |     body: 'hello world', | 
					
						
							|  |  |  |     type: 'outgoing', | 
					
						
							|  |  |  |     source: '+14158675309', | 
					
						
							|  |  |  |     received_at: Date.now() | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should display the message text', function() { | 
					
						
							|  |  |  |     var view = new Whisper.MessageView({model: message}).render(); | 
					
						
							|  |  |  |     assert.match(view.$el.text(), /hello world/); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should auto-update the message text', function() { | 
					
						
							|  |  |  |     var view = new Whisper.MessageView({model: message}).render(); | 
					
						
							|  |  |  |     message.set('body', 'goodbye world'); | 
					
						
							|  |  |  |     assert.match(view.$el.html(), /goodbye world/); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should have a nice timestamp', function() { | 
					
						
							|  |  |  |     var view = new Whisper.MessageView({model: message}); | 
					
						
							|  |  |  |     message.set({'sent_at': Date.now() - 5000}); | 
					
						
							|  |  |  |     view.render(); | 
					
						
							|  |  |  |     assert.match(view.$el.html(), /now/); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     message.set({'sent_at': Date.now() - 60000}); | 
					
						
							|  |  |  |     view.render(); | 
					
						
							|  |  |  |     assert.match(view.$el.html(), /min/); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     message.set({'sent_at': Date.now() - 3600000}); | 
					
						
							|  |  |  |     view.render(); | 
					
						
							|  |  |  |     assert.match(view.$el.html(), /hour/); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   it('should not imply messages are from the future', function() { | 
					
						
							|  |  |  |     var view = new Whisper.MessageView({model: message}); | 
					
						
							|  |  |  |     message.set({'sent_at': Date.now() + 60000}); | 
					
						
							|  |  |  |     view.render(); | 
					
						
							|  |  |  |     assert.match(view.$el.html(), /now/); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should go away when the model is destroyed', function() { | 
					
						
							|  |  |  |     var view = new Whisper.MessageView({model: message}); | 
					
						
							|  |  |  |     var div = $('<div>').append(view.$el); | 
					
						
							|  |  |  |     message.destroy(); | 
					
						
							|  |  |  |     assert.strictEqual(div.find(view.$el).length, 0); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('allows links', function() { | 
					
						
							|  |  |  |     var url = 'http://example.com'; | 
					
						
							|  |  |  |     message.set('body', url); | 
					
						
							|  |  |  |     var view = new Whisper.MessageView({model: message}); | 
					
						
							|  |  |  |     view.render(); | 
					
						
							|  |  |  |     var link = view.$el.find('.body a'); | 
					
						
							|  |  |  |     assert.strictEqual(link.length, 1); | 
					
						
							|  |  |  |     assert.strictEqual(link.text(), url); | 
					
						
							|  |  |  |     assert.strictEqual(link.attr('href'), url); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('disallows xss', function() { | 
					
						
							|  |  |  |     var xss = '<script>alert("pwnd")</script>'; | 
					
						
							|  |  |  |     message.set('body', xss); | 
					
						
							|  |  |  |     var view = new Whisper.MessageView({model: message}); | 
					
						
							|  |  |  |     view.render(); | 
					
						
							|  |  |  |     assert.include(view.$el.text(), xss); // should appear as escaped text
 | 
					
						
							|  |  |  |     assert.strictEqual(view.$el.find('script').length, 0); // should not appear as html
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('supports emoji', function() { | 
					
						
							|  |  |  |     message.set('body', 'I \u2764\uFE0F emoji!'); | 
					
						
							|  |  |  |     var view = new Whisper.MessageView({model: message}); | 
					
						
							|  |  |  |     view.render(); | 
					
						
							|  |  |  |     var img = view.$el.find('.content img'); | 
					
						
							|  |  |  |     assert.strictEqual(img.length, 1); | 
					
						
							|  |  |  |     assert.strictEqual(img.attr('src'), '/images/emoji/apple/2764.png'); | 
					
						
							|  |  |  |     assert.strictEqual(img.attr('title'), ':heart:'); | 
					
						
							|  |  |  |     assert.strictEqual(img.attr('class'), 'emoji'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |