Best JavaScript code snippet using sinon
tumblrTriggerSpec.js
Source:tumblrTriggerSpec.js  
1var TumblrTrigger = require('../lib/triggers/tumblrTrigger.js');2describe("TumblrTrigger", function() {3	var fakeBot;4	beforeEach(function() {5		fakeBot = jasmine.createSpyObj('fakeBot', ['sendMessage']);6	});7	it("should not post on demand if there is nothing after a command", function() {8		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['text', 'photo']);9		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );10		expect(trigger.onChatMessage('roomId', 'userId', '!posttext', false, false)).toEqual(false);11		expect(trigger.onChatMessage('roomId', 'userId', '!posttext ', false, false)).toEqual(false);12		expect(trigger.onChatMessage('roomId', 'userId', '!postphoto ', false, false)).toEqual(false);13		expect(fakeTumblrClient.text).not.toHaveBeenCalled();14		expect(fakeTumblrClient.photo).not.toHaveBeenCalled();15	});16	it("should not post on demand without the right command", function() {17		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['text']);18		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );19		expect(trigger.onChatMessage('roomId', 'userId', '', false, false)).toEqual(false);20		expect(trigger.onChatMessage('roomId', 'userId', 'posttext', false, false)).toEqual(false);21		expect(trigger.onChatMessage('roomId', 'userId', 'posttext text here', false, false)).toEqual(false);22		expect(trigger.onChatMessage('roomId', 'userId', ' !posttext text here', false, false)).toEqual(false);23		expect(fakeTumblrClient.text).not.toHaveBeenCalled();24		expect(fakeTumblrClient.text).not.toHaveBeenCalled();25	});26	it("should not post on demand from a friend message", function() {27		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['text']);28		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );29		expect(trigger.onFriendMessage('userId', '!posttext text here', false)).toEqual(false);30		expect(fakeTumblrClient.text).not.toHaveBeenCalled();31	});32	it("should post text on demand", function() {33		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['text']);34		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );35		expect(trigger.onChatMessage('roomId', 'userId', '!posttext text here', false, false)).toEqual(true);36		expect(fakeTumblrClient.text.calls.length).toEqual(1);37		expect(fakeTumblrClient.text.calls[0].args[0]).toEqual('blogname');38		expect(fakeTumblrClient.text.calls[0].args[1]).toEqual({ body: 'text here', tags: 'text' });39	});40	it("should post a link as a photo on demand", function() {41		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['photo']);42		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );43		expect(trigger.onChatMessage('roomId', 'userId', '!postphoto http://a.com/image.jpg', false, false)).toEqual(true);44		expect(fakeTumblrClient.photo.calls.length).toEqual(1);45		expect(fakeTumblrClient.photo.calls[0].args[0]).toEqual('blogname');46		expect(fakeTumblrClient.photo.calls[0].args[1]).toEqual({ tags: 'photo', source: 'http://a.com/image.jpg', link: 'http://a.com/image.jpg' });47		expect(trigger.onChatMessage('roomId', 'userId', '!postphoto       http://a.com/image.jpg   ', false, false)).toEqual(true);48		expect(fakeTumblrClient.photo.calls.length).toEqual(2);49		expect(fakeTumblrClient.photo.calls[1].args[0]).toEqual('blogname');50		expect(fakeTumblrClient.photo.calls[1].args[1]).toEqual({ tags: 'photo', source: 'http://a.com/image.jpg', link: 'http://a.com/image.jpg' });51		expect(trigger.onChatMessage('roomId', 'userId', '!postphoto http://a.com', false, false)).toEqual(true);52		expect(fakeTumblrClient.photo.calls.length).toEqual(3);53		expect(fakeTumblrClient.photo.calls[2].args[0]).toEqual('blogname');54		expect(fakeTumblrClient.photo.calls[2].args[1]).toEqual({ tags: 'photo', source: 'http://a.com', link: 'http://a.com' });55		expect(trigger.onChatMessage('roomId', 'userId', '!postphoto http://a.com/image.bitmap', false, false)).toEqual(true);56		expect(fakeTumblrClient.photo.calls.length).toEqual(4);57		expect(fakeTumblrClient.photo.calls[3].args[0]).toEqual('blogname');58		expect(fakeTumblrClient.photo.calls[3].args[1]).toEqual({ tags: 'photo', source: 'http://a.com/image.bitmap', link: 'http://a.com/image.bitmap' });59		expect(trigger.onChatMessage('roomId', 'userId', '!postphoto http://a.com/image.jpg?test=param#anchor', false, false)).toEqual(true);60		expect(fakeTumblrClient.photo.calls.length).toEqual(5);61		expect(fakeTumblrClient.photo.calls[4].args[0]).toEqual('blogname');62		expect(fakeTumblrClient.photo.calls[4].args[1]).toEqual({ tags: 'photo', source: 'http://a.com/image.jpg?test=param#anchor', link: 'http://a.com/image.jpg?test=param#anchor' });63		expect(trigger.onChatMessage('roomId', 'userId', '!postphoto http://a.com/image.JPG', false, false)).toEqual(true);64		expect(fakeTumblrClient.photo.calls.length).toEqual(6);65		expect(fakeTumblrClient.photo.calls[5].args[0]).toEqual('blogname');66		expect(fakeTumblrClient.photo.calls[5].args[1]).toEqual({ tags: 'photo', source: 'http://a.com/image.JPG', link: 'http://a.com/image.JPG' });67	});68	it("should post a photo on demand with additional context if provided", function() {69		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['photo']);70		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );71		expect(trigger.onChatMessage('roomId', 'userId', '!postphoto check this out http://a.com/image.jpg', false, false)).toEqual(true);72		expect(fakeTumblrClient.photo.calls.length).toEqual(1);73		expect(fakeTumblrClient.photo.calls[0].args[0]).toEqual('blogname');74		expect(fakeTumblrClient.photo.calls[0].args[1]).toEqual({ tags: 'photo', caption: 'check this out http://a.com/image.jpg', source: 'http://a.com/image.jpg', link: 'http://a.com/image.jpg' });75		expect(trigger.onChatMessage('roomId', 'userId', '!postphoto http://a.com/image.jpg check this out', false, false)).toEqual(true);76		expect(fakeTumblrClient.photo.calls.length).toEqual(2);77		expect(fakeTumblrClient.photo.calls[1].args[0]).toEqual('blogname');78		expect(fakeTumblrClient.photo.calls[1].args[1]).toEqual({ tags: 'photo', caption: 'http://a.com/image.jpg check this out', source: 'http://a.com/image.jpg', link: 'http://a.com/image.jpg' });79		expect(trigger.onChatMessage('roomId', 'userId', '!postphoto check this http://a.com/image.jpg out', false, false)).toEqual(true);80		expect(fakeTumblrClient.photo.calls.length).toEqual(3);81		expect(fakeTumblrClient.photo.calls[2].args[0]).toEqual('blogname');82		expect(fakeTumblrClient.photo.calls[2].args[1]).toEqual({ tags: 'photo', caption: 'check this http://a.com/image.jpg out', source: 'http://a.com/image.jpg', link: 'http://a.com/image.jpg' });83	});84	it("should not post a photo on demand if no links are provided", function() {85		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['photo']);86		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );87		expect(trigger.onChatMessage('roomId', 'userId', '!postphoto no links here http://', false, false)).toEqual(false);88		expect(fakeTumblrClient.photo).not.toHaveBeenCalled();89	});90	it("should post a quote on demand", function() {91		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['quote']);92		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );93		var quote = 'this is a quote';94		expect(trigger.onChatMessage('roomId', 'userId', '!postquote ' + quote, false, false)).toEqual(true);95		expect(fakeTumblrClient.quote.calls.length).toEqual(1);96		expect(fakeTumblrClient.quote.calls[0].args[0]).toEqual('blogname');97		expect(fakeTumblrClient.quote.calls[0].args[1]).toEqual({ quote: quote, tags: 'quote' });98	});99	it("should post a link on demand", function() {100		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['link']);101		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );102		expect(trigger.onChatMessage('roomId', 'userId', '!postlink http://a.com', false, false)).toEqual(true);103		expect(fakeTumblrClient.link.calls.length).toEqual(1);104		expect(fakeTumblrClient.link.calls[0].args[0]).toEqual('blogname');105		expect(fakeTumblrClient.link.calls[0].args[1]).toEqual({ tags: 'link', url: 'http://a.com' });106		expect(trigger.onChatMessage('roomId', 'userId', '!postlink http://a.com/link?test=param#anchor', false, false)).toEqual(true);107		expect(fakeTumblrClient.link.calls.length).toEqual(2);108		expect(fakeTumblrClient.link.calls[1].args[0]).toEqual('blogname');109		expect(fakeTumblrClient.link.calls[1].args[1]).toEqual({ tags: 'link', url: 'http://a.com/link?test=param#anchor' });110		expect(trigger.onChatMessage('roomId', 'userId', '!postlink http://a.com/link x', false, false)).toEqual(true);111		expect(fakeTumblrClient.link.calls.length).toEqual(3);112		expect(fakeTumblrClient.link.calls[2].args[0]).toEqual('blogname');113		expect(fakeTumblrClient.link.calls[2].args[1]).toEqual({ tags: 'link', description: 'http://a.com/link x', url: 'http://a.com/link' });114	});115	it("should post a chat on demand", function() {116		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['chat']);117		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );118		var conversation = '9:30 PM - User 1: first message\1199:30 PM - User 2: second message';120		expect(trigger.onChatMessage('roomId', 'userId', '!postchat ' + conversation, false, false)).toEqual(true);121		expect(fakeTumblrClient.chat.calls.length).toEqual(1);122		expect(fakeTumblrClient.chat.calls[0].args[0]).toEqual('blogname');123		expect(fakeTumblrClient.chat.calls[0].args[1]).toEqual({ conversation: conversation, tags: 'chat' });124	});125	it("should post audio on demand", function() {126		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['audio']);127		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );128		expect(trigger.onChatMessage('roomId', 'userId', '!postaudio https://soundcloud.com/dumbshitthatjakazidmade/get-clucky', false, false)).toEqual(true);129		expect(fakeTumblrClient.audio.calls.length).toEqual(1);130		expect(fakeTumblrClient.audio.calls[0].args[0]).toEqual('blogname');131		expect(fakeTumblrClient.audio.calls[0].args[1]).toEqual({ tags: 'audio', external_url: 'https://soundcloud.com/dumbshitthatjakazidmade/get-clucky' });132		expect(trigger.onChatMessage('roomId', 'userId', '!postaudio https://soundcloud.com/dumbshitthatjakazidmade/get-clucky?test=param#anchor', false, false)).toEqual(true);133		expect(fakeTumblrClient.audio.calls.length).toEqual(2);134		expect(fakeTumblrClient.audio.calls[1].args[0]).toEqual('blogname');135		expect(fakeTumblrClient.audio.calls[1].args[1]).toEqual({ tags: 'audio', external_url: 'https://soundcloud.com/dumbshitthatjakazidmade/get-clucky?test=param#anchor' });136		expect(trigger.onChatMessage('roomId', 'userId', '!postaudio https://soundcloud.com cluck', false, false)).toEqual(true);137		expect(fakeTumblrClient.audio.calls.length).toEqual(3);138		expect(fakeTumblrClient.audio.calls[2].args[0]).toEqual('blogname');139		expect(fakeTumblrClient.audio.calls[2].args[1]).toEqual({ tags: 'audio', caption: 'https://soundcloud.com cluck', external_url: 'https://soundcloud.com' });140	});141	it("should post video on demand", function() {142		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['video']);143		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );144		expect(trigger.onChatMessage('roomId', 'userId', '!postvideo http://www.youtube.com/watch?v=7E0ot9iJm_k', false, false)).toEqual(true);145		expect(fakeTumblrClient.video.calls.length).toEqual(1);146		expect(fakeTumblrClient.video.calls[0].args[0]).toEqual('blogname');147		expect(fakeTumblrClient.video.calls[0].args[1]).toEqual({ tags: 'video', embed: 'http://www.youtube.com/watch?v=7E0ot9iJm_k' });148		expect(trigger.onChatMessage('roomId', 'userId', '!postvideo http://www.youtube.com/watch?v=7E0ot9iJm_k?test=param#anchor', false, false)).toEqual(true);149		expect(fakeTumblrClient.video.calls.length).toEqual(2);150		expect(fakeTumblrClient.video.calls[1].args[0]).toEqual('blogname');151		expect(fakeTumblrClient.video.calls[1].args[1]).toEqual({ tags: 'video', embed: 'http://www.youtube.com/watch?v=7E0ot9iJm_k?test=param#anchor' });152		expect(trigger.onChatMessage('roomId', 'userId', '!postvideo http://www.youtube.com pak', false, false)).toEqual(true);153		expect(fakeTumblrClient.video.calls.length).toEqual(3);154		expect(fakeTumblrClient.video.calls[2].args[0]).toEqual('blogname');155		expect(fakeTumblrClient.video.calls[2].args[1]).toEqual({ tags: 'video', caption: 'http://www.youtube.com pak', embed: 'http://www.youtube.com' });156	});157	it("should not post malformed links automatically", function() {158		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['link', 'photo', 'video', 'audio']);159		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );160		expect(trigger.onChatMessage('roomId', 'userId', 'mailto link mailto://email@host.com', false, false)).toEqual(false);161		expect(trigger.onChatMessage('roomId', 'userId', 'invalid schema link htp://www.google.com', false, false)).toEqual(false);162		expect(trigger.onChatMessage('roomId', 'userId', 'bad link http://', false, false)).toEqual(false);163		expect(trigger.onChatMessage('roomId', 'userId', 'bad link 2 http://!', false, false)).toEqual(false);164		expect(trigger.onChatMessage('roomId', 'userId', 'bad link 3 http://?', false, false)).toEqual(false);165		expect(fakeTumblrClient.link).not.toHaveBeenCalled();166		expect(fakeTumblrClient.photo).not.toHaveBeenCalled();167		expect(fakeTumblrClient.video).not.toHaveBeenCalled();168		expect(fakeTumblrClient.audio).not.toHaveBeenCalled();169	});170	it("should post generic links as links automatically", function() {171		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['link', 'photo', 'video', 'audio']);172		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );173		// Automatic posts should always return false174		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com', false, false)).toEqual(false);175		expect(fakeTumblrClient.link.calls.length).toEqual(1);176		expect(fakeTumblrClient.link.calls[0].args[0]).toEqual('blogname');177		expect(fakeTumblrClient.link.calls[0].args[1]).toEqual({ tags: 'link', url: 'http://www.google.com' });178		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com with context', false, false)).toEqual(false);179		expect(fakeTumblrClient.link.calls.length).toEqual(2);180		expect(fakeTumblrClient.link.calls[1].args[0]).toEqual('blogname');181		expect(fakeTumblrClient.link.calls[1].args[1]).toEqual({ tags: 'link', url: 'http://www.google.com', description: 'http://www.google.com with context' });182		expect(trigger.onChatMessage('roomId', 'userId', 'multiple links http://x.com http://y.com', false, false)).toEqual(false);183		expect(fakeTumblrClient.link.calls.length).toEqual(3);184		expect(fakeTumblrClient.link.calls[2].args[0]).toEqual('blogname');185		expect(fakeTumblrClient.link.calls[2].args[1]).toEqual({ tags: 'link', url: 'http://x.com', description: 'multiple links http://x.com http://y.com' });186		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/page', false, false)).toEqual(false);187		expect(fakeTumblrClient.link.calls.length).toEqual(4);188		expect(fakeTumblrClient.link.calls[3].args[0]).toEqual('blogname');189		expect(fakeTumblrClient.link.calls[3].args[1]).toEqual({ tags: 'link', url: 'http://www.google.com/page' });190		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/page?q1=x', false, false)).toEqual(false);191		expect(fakeTumblrClient.link.calls.length).toEqual(5);192		expect(fakeTumblrClient.link.calls[4].args[0]).toEqual('blogname');193		expect(fakeTumblrClient.link.calls[4].args[1]).toEqual({ tags: 'link', url: 'http://www.google.com/page?q1=x' });194		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/page?q1=x&q2=y#anchor', false, false)).toEqual(false);195		expect(fakeTumblrClient.link.calls.length).toEqual(6);196		expect(fakeTumblrClient.link.calls[5].args[0]).toEqual('blogname');197		expect(fakeTumblrClient.link.calls[5].args[1]).toEqual({ tags: 'link', url: 'http://www.google.com/page?q1=x&q2=y#anchor' });198	});199	it("should post image links as photos automatically", function() {200		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['link', 'photo', 'video', 'audio']);201		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );202		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/image.jpg', false, false)).toEqual(false);203		expect(fakeTumblrClient.photo.calls.length).toEqual(1);204		expect(fakeTumblrClient.photo.calls[0].args[1]).toEqual({ tags: 'photo', source: 'http://www.google.com/image.jpg', link: 'http://www.google.com/image.jpg' });205		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/image.jpeg', false, false)).toEqual(false);206		expect(fakeTumblrClient.photo.calls.length).toEqual(2);207		expect(fakeTumblrClient.photo.calls[1].args[1]).toEqual({ tags: 'photo', source: 'http://www.google.com/image.jpeg', link: 'http://www.google.com/image.jpeg' });208		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/image.jpeg', false, false)).toEqual(false);209		expect(fakeTumblrClient.photo.calls.length).toEqual(3);210		expect(fakeTumblrClient.photo.calls[2].args[1]).toEqual({ tags: 'photo', source: 'http://www.google.com/image.jpeg', link: 'http://www.google.com/image.jpeg' });211		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/image.png', false, false)).toEqual(false);212		expect(fakeTumblrClient.photo.calls.length).toEqual(4);213		expect(fakeTumblrClient.photo.calls[3].args[1]).toEqual({ tags: 'photo', source: 'http://www.google.com/image.png', link: 'http://www.google.com/image.png' });214		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/image.bmp', false, false)).toEqual(false);215		expect(fakeTumblrClient.photo.calls.length).toEqual(5);216		expect(fakeTumblrClient.photo.calls[4].args[1]).toEqual({ tags: 'photo', source: 'http://www.google.com/image.bmp', link: 'http://www.google.com/image.bmp' });217		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/image.JPg', false, false)).toEqual(false);218		expect(fakeTumblrClient.photo.calls.length).toEqual(6);219		expect(fakeTumblrClient.photo.calls[5].args[1]).toEqual({ tags: 'photo', source: 'http://www.google.com/image.JPg', link: 'http://www.google.com/image.JPg' });220		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/image.jpg context', false, false)).toEqual(false);221		expect(fakeTumblrClient.photo.calls.length).toEqual(7);222		expect(fakeTumblrClient.photo.calls[6].args[1]).toEqual({ tags: 'photo', source: 'http://www.google.com/image.jpg', link: 'http://www.google.com/image.jpg', caption: 'http://www.google.com/image.jpg context' });223		expect(fakeTumblrClient.link).not.toHaveBeenCalled();224	});225	it("should post bad image links as links", function() {226		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['link', 'photo', 'video', 'audio']);227		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );228		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/image .jpg', false, false)).toEqual(false);229		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/xjpg', false, false)).toEqual(false);230		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/a.jpg?x=y', false, false)).toEqual(false);231		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/a.jpg#a', false, false)).toEqual(false);232		expect(fakeTumblrClient.photo).not.toHaveBeenCalled();233		expect(fakeTumblrClient.link.calls.length).toEqual(4);234	});235	it("should post tumblr gifs as photos", function() {236		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['link', 'photo', 'video', 'audio', 'text']);237		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );238		expect(trigger.onChatMessage('roomId', 'userId', 'http://25.media.tumblr.com/x/x.gif', false, false)).toEqual(false);239		expect(fakeTumblrClient.photo.calls.length).toEqual(1);240		expect(fakeTumblrClient.photo.calls[0].args[1]).toEqual({ tags: 'photo', source: 'http://25.media.tumblr.com/x/x.gif', link: 'http://25.media.tumblr.com/x/x.gif' });241		expect(trigger.onChatMessage('roomId', 'userId', 'http://25.media.tumblr.com/x/x.gif context', false, false)).toEqual(false);242		expect(fakeTumblrClient.photo.calls.length).toEqual(2);243		expect(fakeTumblrClient.photo.calls[1].args[1]).toEqual({ tags: 'photo', source: 'http://25.media.tumblr.com/x/x.gif', link: 'http://25.media.tumblr.com/x/x.gif', caption: 'http://25.media.tumblr.com/x/x.gif context' });244		expect(fakeTumblrClient.link).not.toHaveBeenCalled();245		expect(fakeTumblrClient.text).not.toHaveBeenCalled();246	});247	it("should post non-tumblr gifs as HTML text tagged as photo", function() {248		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['link', 'photo', 'video', 'audio', 'text']);249		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );250		expect(trigger.onChatMessage('roomId', 'userId', 'http://i.imgur.com/x.gif', false, false)).toEqual(false);251		252		expect(fakeTumblrClient.text.calls.length).toEqual(1);253		expect(fakeTumblrClient.text.calls[0].args[1]).toEqual({ tags: 'photo', body: '<img src="http://i.imgur.com/x.gif">' });254		expect(trigger.onChatMessage('roomId', 'userId', 'http://i.imgur.com/x.gif context', false, false)).toEqual(false);255		expect(fakeTumblrClient.text.calls.length).toEqual(2);256		expect(fakeTumblrClient.text.calls[1].args[1]).toEqual({ tags: 'photo', body: '<img src="http://i.imgur.com/x.gif"><br>http://i.imgur.com/x.gif context' });257		expect(fakeTumblrClient.link).not.toHaveBeenCalled();258		expect(fakeTumblrClient.photo).not.toHaveBeenCalled();259	});260	it("should post video links as video automatically", function() {261		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['link', 'photo', 'video', 'audio']);262		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );263		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.youtube.com/watch?v=xx', false, false)).toEqual(false);264		expect(fakeTumblrClient.video.calls.length).toEqual(1);265		expect(fakeTumblrClient.video.calls[0].args[1]).toEqual({ tags: 'video', embed: 'http://www.youtube.com/watch?v=xx' });266		expect(trigger.onChatMessage('roomId', 'userId', 'https://www.youtube.com/watch?v=xx context', false, false)).toEqual(false);267		expect(fakeTumblrClient.video.calls.length).toEqual(2);268		expect(fakeTumblrClient.video.calls[1].args[1]).toEqual({ tags: 'video', embed: 'https://www.youtube.com/watch?v=xx', caption: 'https://www.youtube.com/watch?v=xx context' });269		expect(trigger.onChatMessage('roomId', 'userId', 'http://vimeo.com/xx', false, false)).toEqual(false);270		expect(fakeTumblrClient.video.calls.length).toEqual(3);271		expect(fakeTumblrClient.video.calls[2].args[1]).toEqual({ tags: 'video', embed: 'http://vimeo.com/xx' });272		expect(trigger.onChatMessage('roomId', 'userId', 'http://x.subdomain.vimeo.com/xx', false, false)).toEqual(false);273		expect(fakeTumblrClient.video.calls.length).toEqual(4);274		expect(fakeTumblrClient.video.calls[3].args[1]).toEqual({ tags: 'video', embed: 'http://x.subdomain.vimeo.com/xx' });275		expect(fakeTumblrClient.link).not.toHaveBeenCalled();276	});277	it("should post bad video links as links", function() {278		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['link', 'photo', 'video', 'audio']);279		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );280		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.youtube.com/', false, false)).toEqual(false);281		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.youtube.com', false, false)).toEqual(false);282		expect(trigger.onChatMessage('roomId', 'userId', 'http://theyoutube.com/xx', false, false)).toEqual(false);283		expect(trigger.onChatMessage('roomId', 'userId', 'http://youtubed.com/xx', false, false)).toEqual(false);284		expect(fakeTumblrClient.video).not.toHaveBeenCalled();285		expect(fakeTumblrClient.link.calls.length).toEqual(4);286	});287	it("should post audio links as audio automatically", function() {288		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['link', 'photo', 'video', 'audio']);289		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: true, tumblr: fakeTumblrClient } );290		expect(trigger.onChatMessage('roomId', 'userId', 'http://google.com/audio.mp3', false, false)).toEqual(false);291		expect(fakeTumblrClient.audio.calls.length).toEqual(1);292		expect(fakeTumblrClient.audio.calls[0].args[1]).toEqual({ tags: 'audio', external_url: 'http://google.com/audio.mp3' });293		expect(trigger.onChatMessage('roomId', 'userId', 'http://google.com/aud(iox-x.mp3', false, false)).toEqual(false);294		expect(fakeTumblrClient.audio.calls.length).toEqual(2);295		//expect(fakeTumblrClient.audio.calls[1].args[1]).toEqual({ tags: 'audio', external_url: 'http://google.com/audio(x-.mp3' });296		expect(trigger.onChatMessage('roomId', 'userId', 'http://google.com/audio.wav context', false, false)).toEqual(false);297		expect(fakeTumblrClient.audio.calls.length).toEqual(3);298		expect(fakeTumblrClient.audio.calls[2].args[1]).toEqual({ tags: 'audio', external_url: 'http://google.com/audio.wav', caption: 'http://google.com/audio.wav context' });299		expect(trigger.onChatMessage('roomId', 'userId', 'http://soundcloud.com/xx', false, false)).toEqual(false);300		expect(fakeTumblrClient.audio.calls.length).toEqual(4);301		expect(fakeTumblrClient.audio.calls[3].args[1]).toEqual({ tags: 'audio', external_url: 'http://soundcloud.com/xx' });302		expect(trigger.onChatMessage('roomId', 'userId', 'https://x.subdomain.soundcloud.com/xx', false, false)).toEqual(false);303		expect(fakeTumblrClient.audio.calls.length).toEqual(5);304		expect(fakeTumblrClient.audio.calls[4].args[1]).toEqual({ tags: 'audio', external_url: 'https://x.subdomain.soundcloud.com/xx' });305		expect(fakeTumblrClient.link).not.toHaveBeenCalled();306	});307	it("should not post context if the autoPostContext option is false", function() {308		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['link', 'photo', 'video', 'audio']);309		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: false, tumblr: fakeTumblrClient } );310		expect(trigger.onChatMessage('roomId', 'userId', 'context http://www.google.com context', false, false)).toEqual(false);311		expect(fakeTumblrClient.link.calls.length).toEqual(1);312		expect(fakeTumblrClient.link.calls[0].args[0]).toEqual('blogname');313		expect(fakeTumblrClient.link.calls[0].args[1]).toEqual({ tags: 'link', url: 'http://www.google.com' });314	});315	it("should not post context if the autoPostContext option is missing", function() {316		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['link', 'photo', 'video', 'audio']);317		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, tumblr: fakeTumblrClient } );318		expect(trigger.onChatMessage('roomId', 'userId', 'context http://www.google.com context', false, false)).toEqual(false);319		expect(fakeTumblrClient.link.calls.length).toEqual(1);320		expect(fakeTumblrClient.link.calls[0].args[0]).toEqual('blogname');321		expect(fakeTumblrClient.link.calls[0].args[1]).toEqual({ tags: 'link', url: 'http://www.google.com' });322	});323	it("should post each link separately if the autoPostContext option is false", function() {324		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['link', 'photo', 'video', 'audio']);325		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: true, autoPostContext: false, tumblr: fakeTumblrClient } );326		expect(trigger.onChatMessage('roomId', 'userId', 'context http://www.google.com/1 context http://www.google.com/2', false, false)).toEqual(false);327		expect(fakeTumblrClient.link.calls.length).toEqual(2);328		expect(fakeTumblrClient.link.calls[0].args[0]).toEqual('blogname');329		expect(fakeTumblrClient.link.calls[0].args[1]).toEqual({ tags: 'link', url: 'http://www.google.com/1' });330		expect(fakeTumblrClient.link.calls[1].args[0]).toEqual('blogname');331		expect(fakeTumblrClient.link.calls[1].args[1]).toEqual({ tags: 'link', url: 'http://www.google.com/2' });332		expect(trigger.onChatMessage('roomId', 'userId', 'http://google.com/audio.mp3 http://www.youtube.com/watch?v=xx http://www.google.com/image.jpg', false, false)).toEqual(false);333		expect(fakeTumblrClient.link.calls.length).toEqual(2);334		expect(fakeTumblrClient.audio.calls.length).toEqual(1);335		expect(fakeTumblrClient.audio.calls[0].args[0]).toEqual('blogname');336		expect(fakeTumblrClient.audio.calls[0].args[1]).toEqual({ tags: 'audio', external_url: 'http://google.com/audio.mp3' });337		expect(fakeTumblrClient.video.calls.length).toEqual(1);338		expect(fakeTumblrClient.video.calls[0].args[0]).toEqual('blogname');339		expect(fakeTumblrClient.video.calls[0].args[1]).toEqual({ tags: 'video', embed: 'http://www.youtube.com/watch?v=xx' });340		expect(fakeTumblrClient.photo.calls.length).toEqual(1);341		expect(fakeTumblrClient.photo.calls[0].args[0]).toEqual('blogname');342		expect(fakeTumblrClient.photo.calls[0].args[1]).toEqual({ tags: 'photo', source: 'http://www.google.com/image.jpg', link: 'http://www.google.com/image.jpg' });343	});344	it("should not auto-post links if the autoPost option is false", function() {345		var fakeTumblrClient = jasmine.createSpyObj('fakeTumblrClient', ['link', 'photo', 'video', 'audio']);346		var trigger = TumblrTrigger.create("tumblrTrigger", fakeBot, { blogName: 'blogname', autoPost: false, tumblr: fakeTumblrClient } );347		expect(trigger.onChatMessage('roomId', 'userId', 'http://www.google.com/1', false, false)).toEqual(false);348		expect(fakeTumblrClient.link).not.toHaveBeenCalled();349		expect(trigger.onChatMessage('roomId', 'userId', '!postlink http://www.google.com/1', false, false)).toEqual(true);350		expect(fakeTumblrClient.link.calls.length).toEqual(1);351		expect(fakeTumblrClient.link.calls[0].args[0]).toEqual('blogname');352		expect(fakeTumblrClient.link.calls[0].args[1]).toEqual({ tags: 'link', url: 'http://www.google.com/1' });353	});...editor.js
Source:editor.js  
1import expect, { createSpy } from "expect"2import rewiremock from "rewiremock"3import Enzyme, { shallow } from "enzyme"4import Adapter from "enzyme-adapter-react-15"5import React from "react"6import FakeAce, { Session } from "test/unit/mocks/ace.js"7import { fromJS } from "immutable"8const pause = (ms) => new Promise((res) => setTimeout(res, ms))9const EVENTUALLY = 900 // ms10/**11* We're mocking out the editor,12* so uses of the phrase "should see this in editor",13* will match to the following Ace methods:14*15* - "what user see's in editor" => fakeAce.userSees()16* - "user types something (end of document)" => fakeAce.userTypes("hi")17* - "Ctrl-Z" => fakeAce.userUndo()18* - "Ctrl-Shift-Z" => fakeAce.userRedo()19**/20describe("editor", function() {21  before(function () {22    // Enzyme.configure({ adapter: new Adapter()})23    Enzyme.configure({ adapter: new Adapter()})24    // Whole bunch of mocks!25    rewiremock.enable()26    rewiremock("brace/mode/yaml").with({})27    rewiremock("brace/theme/tomorrow_night_eighties").with({})28    rewiremock("brace/ext/language_tools").with({})29    rewiremock("brace/ext/searchbox").with({})30    rewiremock("./brace-snippets-yaml").with({})31    rewiremock("./editor.less").with({})32  })33  after(function() {34    rewiremock.disable()35  })36  beforeEach(function() {37    delete require.cache[require.resolve("react-ace")]38  })39  describe("fake ace", function() {40    it("should be an event emitter", () => {41      // Given42      const fakeAce = new FakeAce()43      const spy = createSpy()44      fakeAce.on("foo", spy)45      // When46      fakeAce.emit("foo", "bar")47      // Then48      expect(spy.calls.length).toEqual(1)49      expect(spy.calls[0].arguments[0]).toEqual("bar")50    })51    it("should return `this`, when calling .edit", function() {52      // Given53      const fakeAce = new FakeAce()54      // When55      const res = fakeAce.edit()56      // Then57      expect(res).toBe(fakeAce)58    })59    it("should keep track of setValue", function() {60      // Given61      const fakeAce = new FakeAce()62      // When63      fakeAce.setValue("foo")64      // Then65      const res = fakeAce.getValue()66      expect(res).toEqual("foo")67    })68    it("should spy on setValue", function() {69      // Given70      const fakeAce = new FakeAce()71      // When72      fakeAce.setValue("foo")73      // Then74      expect(fakeAce.setValue.calls.length).toEqual(1)75      expect(fakeAce.setValue.calls[0].arguments[0]).toEqual("foo")76    })77    it("should return a single session, with getSession", function() {78      // Given79      const fakeAce = new FakeAce()80      // When81      const res = fakeAce.getSession()82      // Then83      expect(res).toBeA(Session)84    })85    it("should add options via setOptions", function() {86      // Given87      const fakeAce = new FakeAce()88      // When89      fakeAce.setOptions({one: "uno"})90      // Then91      const res = fakeAce.getOption("one")92      expect(res).toEqual("uno")93    })94    describe("userUndo/Redo", function() {95      it("should revert to last input", function() {96        // Given97        const fakeAce = new FakeAce()98        fakeAce.userTypes("one")99        // When100        fakeAce.userTypes("two")101        // Then102        fakeAce.userUndo()103        expect(fakeAce.userSees()).toEqual("one")104      })105      it("should revert to empty document, no changes were made", function() {106        // Given107        const fakeAce = new FakeAce()108        // When109        fakeAce.userUndo()110        // Then111        expect(fakeAce.userSees()).toEqual("")112      })113      it("should revert to empty document, after arbitrary undos", function() {114        // Given115        const fakeAce = new FakeAce()116        // When117        fakeAce.userUndo()118        fakeAce.userUndo()119        fakeAce.userUndo()120        fakeAce.userUndo()121        // Then122        expect(fakeAce.userSees()).toEqual("")123      })124      it("should not extend redos after last change", function() {125        // Given126        const fakeAce = new FakeAce()127        fakeAce.userTypes("x")128        // When129        fakeAce.userRedo()130        fakeAce.userRedo()131        fakeAce.userRedo()132        // Then133        expect(fakeAce.userSees()).toEqual("x")134      })135      it("should allow redo after single undo", function() {136        // Given137        const fakeAce = new FakeAce()138        fakeAce.userTypes("x")139        fakeAce.userTypes("x")140        fakeAce.userUndo()141        // When142        fakeAce.userRedo()143        // Then144        expect(fakeAce.userSees()).toEqual("xx")145      })146      it("should create new thread of undo stack, after new change", function() {147        // Given148        const fakeAce = new FakeAce()149        fakeAce.userTypes("1")150        fakeAce.userTypes("2")151        fakeAce.userTypes("3")152        fakeAce.userTypes("4")153        fakeAce.userUndo() // 123154        fakeAce.userUndo() // 12155        fakeAce.userTypes("5") // 125156        // When157        fakeAce.userRedo() // 125, don't extend beyond158        // Then159        expect(fakeAce.userSees()).toEqual("125")160      })161    })162    describe("fake session", function() {163      it("should keep add state for markers", function() {164        // Given165        const fakeAce = new FakeAce()166        const fakeSession = fakeAce.getSession()167        // When168        fakeSession.addMarker({one: 1})169        // Then170        const res = fakeSession.getMarkers()171        expect(res).toBeAn("array")172        expect(res.length).toEqual(1)173        expect(res[0]).toEqual({id: 0, one: 1})174      })175      it("should keep remove state for markers", function() {176        // Given177        const fakeAce = new FakeAce()178        const fakeSession = fakeAce.getSession()179        fakeSession.addMarker({one: 1})180        // When181        fakeSession.removeMarker(0)182        // Then183        const res = fakeSession.getMarkers()184        expect(res).toBeAn("array")185        expect(res.length).toEqual(0)186      })187      it("should spy on addMarker", function() {188        // Given189        const fakeAce = new FakeAce()190        const fakeSession = fakeAce.getSession()191        // When192        fakeSession.addMarker({one: 1})193        // Then194        expect(fakeSession.addMarker.calls.length).toEqual(1)195      })196      it("should spy on setMode", function() {197        // Given198        const fakeAce = new FakeAce()199        const fakeSession = fakeAce.getSession()200        // When201        fakeSession.setMode()202        // Then203        expect(fakeSession.setMode.calls.length).toEqual(1)204      })205      it("should have a .selection which includes toJSON, fromJSON", function() {206        // Given207        const fakeAce = new FakeAce()208        // When209        const fakeSession = fakeAce.getSession()210        // Then211        expect(fakeSession.selection).toIncludeKey("toJSON")212        expect(fakeSession.selection).toIncludeKey("fromJSON")213      })214      describe("userTypes", function() {215        it("should emit 'change'", function() {216          // Given217          const fakeAce = new FakeAce()218          const spy = createSpy()219          fakeAce.on("change", spy)220          // When221          fakeAce.userTypes("hello")222          // Then223          expect(spy.calls.length).toBeGreaterThan(1)224        })225        it("should change the value", function() {226          // Given227          const fakeAce = new FakeAce()228          // When229          fakeAce.userTypes("hello")230          // Then231          expect(fakeAce.getValue()).toEqual("hello")232        })233      })234      describe("userSees", function() {235        it("should match userTypes", function() {236          // Given237          const fakeAce = new FakeAce()238          // When239          fakeAce.userTypes("hi")240          // Then241          const res = fakeAce.userSees()242          expect(res).toEqual("hi")243        })244        it("should match setValue", function() {245          // Given246          const fakeAce = new FakeAce()247          // When248          fakeAce.setValue("hello")249          // Then250          const res = fakeAce.userSees()251          expect(res).toEqual("hello")252        })253      })254    })255    describe("renderer", function() {256      it("should have a stub for setShowGutter", function() {257        // Given258        const fakeAce = new FakeAce()259        // When260        fakeAce.renderer.setShowGutter("foo")261        // Then262        expect(fakeAce.renderer.setShowGutter.calls.length).toEqual(1)263        expect(fakeAce.renderer.setShowGutter.calls[0].arguments[0]).toEqual("foo")264      })265    })266  })267  describe("editor component", function() {268    it("should EVENTUALLY call onChange when user enters input", (done) => {269      // Given270      const fakeAce = new FakeAce()271      rewiremock("brace").with(fakeAce)272      const makeEditor = require("plugins/editor/components/editor.jsx").default273      const Editor = makeEditor({})274      const spy = createSpy()275      const wrapper = shallow(276        <Editor onChange={spy} />277      )278      wrapper279        .find("ReactAce").shallow()280      // When281      // Simulate user input282      fakeAce.userTypes("hello")283      // Then284      setTimeout(() => {285        expect(spy.calls.length).toEqual(1)286        expect(spy.calls[0].arguments[0]).toEqual("hello")287        done()288      }, EVENTUALLY)289    })290    it("should EVENTUALLY put the contents of `value` prop into editor, without regard to `origin` property", (done) => {291      // Given292      const fakeAce = new FakeAce()293      rewiremock("brace").with(fakeAce)294      const makeEditor = require("plugins/editor/components/editor.jsx").default295      const Editor = makeEditor({})296      // When297      const wrapper = shallow(298        <Editor value={"original value"} />299      )300      wrapper.find("ReactAce").shallow()301      // Then302      setTimeout(() => {303        expect(fakeAce.userSees()).toEqual("original value")304        done()305      }, EVENTUALLY)306    })307    it("should EVENTUALLY put the contents of `value` prop into editor, with `foo` origin property ", (done) => {308      // Given309      const fakeAce = new FakeAce()310      rewiremock("brace").with(fakeAce)311      const makeEditor = require("plugins/editor/components/editor.jsx").default312      const Editor = makeEditor({})313      // When314      const wrapper = shallow(315        <Editor value={"original value"} origin="foo" />316      )317      wrapper.find("ReactAce").shallow()318      // Then319      setTimeout(() => {320        expect(fakeAce.userSees()).toEqual("original value")321        done()322      }, EVENTUALLY)323    })324    it("should NEVER update ace if the yaml originated in editor", async () => {325      // Given326      const fakeAce = new FakeAce()327      rewiremock("brace").with(fakeAce)328      const makeEditor = require("plugins/editor/components/editor.jsx").default329      const Editor = makeEditor({})330      // When331      const wrapper = shallow(332        <Editor value="original value" />333      )334      wrapper.find("ReactAce").shallow()335      wrapper.setProps({value: "new value", origin: "editor"})336      // Then337      await pause(EVENTUALLY)338      expect(fakeAce.userSees()).toEqual("original value")339    })340    // SKIPPED: Does this have any value at this level? And not editor-container?341    it.skip("SKIP: should EVENTUALLY call onChange ONCE if the user types/pauses/types", async function() {342      this.timeout(10000)343      // Given344      const fakeAce = new FakeAce()345      rewiremock("brace").with(fakeAce)346      const makeEditor = require("plugins/editor/components/editor.jsx").default347      const Editor = makeEditor({})348      const spy = createSpy()349      const wrapper = shallow(350        <Editor value="original value" onChange={spy}/>351      )352      wrapper.find("ReactAce").shallow()353      // When354      fakeAce.userTypes(" one")355      await pause(EVENTUALLY / 2)356      fakeAce.userTypes("two")357      await pause(EVENTUALLY / 2)358      fakeAce.userTypes("three")359      await pause(EVENTUALLY / 2)360      await pause(EVENTUALLY * 2)361      expect(fakeAce.userSees()).toEqual("original value onetwothree")362      expect(spy.calls.length).toEqual(1)363    })364    it("should EVENTUALLY call onChange when ctrl-z", async function() {365      this.timeout(10000)366      // Given367      const fakeAce = new FakeAce()368      rewiremock("brace").with(fakeAce)369      const makeEditor = require("plugins/editor/components/editor.jsx").default370      const Editor = makeEditor({})371      const spy = createSpy()372      const wrapper = shallow(373        <Editor value="original value" onChange={spy}/>374      )375      wrapper.find("ReactAce").shallow()376      fakeAce.userTypes("one")377      // When378      fakeAce.userUndo()379      await pause(EVENTUALLY)380      expect(fakeAce.userSees()).toEqual("original value")381      expect(spy.calls.length).toEqual(1)382    })383    describe("markers", function() {384      it("should place markers into editor", async function() {385        // Given386        const fakeAce = new FakeAce()387        const spy = createSpy()388        rewiremock("brace").with(fakeAce)389        rewiremock("../editor-helpers/marker-placer").with({placeMarkerDecorations: spy})390        const makeEditor = require("plugins/editor/components/editor.jsx").default391        const Editor = makeEditor({})392        const dummy = fromJS({one: 1})393        const wrapper = shallow(394          <Editor markers={dummy} />395        )396        // When397        wrapper.find("ReactAce").shallow()398        await pause(EVENTUALLY)399        // Then400        expect(spy.calls.length).toEqual(1)401        expect(spy.calls[0].arguments[0]).toInclude({markers: {one: 1}})402      })403      it("should place markers after yaml", async function() {404        // Given405        const order = []406        const fakeAce = new FakeAce()407        fakeAce.setValue.andCall(() => order.push("setValue"))408        const spy = createSpy().andCall(() => order.push("placeMarkers"))409        rewiremock("brace").with(fakeAce)410        rewiremock("../editor-helpers/marker-placer").with({placeMarkerDecorations: spy})411        const makeEditor = require("plugins/editor/components/editor.jsx").default412        const Editor = makeEditor({})413        const wrapper = shallow(414          <Editor value="original value" markers={{}} />415        )416        // When417        wrapper.find("ReactAce").shallow()418        await pause(EVENTUALLY)419        // Then420        expect(order).toEqual(["setValue", "placeMarkers"])421      })422      it.skip("should Test for markers being disabled/enabled during a yaml update", async function() {423        // Given424        const order = []425        const fakeAce = new FakeAce()426        fakeAce.setValue.andCall(() => order.push("setValue"))427        const spy = createSpy().andCall(() => {428          order.push("placeMarkers")429          return () => order.push("removeMarkers")430        })431        rewiremock("brace").with(fakeAce)432        rewiremock("../editor-helpers/marker-placer").with({placeMarkerDecorations: spy})433        const makeEditor = require("plugins/editor/components/editor.jsx").default434        const Editor = makeEditor({})435        const wrapper = shallow(436          <Editor value="original value" markers={{}} />437        )438        wrapper.find("ReactAce").shallow()439        // When440        wrapper.setProps({value: "new value", origin: "bob"})441        await pause(EVENTUALLY)442        // Then443        expect(order).toEqual(["setValue", "placeMarkers", "removeMarkers", "setValue", "placeMarkers"])444      })445      it.skip("should Test for markers being disabled/enabled during ctrl-z", async function() {446        // Given447        const order = []448        const fakeAce = new FakeAce()449        fakeAce.setValue.andCall(() => order.push("setValue"))450        const spy = createSpy().andCall(() => {451          order.push("placeMarkers")452          return () => order.push("removeMarkers")453        })454        rewiremock("brace").with(fakeAce)455        rewiremock("../editor-helpers/marker-placer").with({placeMarkerDecorations: spy})456        const makeEditor = require("plugins/editor/components/editor.jsx").default457        const Editor = makeEditor({})458        const wrapper = shallow(459          <Editor value="original value" markers={{}} />460        )461        wrapper.find("ReactAce").shallow()462        // When463        fakeAce.userUndo()464        await pause(EVENTUALLY)465        // Then466        expect(order).toEqual(["setValue", "placeMarkers", "removeMarkers", "setValue", "placeMarkers"])467      })468    })469  })...chatBotSpec.js
Source:chatBotSpec.js  
1var _ = require('underscore');2var steam = require('steam');3var ChatBot = require('../lib/chatBot.js').ChatBot;4describe("ChatBot", function() {5	var bot;6	var fakeClient;7	var fakeTriggerFactory;8	beforeEach(function() {9		fakeClient = jasmine.createSpyObj('fakeClient', ['on', 'logOn', 'setPersonaState', 'joinChat']);10		fakeTriggerFactory = jasmine.createSpyObj('fakeTriggerFactory', ['createTrigger']);11		fakeTriggerFactory.createTrigger.andCallFake(function(type, name, bot, options) {12			if (type == "invalidType") {13				return null;14			}15			var fakeTrigger = jasmine.createSpyObj('fakeTrigger', ['getOptions', 'onChatInvite', 'onFriendRequest', 'onFriendMessage', 'onChatMessage']);16			fakeTrigger.getOptions.andCallFake(function() {17				return options;18			});19			fakeTrigger.name = name;20			fakeTrigger.type = type;21			return fakeTrigger;22		});23	});24	afterEach(function() {25		if (bot) {26			clearInterval(bot.babysitInterval);27		}28	});29	describe("ChatBot connections", function() {30		it("should connect when created if autoConnect option is on", function() {31			bot = new ChatBot("username", "password", { client: fakeClient, autoConnect: true, autoReconnect: true });32			expect(fakeClient.logOn).toHaveBeenCalled();33		});34		it("should reconnect when disconnected if autoReconnect option is on", function() {35			runs(function() {36				bot = new ChatBot("username", "password", { client: fakeClient, babysitTimer: 100, autoConnect: true, autoReconnect: true });37				expect(fakeClient.logOn.calls.length).toEqual(1);38				bot.connected = false;39			});40			waits(110);41			runs(function() {42				expect(fakeClient.logOn.calls.length).toEqual(2);43			});44		});45		it("should not automatically connect if autoConnect option is off", function() {46			bot = new ChatBot("username", "password", { client: fakeClient, autoConnect: false, autoReconnect: false });47			expect(fakeClient.logOn).not.toHaveBeenCalled();48			bot.connect();49			expect(fakeClient.logOn).toHaveBeenCalled();50		});51		it("should not automatically re-connect until connect is called if autoConnect option is off", function() {52			bot = new ChatBot("username", "password", { client: fakeClient, autoConnect: false, autoReconnect: true, babysitTimer: 100 });53			54			waits(110);55			runs(function() {56				expect(fakeClient.logOn).not.toHaveBeenCalled();57				bot.connect();58				expect(fakeClient.logOn).toHaveBeenCalled();59				bot.connected = false;60			});61			waits(110);62			runs(function() {63				expect(fakeClient.logOn.calls.length).toEqual(2);64			});65		});66		it("should not automatically re-connect on disconnection if autoReconnect option is off", function() {67			bot = new ChatBot("username", "password", { client: fakeClient, autoConnect: false, autoReconnect: false, babysitTimer: 100 });68			expect(fakeClient.logOn).not.toHaveBeenCalled();69			bot.connect();70			expect(fakeClient.logOn).toHaveBeenCalled();71			bot.connected = false;72			waits(110);73			runs(function() {74				expect(fakeClient.logOn.calls.length).toEqual(1);75			});76		});77	});78	describe("ChatBot muting", function() {79		it("should update its persona state when muted and unmuted", function() {80			bot = new ChatBot("username", "password", { client: fakeClient });81			bot._onLoggedOn(); // Fake logged on event82			expect(fakeClient.setPersonaState.calls.length).toEqual(1);83			expect(fakeClient.setPersonaState.calls[0].args[0]).toEqual(bot.unmutedState);84			bot.mute();85			expect(fakeClient.setPersonaState.calls.length).toEqual(2);86			expect(fakeClient.setPersonaState.calls[1].args[0]).toEqual(bot.mutedState);87			bot.unmute();88			expect(fakeClient.setPersonaState.calls.length).toEqual(3);89			expect(fakeClient.setPersonaState.calls[2].args[0]).toEqual(bot.unmutedState);90		});91		it("should log in with the muted persona state after reconnection when muted", function() {92			runs(function() {93				bot = new ChatBot("username", "password", { client: fakeClient, babysitTimer: 100 });94				bot._onLoggedOn(); // Fake logged on event95				bot.mute();96				bot.connected = false;97				setTimeout(function() {98					bot._onLoggedOn(); // Fake logged on event99				}, 110);100			});101			waits(200);102			runs(function() {103				expect(fakeClient.setPersonaState.calls.length).toEqual(3); // first log-on, mute, reconnect104				expect(fakeClient.setPersonaState.calls[2].args[0]).toEqual(bot.mutedState);105			});106		});107	});108	describe("ChatBot trigger management", function() {109		it("should return true when a valid trigger is added", function() {110			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });111			expect(bot.addTrigger("trigger1", "type")).not.toBeNull();112		});113		it("should return false when a trigger can't be created", function() {114			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });115			expect(bot.addTrigger("trigger1", "invalidType")).toBeNull();116		});117		it("should replace a trigger when one is added with the same name", function() {118			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });119			expect(bot.addTrigger("trigger1", "type1")).not.toBeNull();120			expect(bot.addTrigger("trigger1", "type2")).not.toBeNull();121			expect(_.size(bot.triggers)).toEqual(1);122		});123		it("should return true when a trigger is removed", function() {124			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });125			expect(bot.addTrigger("trigger1", "type")).not.toBeNull();126			expect(bot.removeTrigger("trigger1")).toEqual(true);127			expect(_.size(bot.triggers)).toEqual(0);128		});129		it("should return false when remove is called for a non-existent trigger", function() {130			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });131			expect(bot.removeTrigger("trigger")).toEqual(false);132		});133		it("should allow multiple triggers to be added in the same call", function() {134			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });135			var triggers = [136				{ name: "trigger1", type: "type1", options: {} },137				{ name: "trigger2", type: "type1" },138				{ name: "trigger3", type: "type2", options: {} }139			];140			expect(bot.addTriggers(triggers)).toEqual(true);141			expect(_.size(bot.triggers)).toEqual(3);142		});143		it("should return false if any trigger added in bulk is invalid", function() {144			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });145			var triggers = [146				{ name: "trigger1", type: "type1", options: {} },147				{ name: "trigger2", type: "type1" },148				{ name: "trigger3", type: "invalidType", options: {} }149			];150			expect(bot.addTriggers(triggers)).toEqual(false);151			expect(_.size(bot.triggers)).toEqual(2);152		});153		it("should be able to export trigger details and in the same form that they can be added", function() {154			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });155			var triggers = [156				{ name: "trigger1", type: "type1", options: { option1: true, option2: "string", option3: 3 } },157				{ name: "trigger2", type: "type1" },158				{ name: "trigger3", type: "type2", options: {} }159			];160			bot.addTriggers(triggers);161			var exportedTriggers = bot.getTriggerDetails();162			expect(_.size(exportedTriggers)).toEqual(3);163			expect(_.size(bot.triggers)).toEqual(3);164			bot.clearTriggers();165			expect(_.size(bot.triggers)).toEqual(0);166			expect(bot.addTriggers(exportedTriggers)).toEqual(true);167			expect(_.size(bot.triggers)).toEqual(3);168			var exportedTriggers = {};169			expect(_.size(bot.triggers)).toEqual(3);170		});171	});172	describe("ChatBot trigger interactions", function() {173		it("should call onChatInvite on triggers when a user chat room invitation is sent", function() {174			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });175			var fakeTrigger1 = bot.addTrigger("fakeTrigger1", "type");176			var fakeTrigger2 = bot.addTrigger("fakeTrigger2", "type");177			bot._onChatInvite("roomId", "roomName", "inviterId");178			expect(fakeTrigger1.onChatInvite).toHaveBeenCalledWith("roomId", "roomName", "inviterId");179			expect(fakeTrigger2.onChatInvite).toHaveBeenCalledWith("roomId", "roomName", "inviterId");180		});181		it("should call onFriendRequest on triggers when a friend request is sent", function() {182			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });183			var fakeTrigger1 = bot.addTrigger("fakeTrigger1", "type");184			var fakeTrigger2 = bot.addTrigger("fakeTrigger2", "type");185			bot._onRelationship("userId", steam.EFriendRelationship.RequestRecipient);186			expect(fakeTrigger1.onFriendRequest).toHaveBeenCalledWith("userId");187			expect(fakeTrigger2.onFriendRequest).toHaveBeenCalledWith("userId");188		});189		it("should not call onFriendRequest on triggers when a other relationship events occur", function() {190			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });191			var fakeTrigger = bot.addTrigger("fakeTrigger", "type");192			bot._onRelationship("userId", steam.EFriendRelationship.None);193			bot._onRelationship("userId", steam.EFriendRelationship.Blocked);194			bot._onRelationship("userId", steam.EFriendRelationship.RequestInitiator);195			bot._onRelationship("userId", steam.EFriendRelationship.RequestInitiator);196			bot._onRelationship("userId", steam.EFriendRelationship.Friend);197			bot._onRelationship("userId", steam.EFriendRelationship.Ignored);198			bot._onRelationship("userId", steam.EFriendRelationship.IgnoredFriend);199			bot._onRelationship("userId", steam.EFriendRelationship.SuggestedFriend);200			expect(fakeTrigger.onFriendRequest).not.toHaveBeenCalled();201		});202		it("should call onFriendMessage on triggers when a friend message is received", function() {203			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });204			var fakeTrigger = bot.addTrigger("fakeTrigger", "type");205			bot._onFriendMsg("userId", "message", steam.EChatEntryType.ChatMsg);206			expect(fakeTrigger.onFriendMessage).toHaveBeenCalledWith("userId", "message", false);207		});208		it("should not call onFriendMessage on triggers when another chat entry type is received in a friend chat", function() {209			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });210			var fakeTrigger = bot.addTrigger("fakeTrigger", "type");211			bot._onFriendMsg("userId", "message", steam.EChatEntryType.Typing);212			expect(fakeTrigger.onFriendMessage).not.toHaveBeenCalled();213		});214		it("should pass on the fact that a message has already been sent in onFriendMessage calls", function() {215			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });216			var fakeTrigger1 = bot.addTrigger("fakeTrigger1", "type");217			fakeTrigger1.onFriendMessage.andCallFake(function() { return false; });218			var fakeTrigger2 = bot.addTrigger("fakeTrigger2", "type");219			fakeTrigger2.onFriendMessage.andCallFake(function() { return true; });220			var fakeTrigger3 = bot.addTrigger("fakeTrigger3", "type");221			fakeTrigger3.onFriendMessage.andCallFake(function() { return false; });222			var fakeTrigger4 = bot.addTrigger("fakeTrigger4", "type");223			fakeTrigger4.onFriendMessage.andCallFake(function() { return false; });224			bot._onFriendMsg("userId", "message", steam.EChatEntryType.ChatMsg);225			expect(fakeTrigger1.onFriendMessage).toHaveBeenCalledWith("userId", "message", false);226			expect(fakeTrigger2.onFriendMessage).toHaveBeenCalledWith("userId", "message", false);227			expect(fakeTrigger3.onFriendMessage).toHaveBeenCalledWith("userId", "message", true);228			expect(fakeTrigger4.onFriendMessage).toHaveBeenCalledWith("userId", "message", true);229		});230		it("should call onChatMessage on triggers when a message is received in a chat room", function() {231			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });232			var fakeTrigger = bot.addTrigger("fakeTrigger", "type");233			bot._onChatMsg("roomId", "message", steam.EChatEntryType.ChatMsg, "chatterId");234			expect(fakeTrigger.onChatMessage).toHaveBeenCalledWith("roomId", "chatterId", "message", false, false);235		});236		it("should not call onChatMessage on triggers when another chat entry type is received in a chat room", function() {237			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });238			var fakeTrigger = bot.addTrigger("fakeTrigger", "type");239			bot._onChatMsg("roomId", "message", steam.EChatEntryType.InviteGame, "chatterId");240			expect(fakeTrigger.onChatMessage).not.toHaveBeenCalled();241		});242		it("should pass on the fact that a message has already been sent in onChatMessage calls", function() {243			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });244			var fakeTrigger1 = bot.addTrigger("fakeTrigger1", "type");245			fakeTrigger1.onChatMessage.andCallFake(function() { return false; });246			var fakeTrigger2 = bot.addTrigger("fakeTrigger2", "type");247			fakeTrigger2.onChatMessage.andCallFake(function() { return true; });248			var fakeTrigger3 = bot.addTrigger("fakeTrigger3", "type");249			fakeTrigger3.onChatMessage.andCallFake(function() { return false; });250			var fakeTrigger4 = bot.addTrigger("fakeTrigger4", "type");251			fakeTrigger4.onChatMessage.andCallFake(function() { return false; });252			bot._onChatMsg("roomId", "message", steam.EChatEntryType.ChatMsg, "chatterId");253			expect(fakeTrigger1.onChatMessage).toHaveBeenCalledWith("roomId", "chatterId", "message", false, false);254			expect(fakeTrigger2.onChatMessage).toHaveBeenCalledWith("roomId", "chatterId", "message", false, false);255			expect(fakeTrigger3.onChatMessage).toHaveBeenCalledWith("roomId", "chatterId", "message", true, false);256			expect(fakeTrigger4.onChatMessage).toHaveBeenCalledWith("roomId", "chatterId", "message", true, false);257		});258		it("should pass on the fact that the bot is muted in onChatMessage calls", function() {259			bot = new ChatBot("username", "password", { client: fakeClient, triggerFactory: fakeTriggerFactory });260			var fakeTrigger = bot.addTrigger("fakeTrigger", "type");261			bot.mute();262			bot._onChatMsg("roomId", "message", steam.EChatEntryType.ChatMsg, "chatterId");263			expect(fakeTrigger.onChatMessage).toHaveBeenCalledWith("roomId", "chatterId", "message", false, true);264		});265	});...cleverbotTriggerSpec.js
Source:cleverbotTriggerSpec.js  
1var sinon = require('sinon');2var CleverbotTrigger = require('../lib/triggers/cleverbotTrigger.js');3describe("CleverbotTrigger", function() {4	var fakeBot;5	beforeEach(function() {6		fakeBot = jasmine.createSpyObj('fakeBot', ['sendMessage']);7	});8	it("should only respond to friend messages when a keyword is mentioned", function() {9		var fakeCleverbot = jasmine.createSpyObj('cleverbot', ['write']);10		var trigger = CleverbotTrigger.create("cleverbotTrigger", fakeBot, { keywords: ['cleverbot'], cleverbot: fakeCleverbot } );11		expect(trigger.onFriendMessage('userId', 'keyword not mentioned', false)).toEqual(false);12		expect(fakeCleverbot.write).not.toHaveBeenCalled();13		expect(trigger.onFriendMessage('userId', 'whole keyword not mentioned acleverbot', false)).toEqual(false);14		expect(fakeCleverbot.write).not.toHaveBeenCalled();15		expect(trigger.onFriendMessage('userId', 'cleverbot mentioned', false)).toEqual(true);16		expect(fakeCleverbot.write).toHaveBeenCalled();17		expect(trigger.onFriendMessage('userId', 'mentioned cleverbot', false)).toEqual(true);18		expect(fakeCleverbot.write.calls.length).toEqual(2);19		expect(trigger.onFriendMessage('userId', 'mentioned cleverbot again', false)).toEqual(true);20		expect(fakeCleverbot.write.calls.length).toEqual(3);21	});22	it("should only respond to chat messages when a keyword is mentioned", function() {23		var fakeCleverbot = jasmine.createSpyObj('cleverbot', ['write']);24		var trigger = CleverbotTrigger.create("cleverbotTrigger", fakeBot, { keywords: ['cleverbot'], cleverbot: fakeCleverbot } );25		expect(trigger.onChatMessage('roomId', 'userId', 'keyword not mentioned', false, false)).toEqual(false);26		expect(fakeCleverbot.write).not.toHaveBeenCalled();27		expect(trigger.onChatMessage('roomId', 'userId', 'whole keyword not mentioned acleverbot', false, false)).toEqual(false);28		expect(fakeCleverbot.write).not.toHaveBeenCalled();29		expect(trigger.onChatMessage('roomId', 'userId', 'cleverbot mentioned', false, false)).toEqual(true);30		expect(fakeCleverbot.write).toHaveBeenCalled();31		expect(trigger.onChatMessage('roomId', 'userId', 'mentioned cleverbot', false, false)).toEqual(true);32		expect(fakeCleverbot.write.calls.length).toEqual(2);33		expect(trigger.onChatMessage('roomId', 'userId', 'mentioned cleverbot again', false, false)).toEqual(true);34		expect(fakeCleverbot.write.calls.length).toEqual(3);35	});36	it("should not respond to messages only containing the keyword", function() {37		var fakeCleverbot = jasmine.createSpyObj('cleverbot', ['write']);38		var trigger = CleverbotTrigger.create("cleverbotTrigger", fakeBot, { keywords: ['cleverbot'], cleverbot: fakeCleverbot } );39		expect(trigger.onFriendMessage('userId', 'cleverbot', false)).toEqual(false);40		expect(fakeCleverbot.write).not.toHaveBeenCalled();41		expect(trigger.onFriendMessage('userId', ' cleverbot', false)).toEqual(false);42		expect(fakeCleverbot.write).not.toHaveBeenCalled();43		expect(trigger.onFriendMessage('userId', 'cleverbot ', false)).toEqual(false);44		expect(fakeCleverbot.write).not.toHaveBeenCalled();45		expect(trigger.onFriendMessage('userId', ' cleverbot ', false)).toEqual(false);46		expect(fakeCleverbot.write).not.toHaveBeenCalled();47	});48	it("should respond to any keyword", function() {49		var fakeCleverbot = jasmine.createSpyObj('cleverbot', ['write']);50		var trigger = CleverbotTrigger.create("cleverbotTrigger", fakeBot, { keywords: ['cleverbot', 'siri'], cleverbot: fakeCleverbot } );51		expect(trigger.onFriendMessage('userId', 'keyword not mentioned', false)).toEqual(false);52		expect(fakeCleverbot.write).not.toHaveBeenCalled();53		expect(trigger.onFriendMessage('userId', '1st keyword cleverbot mentioned', false)).toEqual(true);54		expect(fakeCleverbot.write).toHaveBeenCalled();55		expect(trigger.onFriendMessage('userId', '2nd keyword siri mentioned', false)).toEqual(true);56		expect(fakeCleverbot.write.calls.length).toEqual(2);57	});58	it("should respond to all messages when no keyword option is passed", function() {59		var fakeCleverbot = jasmine.createSpyObj('cleverbot', ['write']);60		var trigger = CleverbotTrigger.create("cleverbotTrigger", fakeBot, { cleverbot: fakeCleverbot } );61		expect(trigger.onFriendMessage('userId', 'hello', false)).toEqual(true);62		expect(fakeCleverbot.write).toHaveBeenCalled();63	});64	it("should strip out the keyword", function() {65		var fakeCleverbot = jasmine.createSpyObj('cleverbot', ['write']);66		var trigger = CleverbotTrigger.create("cleverbotTrigger", fakeBot, { keywords: ['cleverbot'], cleverbot: fakeCleverbot } );67		expect(trigger.onFriendMessage('userId', 'cleverbot should be stripped', false)).toEqual(true);68		expect(fakeCleverbot.write.calls.length).toEqual(1);69		expect(fakeCleverbot.write.calls[0].args[0]).toEqual(" should be stripped");70		expect(trigger.onFriendMessage('userId', 'stripped, should be cleverbot', false)).toEqual(true);71		expect(fakeCleverbot.write.calls.length).toEqual(2);72		expect(fakeCleverbot.write.calls[1].args[0]).toEqual("stripped, should be ");73		expect(trigger.onFriendMessage('userId', 'strip cleverbot ok', false)).toEqual(true);74		expect(fakeCleverbot.write.calls.length).toEqual(3);75		expect(fakeCleverbot.write.calls[2].args[0]).toEqual("strip  ok");76	});77	it("should strip out the keyword", function() {78		var fakeCleverbot = jasmine.createSpyObj('cleverbot', ['write']);79		var trigger = CleverbotTrigger.create("cleverbotTrigger", fakeBot, { keywords: ['cleverbot'], cleverbot: fakeCleverbot } );80		expect(trigger.onFriendMessage('userId', 'cleverbot should be stripped', false)).toEqual(true);81		expect(fakeCleverbot.write.calls.length).toEqual(1);82		expect(fakeCleverbot.write.calls[0].args[0]).toEqual(" should be stripped");83		expect(trigger.onFriendMessage('userId', 'stripped, should be cleverbot', false)).toEqual(true);84		expect(fakeCleverbot.write.calls.length).toEqual(2);85		expect(fakeCleverbot.write.calls[1].args[0]).toEqual("stripped, should be ");86		expect(trigger.onFriendMessage('userId', 'strip cleverbot ok', false)).toEqual(true);87		expect(fakeCleverbot.write.calls.length).toEqual(3);88		expect(fakeCleverbot.write.calls[2].args[0]).toEqual("strip  ok");89	});90	it("multiple not respond if another trigger has already fired", function() {91		var fakeCleverbot = jasmine.createSpyObj('cleverbot', ['write']);92		var trigger = CleverbotTrigger.create("cleverbotTrigger", fakeBot, { keywords: ['cleverbot'], cleverbot: fakeCleverbot } );93		expect(trigger.onFriendMessage('userId', 'hi cleverbot', true)).toEqual(false);94		expect(fakeBot.sendMessage).not.toHaveBeenCalled();95	});...Using AI Code Generation
1var sinon = require('sinon');2var fake = sinon.fake();3fake();4var sinon = require('sinon');5var stub = sinon.stub();6stub();7var sinon = require('sinon');8var spy = sinon.spy();9spy();10var sinon = require('sinon');11var mock = sinon.mock();12mock();13var sinon = require('sinon');14var sandbox = sinon.sandbox();15sandbox();16var sinon = require('sinon');17var match = sinon.match();18match();19var sinon = require('sinon');20var createStubInstance = sinon.createStubInstance();21createStubInstance();22var sinon = require('sinon');23var createSandbox = sinon.createSandbox();24createSandbox();25var sinon = require('sinon');26var fakeServer = sinon.fakeServer();27fakeServer();28var sinon = require('sinon');29var fakeServerWithClock = sinon.fakeServerWithClock();30fakeServerWithClock();31var sinon = require('sinon');32var fakeTimers = sinon.fakeTimers();33fakeTimers();34var sinon = require('sinon');35var fakeXhr = sinon.fakeXhr();36fakeXhr();37var sinon = require('sinon');38var format = sinon.format();39format();40var sinon = require('sinon');41var log = sinon.log();42log();Using AI Code Generation
1var sinon = require('sinon');2var assert = require('assert');3var myObj = {4    myMethod: function() {5        return 'foo';6    }7};8var spy = sinon.spy(myObj, 'myMethod');9assert(spy.called);10var stub = sinon.stub(myObj, 'myMethod').returns('bar');11assert(stub.called);12var mock = sinon.mock(myObj);13mock.verify();14var fake = sinon.fake.returns('bar');15assert(fake.called);16var fake = sinon.fake.returns('bar');17assert(fake.called);18var fake = sinon.fake.returns('bar');19assert(fake.called);20var fake = sinon.fake.returns('bar');21assert(fake.called);22var fake = sinon.fake.returns('bar');23assert(fake.called);24var fake = sinon.fake.returns('bar');25assert(fake.called);26var fake = sinon.fake.returns('bar');27console.log(fakeUsing AI Code Generation
1var sinon = require('sinon');2var expect = require('chai').expect;3var stub = sinon.stub();4stub.returns(42);5expect(stub()).to.equal(42);6var sinon = require('sinon');7var expect = require('chai').expect;8var stub = sinon.stub();9stub.returns(42);10expect(stub()).to.equal(42);11var sinon = require('sinon');12var expect = require('chai').expect;13var stub = sinon.stub();14stub.returns(42);15expect(stub()).to.equal(42);16var sinon = require('sinon');17var expect = require('chai').expect;18var stub = sinon.stub();19stub.returns(42);20expect(stub()).to.equal(42);21var sinon = require('sinon');22var expect = require('chai').expect;23var stub = sinon.stub();24stub.returns(42);25expect(stub()).to.equal(42);26var sinon = require('sinon');27var expect = require('chai').expect;28var stub = sinon.stub();29stub.returns(42);30expect(stub()).to.equal(42);31var sinon = require('sinon');32var expect = require('chai').expect;33var stub = sinon.stub();34stub.returns(42);35expect(stub()).to.equal(42);36var sinon = require('sinon');37var expect = require('chai').expect;38var stub = sinon.stub();39stub.returns(42);40expect(stub()).to.equal(42);41var sinon = require('sinon');42var expect = require('chai').expect;43var stub = sinon.stub();44stub.returns(42);45expect(stub()).to.equal(42);46var sinon = require('sinon');47var expect = require('chai').expect;48var stub = sinon.stub();49stub.returns(42);50expect(stub()).to.equal(42);51var sinon = require('sinon');52var expect = require('chai').expect;53var stub = sinon.stub();54stub.returns(42);Using AI Code Generation
1var sinon = require('sinon');2var assert = require('assert');3var myObj = {4  add: function(a, b) {5    return a + b;6  }7};8describe('fake', function() {9  it('should return 3', function() {10    var fake = sinon.fake.returns(3);11    var result = myObj.add(1, 2);12    assert.equal(result, 3);13  });14});15var sinon = require('sinon');16var assert = require('assert');17var myObj = {18  add: function(a, b) {19    return a + b;20  }21};22describe('stub', function() {23  it('should return 3', function() {24    var stub = sinon.stub(myObj, 'add').returns(3);25    var result = myObj.add(1, 2);26    assert.equal(result, 3);27  });28});29var sinon = require('sinon');30var assert = require('assert');31var myObj = {32  add: function(a, b) {33    return a + b;34  }35};36describe('spy', function() {37  it('should return 3', function() {38    var spy = sinon.spy(myObj, 'add');39    var result = myObj.add(1, 2);40    assert.equal(result, 3);41    assert(spy.calledOnce);42  });43});44var sinon = require('sinon');45var assert = require('assert');46var myObj = {47  add: function(a, b) {48    return a + b;49  }50};51describe('mock', function() {52  it('should return 3', function() {53    var mock = sinon.mock(myObj);54    mock.expects('add').once().returns(3);55    var result = myObj.add(1, 2);56    assert.equal(result, 3);57    mock.verify();58  });59});60var sinon = require('sinon');61var assert = require('assert');62var myObj = {63  add: function(a, b) {64    return a + b;65  }66};67describe('fake', function() {Using AI Code Generation
1var sinon = require(‘sinon’);2var fake = sinon.fake();3fake();4expect(fake.callCount).to.equal(1);5expect(fake.called).to.be.true;6expect(fake.calledOnce).to.be.true;7expect(fake.calledTwice).to.be.false;8expect(fake.calledThrice).to.be.false;9expect(fake.calledBefore(fake)).to.be.false;10expect(fake.calledAfter(fake)).to.be.false;11expect(fake.calledOn(fake)).to.be.true;12expect(fake.calledWithNew()).to.be.false;13expect(fake.calledWithNew()).to.be.false;14expect(fake.calledWith()).to.be.false;15expect(fake.calledWith(1, 2, 3)).to.be.false;16expect(fake.calledWithExactly(1, 2, 3)).to.be.false;17expect(fake.calledWithMatch(1, 2, 3)).to.be.false;18expect(fake.calledWithMatch(1, 2, 3)).to.be.false;19expect(fake.alwaysCalledWith(1, 2, 3)).to.be.false;20expect(fake.alwaysCalledWithExactly(1, 2, 3)).to.be.false;21expect(fake.alwaysCalledWithMatch(1, 2, 3)).to.be.false;22expect(fake.neverCalledWith(1, 2, 3)).to.be.false;23expect(fake.neverCalledWithMatch(1, 2, 3)).to.be.false;24expect(fake.threw()).to.be.false;25expect(fake.threw(‘TypeError’)).to.be.false;26expect(fake.threw(‘TypeError’, ‘message’)).to.be.false;27expect(fake.returned()).to.be.false;28expect(fake.returned(‘foo’)).to.be.false;29expect(fake.firstCall).to.be.an.instanceOf(sinon.Call);30expect(fake.lastCall).to.be.an.instanceOf(sinon.Call);31expect(fake.getCall(0)).to.be.an.instanceOf(sinon.Call);32expect(fake.calledBefore(fake)).to.be.false;33expect(fake.calledAfter(fake)).to.be.false;34expect(fake.calledImmediatelyBefore(fake)).to.be.false;35expect(fake.calledImmediatelyAfter(fake)).to.be.false;36expect(fake.firstCall.calledBefore(fake)).to.be.false;37expect(fake.firstCall.calledAfter(fake)).to.be.false;38expect(fake.firstCall.calledImmediatelyBefore(fake)).to.be.false;39expect(fake.firstCall.calledImmediatelyAfter(fake)).to.be.false;40expect(fake.lastCall.calledBefore(fake)).to.beUsing AI Code Generation
1var sinon = require("sinon");2var fake = sinon.fake();3var sinon = require("sinon");4var stub = sinon.stub();5var sinon = require("sinon");6var spy = sinon.spy();7var sinon = require("sinon");8var mock = sinon.mock();9var sinon = require("sinon");10var sandbox = sinon.createSandbox();11var sinon = require("sinon");12var fake = sinon.fake();13var sinon = require("sinon");14var stub = sinon.stub();Using AI Code Generation
1sinon.stub(ajax, 'ajax').yieldsTo('success', {name: 'foo'});2sinon.stub(ajax, 'ajax').yieldsTo('error', 'error');3sinon.stub(ajax, 'ajax').yieldsTo('complete', 'complete');4sinon.stub(ajax, 'ajax').yieldsTo('progress', 'progress');5sinon.stub(ajax, 'ajax').yieldsTo('timeout', 'timeout');6sinon.stub(ajax, 'ajax').yieldsTo('abort', 'abort');7sinon.stub(ajax, 'ajax').yieldsTo('readystatechange', 'readystatechange');8sinon.stub(ajax, 'ajax').yieldsTo('load', 'load');9sinon.stub(ajax, 'ajax').yieldsTo('loadend', 'loadend');10sinon.stub(ajax, 'ajax').yieldsTo('loadstart', 'loadstart');11sinon.stub(ajax, 'ajax').yieldsTo('progress', 'progress');12sinon.stub(ajax, 'ajax').yieldsTo('timeout', 'timeout');13sinon.stub(ajax, 'ajax').yieldsTo('error', 'error');14sinon.stub(ajax, 'ajax').yieldsTo('abort', 'abort');15sinon.stub(ajax, 'ajax').yieldsTo('readystatechange', 'readystatechange');Using AI Code Generation
1var sinon = require('sinon');2var chai = require('chai');3var expect = chai.expect;4var test = require('../test.js');5describe('sinon fake', function() {6  it('should call fake function', function() {7    var fake = sinon.fake.returns('fake');8    var result = test(fake);9    expect(result).to.equal('fake');10  });11});12module.exports = function (fake) {13  return fake();14};Using AI Code Generation
1var sinon = require('sinon');2var assert = require('assert');3var fs = require('fs');4var test = require('./testmodule');5var testObj = new test();6var stub = sinon.stub(fs, 'readFile').callsFake(function (path, cb) {7    cb(null, 'hello');8});9testObj.test(function (err, data) {10    assert.equal(data, 'hello');11});12var fs = require('fs');13var Test = function () {14};15Test.prototype.test = function (cb) {16    fs.readFile('test.txt', function (err, data) {17        cb(err, data);18    });19};20module.exports = Test;Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
