diff --git a/syweb/webclient/test/unit/commands-service.spec.js b/syweb/webclient/test/unit/commands-service.spec.js
new file mode 100644
index 0000000000..142044f153
--- /dev/null
+++ b/syweb/webclient/test/unit/commands-service.spec.js
@@ -0,0 +1,143 @@
+describe('CommandsService', function() {
+ var scope;
+ var roomId = "!dlwifhweu:localhost";
+
+ var testPowerLevelsEvent, testMatrixServicePromise;
+
+ var matrixService = { // these will be spyed on by jasmine, hence stub methods
+ setDisplayName: function(args){},
+ kick: function(args){},
+ ban: function(args){},
+ unban: function(args){},
+ setUserPowerLevel: function(args){}
+ };
+
+ var modelService = {
+ getRoom: function(roomId) {
+ return {
+ room_id: roomId,
+ current_room_state: {
+ events: {
+ "m.room.power_levels": testPowerLevelsEvent
+ },
+ state: function(type, key) {
+ return key ? this.events[type+key] : this.events[type];
+ }
+ }
+ };
+ }
+ };
+
+
+ // helper function for asserting promise outcomes
+ NOTHING = "[Promise]";
+ RESOLVED = "[Resolved promise]";
+ REJECTED = "[Rejected promise]";
+ var expectPromise = function(promise, expects) {
+ var value = NOTHING;
+ promise.then(function(result) {
+ value = RESOLVED;
+ }, function(fail) {
+ value = REJECTED;
+ });
+ scope.$apply();
+ expect(value).toEqual(expects);
+ };
+
+ // setup the service and mocked dependencies
+ beforeEach(function() {
+
+ // set default mock values
+ testPowerLevelsEvent = {
+ content: {
+ default: 50
+ },
+ user_id: "@foo:bar",
+ room_id: roomId
+ }
+
+ // mocked dependencies
+ module(function ($provide) {
+ $provide.value('matrixService', matrixService);
+ $provide.value('modelService', modelService);
+ });
+
+ // tested service
+ module('commandsService');
+ });
+
+ beforeEach(inject(function($rootScope, $q) {
+ scope = $rootScope;
+ testMatrixServicePromise = $q.defer();
+ }));
+
+ it('should reject a no-arg "/nick".', inject(
+ function(commandsService) {
+ var promise = commandsService.processInput(roomId, "/nick");
+ expectPromise(promise, REJECTED);
+ }));
+
+ it('should be able to set a /nick with multiple words.', inject(
+ function(commandsService) {
+ spyOn(matrixService, 'setDisplayName').and.returnValue(testMatrixServicePromise);
+ var promise = commandsService.processInput(roomId, "/nick Bob Smith");
+ expect(matrixService.setDisplayName).toHaveBeenCalledWith("Bob Smith");
+ expect(promise).toBe(testMatrixServicePromise);
+ }));
+
+ it('should be able to /kick a user without a reason.', inject(
+ function(commandsService) {
+ spyOn(matrixService, 'kick').and.returnValue(testMatrixServicePromise);
+ var promise = commandsService.processInput(roomId, "/kick @bob:matrix.org");
+ expect(matrixService.kick).toHaveBeenCalledWith(roomId, "@bob:matrix.org", undefined);
+ expect(promise).toBe(testMatrixServicePromise);
+ }));
+
+ it('should be able to /kick a user with a reason.', inject(
+ function(commandsService) {
+ spyOn(matrixService, 'kick').and.returnValue(testMatrixServicePromise);
+ var promise = commandsService.processInput(roomId, "/kick @bob:matrix.org he smells");
+ expect(matrixService.kick).toHaveBeenCalledWith(roomId, "@bob:matrix.org", "he smells");
+ expect(promise).toBe(testMatrixServicePromise);
+ }));
+
+ it('should be able to /ban a user without a reason.', inject(
+ function(commandsService) {
+ spyOn(matrixService, 'ban').and.returnValue(testMatrixServicePromise);
+ var promise = commandsService.processInput(roomId, "/ban @bob:matrix.org");
+ expect(matrixService.ban).toHaveBeenCalledWith(roomId, "@bob:matrix.org", undefined);
+ expect(promise).toBe(testMatrixServicePromise);
+ }));
+
+ it('should be able to /ban a user with a reason.', inject(
+ function(commandsService) {
+ spyOn(matrixService, 'ban').and.returnValue(testMatrixServicePromise);
+ var promise = commandsService.processInput(roomId, "/ban @bob:matrix.org he smells");
+ expect(matrixService.ban).toHaveBeenCalledWith(roomId, "@bob:matrix.org", "he smells");
+ expect(promise).toBe(testMatrixServicePromise);
+ }));
+
+ it('should be able to /unban a user.', inject(
+ function(commandsService) {
+ spyOn(matrixService, 'unban').and.returnValue(testMatrixServicePromise);
+ var promise = commandsService.processInput(roomId, "/unban @bob:matrix.org");
+ expect(matrixService.unban).toHaveBeenCalledWith(roomId, "@bob:matrix.org");
+ expect(promise).toBe(testMatrixServicePromise);
+ }));
+
+ it('should be able to /op a user.', inject(
+ function(commandsService) {
+ spyOn(matrixService, 'setUserPowerLevel').and.returnValue(testMatrixServicePromise);
+ var promise = commandsService.processInput(roomId, "/op @bob:matrix.org 50");
+ expect(matrixService.setUserPowerLevel).toHaveBeenCalledWith(roomId, "@bob:matrix.org", 50, testPowerLevelsEvent);
+ expect(promise).toBe(testMatrixServicePromise);
+ }));
+
+ it('should be able to /deop a user.', inject(
+ function(commandsService) {
+ spyOn(matrixService, 'setUserPowerLevel').and.returnValue(testMatrixServicePromise);
+ var promise = commandsService.processInput(roomId, "/deop @bob:matrix.org");
+ expect(matrixService.setUserPowerLevel).toHaveBeenCalledWith(roomId, "@bob:matrix.org", undefined, testPowerLevelsEvent);
+ expect(promise).toBe(testMatrixServicePromise);
+ }));
+});
|