From 855af3b9bac71c839f9566b6d5b7a9dc275eade6 Mon Sep 17 00:00:00 2001 From: jz Date: Sat, 17 Jan 2015 21:50:55 +0400 Subject: [PATCH 1/5] MessageSender directive --- app/app.js | 1 + app/components/data-model/DataModel.js | 13 ++++++++- .../message-sender/MessageSender.js | 28 +++++++++++++++++++ .../message-sender-template.html | 9 ++++++ app/templates/chat/messages.html | 2 ++ 5 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 app/components/message-sender/MessageSender.js create mode 100644 app/components/message-sender/message-sender-template.html diff --git a/app/app.js b/app/app.js index 154ab63..e08000f 100644 --- a/app/app.js +++ b/app/app.js @@ -4,6 +4,7 @@ "ngRoute", "chatApp.DataModel", "chatApp.UserList", + "chatApp.MessageSender", "chatApp.MessageList" ]); diff --git a/app/components/data-model/DataModel.js b/app/components/data-model/DataModel.js index 787f05d..b251122 100644 --- a/app/components/data-model/DataModel.js +++ b/app/components/data-model/DataModel.js @@ -20,7 +20,7 @@ var user = users[i]; for (var j = 0; j < 10; j++) { messages.push({ - messageId: i * 100 + j, + messageId: messages.length, user: user, messageText: 'Message #' + j + ' from User #' + i, messageDate : new Date() @@ -40,6 +40,17 @@ this.getMessages = function() { return self.messages; }; + this._getNextMessageId = function() { + return this.messages.length; + }; + this.postMessage = function(user, messageText) { + self.messages.push({ + messageId: self._getNextMessageId(), + user: user, + messageText: messageText, + messageDate : new Date() + }); + }; }); })(); diff --git a/app/components/message-sender/MessageSender.js b/app/components/message-sender/MessageSender.js new file mode 100644 index 0000000..2aef744 --- /dev/null +++ b/app/components/message-sender/MessageSender.js @@ -0,0 +1,28 @@ +(function () { + 'use strict'; + + var module = angular.module('chatApp.MessageSender', ['chatApp.DataModel']); + + module.controller('MessageSenderController', function($scope, DataModelService) { + $scope.messageText = ''; + $scope.postMessage = function() { + var activeUser = { + userId: -100, + userName: 'Active User' + }; + DataModelService.postMessage(activeUser, $scope.messageText); + $scope.messageText = ''; + }; + } + ); + + module.directive('messagesender', [function() { + var directive = {}; + directive.restrict = 'E'; + directive.templateUrl = 'components/message-sender/message-sender-template.html'; + directive.controller = 'MessageSenderController'; + directive.controllerAs = 'messagesenderCtrl'; + return directive; + }]); + +})(); diff --git a/app/components/message-sender/message-sender-template.html b/app/components/message-sender/message-sender-template.html new file mode 100644 index 0000000..ab01da5 --- /dev/null +++ b/app/components/message-sender/message-sender-template.html @@ -0,0 +1,9 @@ +
+
+

New Message

+
+ + +
+
+
diff --git a/app/templates/chat/messages.html b/app/templates/chat/messages.html index db4c30a..622c037 100644 --- a/app/templates/chat/messages.html +++ b/app/templates/chat/messages.html @@ -7,4 +7,6 @@ + + From 31743a3bc1deb21aa4baccedb31560fee7b2f8b1 Mon Sep 17 00:00:00 2001 From: jz Date: Mon, 19 Jan 2015 02:45:35 +0400 Subject: [PATCH 2/5] Login directive --- app/app.js | 1 + app/components/data-model/DataModel.js | 18 ++++++++++-- .../message-sender/MessageSender.js | 9 +++--- .../message-sender-template.html | 4 +-- app/components/user-session/UserSession.js | 29 +++++++++++++++++++ .../user-session/login-template.html | 12 ++++++++ app/templates/chat/messages.html | 2 ++ 7 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 app/components/user-session/UserSession.js create mode 100644 app/components/user-session/login-template.html diff --git a/app/app.js b/app/app.js index e08000f..4be1c7f 100644 --- a/app/app.js +++ b/app/app.js @@ -3,6 +3,7 @@ angular.module("app", [ "ngRoute", "chatApp.DataModel", + "chatApp.UserSession", "chatApp.UserList", "chatApp.MessageSender", "chatApp.MessageList" diff --git a/app/components/data-model/DataModel.js b/app/components/data-model/DataModel.js index b251122..4211f54 100644 --- a/app/components/data-model/DataModel.js +++ b/app/components/data-model/DataModel.js @@ -32,8 +32,22 @@ module.service('DataModelService', function() { var self = this; + this.activeUser = null; this.users = generateUsers(); this.messages = generateMessages(this.users); + this.isLoggedIn = function() { + return (self.activeUser !== null); + }; + this.getActiveUser = function() { + return self.activeUser; + }; + this.setActiveUser = function(userName, password) { + self.activeUser = { + userId: self.users.length, + userName: userName + }; + self.users.push(self.activeUser); + }; this.getUsers = function() { return self.users; }; @@ -43,10 +57,10 @@ this._getNextMessageId = function() { return this.messages.length; }; - this.postMessage = function(user, messageText) { + this.postMessage = function(messageText) { self.messages.push({ messageId: self._getNextMessageId(), - user: user, + user: self.activeUser, messageText: messageText, messageDate : new Date() }); diff --git a/app/components/message-sender/MessageSender.js b/app/components/message-sender/MessageSender.js index 2aef744..f5e37ac 100644 --- a/app/components/message-sender/MessageSender.js +++ b/app/components/message-sender/MessageSender.js @@ -4,13 +4,12 @@ var module = angular.module('chatApp.MessageSender', ['chatApp.DataModel']); module.controller('MessageSenderController', function($scope, DataModelService) { + $scope.isLoggedIn = function() { + return DataModelService.isLoggedIn(); + }; $scope.messageText = ''; $scope.postMessage = function() { - var activeUser = { - userId: -100, - userName: 'Active User' - }; - DataModelService.postMessage(activeUser, $scope.messageText); + DataModelService.postMessage($scope.messageText); $scope.messageText = ''; }; } diff --git a/app/components/message-sender/message-sender-template.html b/app/components/message-sender/message-sender-template.html index ab01da5..7338aef 100644 --- a/app/components/message-sender/message-sender-template.html +++ b/app/components/message-sender/message-sender-template.html @@ -1,7 +1,7 @@ -
+

New Message

-
+
diff --git a/app/components/user-session/UserSession.js b/app/components/user-session/UserSession.js new file mode 100644 index 0000000..0410c33 --- /dev/null +++ b/app/components/user-session/UserSession.js @@ -0,0 +1,29 @@ +(function () { + 'use strict'; + + var module = angular.module('chatApp.UserSession', ['chatApp.DataModel']); + + module.controller('LoginController', function($scope, DataModelService) { + $scope.isLoggedIn = function() { + return DataModelService.isLoggedIn(); + }; + $scope.userName = ''; + $scope.password = ''; + $scope.login = function() { + DataModelService.setActiveUser($scope.userName, $scope.password); + $scope.userName = ''; + $scope.password = ''; + }; + } + ); + + module.directive('login', [function() { + var directive = {}; + directive.restrict = 'E'; + directive.templateUrl = 'components/user-session/login-template.html'; + directive.controller = 'LoginController'; + directive.controllerAs = 'loginCtrl'; + return directive; + }]); + +})(); diff --git a/app/components/user-session/login-template.html b/app/components/user-session/login-template.html new file mode 100644 index 0000000..6b21b49 --- /dev/null +++ b/app/components/user-session/login-template.html @@ -0,0 +1,12 @@ +
+

Log In for leaving new messages

+
+ + +
+ + +
+ +
+
diff --git a/app/templates/chat/messages.html b/app/templates/chat/messages.html index 622c037..ba08e20 100644 --- a/app/templates/chat/messages.html +++ b/app/templates/chat/messages.html @@ -8,5 +8,7 @@ + +
From e4ae7c4bcd3875354283d6fed7afcad0bfb609ae Mon Sep 17 00:00:00 2001 From: jz Date: Mon, 19 Jan 2015 03:33:36 +0400 Subject: [PATCH 3/5] Emoji filter attaching --- app/components/data-model/DataModel.js | 2 +- app/components/message-list/MessageList.js | 2 +- app/components/message-list/message-list-template.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/components/data-model/DataModel.js b/app/components/data-model/DataModel.js index 4211f54..f579e3b 100644 --- a/app/components/data-model/DataModel.js +++ b/app/components/data-model/DataModel.js @@ -22,7 +22,7 @@ messages.push({ messageId: messages.length, user: user, - messageText: 'Message #' + j + ' from User #' + i, + messageText: 'Message #' + j + ' from User #' + i + ':smile: :cat:', messageDate : new Date() }); } diff --git a/app/components/message-list/MessageList.js b/app/components/message-list/MessageList.js index e056ff7..daf3eaa 100644 --- a/app/components/message-list/MessageList.js +++ b/app/components/message-list/MessageList.js @@ -1,7 +1,7 @@ (function () { 'use strict'; - var module = angular.module('chatApp.MessageList', ['chatApp.DataModel']); + var module = angular.module('chatApp.MessageList', ['chatApp.DataModel', 'dbaq.emoji', 'ngSanitize']); module.controller('MessagesController', function($scope, DataModelService) { $scope.messageList = 'List of Messages'; diff --git a/app/components/message-list/message-list-template.html b/app/components/message-list/message-list-template.html index e56615d..4724596 100644 --- a/app/components/message-list/message-list-template.html +++ b/app/components/message-list/message-list-template.html @@ -1,7 +1,7 @@
{{message.user.userName}} - ({{message.user.userId}})
-
{{message.messageText}}
+
{{message.messageDate | date: 'shortTime'}}
From 990f44c9a11256451fab0d18ce41c3d21114d79e Mon Sep 17 00:00:00 2001 From: jz Date: Tue, 20 Jan 2015 02:54:34 +0400 Subject: [PATCH 4/5] Tests for controllers --- specs/LoginControllerSpec.js | 51 ++++++++++++++++++++++++++++ specs/MessageSenderControllerSoec.js | 48 ++++++++++++++++++++++++++ specs/MessagesControllerSpec.js | 25 ++++++++++++++ specs/UsersControllerSpc.js | 24 +++++++++++++ 4 files changed, 148 insertions(+) create mode 100644 specs/LoginControllerSpec.js create mode 100644 specs/MessageSenderControllerSoec.js create mode 100644 specs/MessagesControllerSpec.js create mode 100644 specs/UsersControllerSpc.js diff --git a/specs/LoginControllerSpec.js b/specs/LoginControllerSpec.js new file mode 100644 index 0000000..0d53200 --- /dev/null +++ b/specs/LoginControllerSpec.js @@ -0,0 +1,51 @@ +describe("login controller", function () { + var sut, mockDataModelService; + + var USER_NAME = 'USER_NAME'; + var PASSWORD = 'PASSWORD'; + + beforeEach(function () { + module("chatApp.UserSession"); + + mockDataModelService = { + isLoggedIn: jasmine.createSpy(), + setActiveUser: jasmine.createSpy() + }; + }); + + beforeEach(inject(function ($controller, $rootScope) { + sut = $rootScope.$new(); + $controller("LoginController", { + $scope: sut, + DataModelService: mockDataModelService + }); + })); + + describe('isLoggedIn function',function() { + beforeEach(function() { + sut.isLoggedIn(); + }); + + it("should call DataModelService isLoggedIn function", function () { + expect(mockDataModelService.isLoggedIn).toHaveBeenCalled(); + }); + }); + + describe('login function',function() { + beforeEach(function() { + sut.userName = USER_NAME; + sut.password = PASSWORD; + sut.login(); + }); + + it("should call DataModelService setActiveUser function", function () { + expect(mockDataModelService.setActiveUser).toHaveBeenCalledWith(USER_NAME, PASSWORD); + }); + + afterEach(function() { + expect(sut.userName).toEqual(''); + expect(sut.password).toEqual(''); + }); + }); + +}); diff --git a/specs/MessageSenderControllerSoec.js b/specs/MessageSenderControllerSoec.js new file mode 100644 index 0000000..c3af52d --- /dev/null +++ b/specs/MessageSenderControllerSoec.js @@ -0,0 +1,48 @@ +describe("message sender controller", function () { + var sut, mockDataModelService; + + var MESSAGE_TEXT = 'MESSAGE-TEXT'; + + beforeEach(function () { + module("chatApp.MessageSender"); + + mockDataModelService = { + isLoggedIn: jasmine.createSpy(), + postMessage: jasmine.createSpy() + }; + }); + + beforeEach(inject(function ($controller, $rootScope) { + sut = $rootScope.$new(); + $controller("MessageSenderController", { + $scope: sut, + DataModelService: mockDataModelService + }); + })); + + describe('isLoggedIn function',function() { + beforeEach(function() { + sut.isLoggedIn(); + }); + + it("should call DataModelService isLoggedIn function", function () { + expect(mockDataModelService.isLoggedIn).toHaveBeenCalled(); + }); + }); + + describe('postMessage function',function() { + beforeEach(function() { + sut.messageText = MESSAGE_TEXT; + sut.postMessage(); + }); + + it("should call DataModelService postMessage function", function () { + expect(mockDataModelService.postMessage).toHaveBeenCalledWith(MESSAGE_TEXT); + }); + + afterEach(function() { + expect(sut.messageText).toEqual(''); + }); + }); + +}); diff --git a/specs/MessagesControllerSpec.js b/specs/MessagesControllerSpec.js new file mode 100644 index 0000000..8bd96e6 --- /dev/null +++ b/specs/MessagesControllerSpec.js @@ -0,0 +1,25 @@ +describe("messages controller", function () { + var sut, mockDataModelService; + + beforeEach(function () { + module("chatApp.MessageList"); + + mockDataModelService = { + getMessages: jasmine.createSpy() + }; + }); + + beforeEach(inject(function ($controller, $rootScope) { + sut = $rootScope.$new(); + $controller("MessagesController", { + $scope: sut, + DataModelService: mockDataModelService + }); + })); + + it("should call DataModelService getMessages function", function () { + expect(mockDataModelService.getMessages).toHaveBeenCalled(); + }); + +}); + diff --git a/specs/UsersControllerSpc.js b/specs/UsersControllerSpc.js new file mode 100644 index 0000000..8cd08c0 --- /dev/null +++ b/specs/UsersControllerSpc.js @@ -0,0 +1,24 @@ +describe("users controller", function () { + var sut, mockDataModelService; + + beforeEach(function () { + module("chatApp.UserList"); + + mockDataModelService = { + getUsers: jasmine.createSpy() + }; + }); + + beforeEach(inject(function ($controller, $rootScope) { + sut = $rootScope.$new(); + $controller("UsersController", { + $scope: sut, + DataModelService: mockDataModelService + }); + })); + + it("should call DataModelService getUsers function", function () { + expect(mockDataModelService.getUsers).toHaveBeenCalled(); + }); + +}); From f53b179ea5702d4e7da1c53f02db3b6804ea3bb5 Mon Sep 17 00:00:00 2001 From: jz Date: Tue, 20 Jan 2015 03:10:48 +0400 Subject: [PATCH 5/5] DataModelService test --- specs/DataModelServiceSpec.js | 73 +++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 specs/DataModelServiceSpec.js diff --git a/specs/DataModelServiceSpec.js b/specs/DataModelServiceSpec.js new file mode 100644 index 0000000..1d9368e --- /dev/null +++ b/specs/DataModelServiceSpec.js @@ -0,0 +1,73 @@ +describe("data model service", function () { + var sut; + + var ACTIVE_USER_NAME = 'ACTIVE_USER_NAME'; + var MESSAGE_TEXT = 'MESSAGE_TEXT'; + + beforeEach(function () { + module("chatApp.DataModel"); + }); + + beforeEach(inject(function (DataModelService) { + sut = DataModelService; + })); + + it("will return 100 users", function () { + expect(sut.getUsers().length).toBe(100); + }); + + it("will return 1000 messages", function () { + expect(sut.getMessages().length).toBe(1000); + }); + + it("will be not logged in", function () { + expect(sut.isLoggedIn()).toBe(false); + }); + + it("won't have an active user", function () { + expect(sut.getActiveUser()).toBe(null); + }); + + describe('setActiveUser function', function() { + beforeEach(function() { + sut.setActiveUser(ACTIVE_USER_NAME); + }); + + it("should be logged in", function() { + expect(sut.isLoggedIn()).toBe(true); + }); + + it("active user must be set", function() { + //expect(sut.getActiveUser()).toBeNot(null); + }); + + it("active user name must be valid", function() { + expect(sut.getActiveUser().userName).toBe(ACTIVE_USER_NAME); + }); + + it("will return 100+1 users", function () { + expect(sut.getUsers().length).toBe(101); + }); + + }); + + describe('postMessage function', function() { + beforeEach(function() { + sut.setActiveUser(ACTIVE_USER_NAME); + sut.postMessage(MESSAGE_TEXT); + }); + + it("will return 1000+1 messages", function () { + expect(sut.getMessages().length).toBe(1001); + }); + + it("last message text must be known", function () { + expect(sut.getMessages()[sut.getMessages().length - 1].messageText).toBe(MESSAGE_TEXT); + }); + + it("last message user's name must be active user's", function () { + expect(sut.getMessages()[sut.getMessages().length - 1].user.userName).toBe(ACTIVE_USER_NAME); + }); + + }); +}); \ No newline at end of file