diff --git a/app/app.js b/app/app.js index 154ab63..4be1c7f 100644 --- a/app/app.js +++ b/app/app.js @@ -3,7 +3,9 @@ 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 787f05d..f579e3b 100644 --- a/app/components/data-model/DataModel.js +++ b/app/components/data-model/DataModel.js @@ -20,9 +20,9 @@ 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, + messageText: 'Message #' + j + ' from User #' + i + ':smile: :cat:', messageDate : new Date() }); } @@ -32,14 +32,39 @@ 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; }; this.getMessages = function() { return self.messages; }; + this._getNextMessageId = function() { + return this.messages.length; + }; + this.postMessage = function(messageText) { + self.messages.push({ + messageId: self._getNextMessageId(), + user: self.activeUser, + messageText: messageText, + 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'}}
diff --git a/app/components/message-sender/MessageSender.js b/app/components/message-sender/MessageSender.js new file mode 100644 index 0000000..f5e37ac --- /dev/null +++ b/app/components/message-sender/MessageSender.js @@ -0,0 +1,27 @@ +(function () { + 'use strict'; + + 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() { + DataModelService.postMessage($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..7338aef --- /dev/null +++ b/app/components/message-sender/message-sender-template.html @@ -0,0 +1,9 @@ +
+
+

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 db4c30a..ba08e20 100644 --- a/app/templates/chat/messages.html +++ b/app/templates/chat/messages.html @@ -7,4 +7,8 @@ + + + + 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 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(); + }); + +});