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 @@
+
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();
+ });
+
+});