public void Can_Get_Members_With_Statistics_For_Organization()
        {
            // Setup
            var org   = new Organization();
            var user1 = new User
            {
                Organization         = org,
                FullName             = "name 1",
                Email                = "email 1",
                LastVisitedJobSearch = new JobSearch
                {
                    Metrics = new JobSearchMetrics
                    {
                        NumApplyTasksCompleted           = 1,
                        NumApplyTasksCreated             = 2,
                        NumCompaniesCreated              = 3,
                        NumContactsCreated               = 4,
                        NumInPersonInterviewTasksCreated = 5,
                        NumPhoneInterviewTasksCreated    = 6
                    }
                }
            };

            var user2 = new User
            {
                Organization         = org,
                FullName             = "name 2",
                Email                = "email 2",
                LastVisitedJobSearch = new JobSearch
                {
                    Metrics = new JobSearchMetrics
                    {
                        NumApplyTasksCompleted           = 7,
                        NumApplyTasksCreated             = 8,
                        NumCompaniesCreated              = 9,
                        NumContactsCreated               = 10,
                        NumInPersonInterviewTasksCreated = 11,
                        NumPhoneInterviewTasksCreated    = 12
                    }
                }
            };

            _context.Users.Add(user1);
            _context.Users.Add(user2);
            _context.SaveChanges();

            var authMock = new Mock <IProcess <OrganizationAdminAuthorizationParams, AuthorizationResultViewModel> >();

            authMock.Setup(x => x.Execute(It.IsAny <OrganizationAdminAuthorizationParams>())).Returns(new AuthorizationResultViewModel {
                UserAuthorized = true
            });

            IProcess <OrganizationMemberStatisticsParams, OrganizationMemberStatisticsViewModel> process = new OrganizationMetricQueryProcesses(_context, authMock.Object);

            // Act
            var result = process.Execute(new OrganizationMemberStatisticsParams {
                OrganizationId = org.Id
            });

            // Verify
            Assert.IsNotNull(result, "Process returned a null result");
            Assert.IsNotNull(result.MemberStats, "Resulting member list was null");
            Assert.AreEqual(2, result.MemberStats.Count, "Member list had an incorrect number of elements");
            Assert.IsTrue(result.MemberStats.Any(x => x.Id == user1.Id), "Member list did not contain the first user");
            Assert.IsTrue(result.MemberStats.Any(x => x.Id == user2.Id), "Member list did not contain the second user");
            Assert.AreEqual(org.Id, result.OrganizationId, "Organization Id was incorrect");

            var firstUser = result.MemberStats.Where(x => x.Id == user1.Id).Single();
            var metrics1  = user1.LastVisitedJobSearch.Metrics;

            Assert.AreEqual(user1.FullName, firstUser.FullName, "First user's full name was incorrect");
            Assert.AreEqual(user1.Email, firstUser.Email, "First user's email was incorrect");
            Assert.AreEqual(metrics1.NumApplyTasksCompleted, firstUser.Metrics.NumApplyTasksCompleted, "First user's number of apply tasks completed was incorrect");
            Assert.AreEqual(metrics1.NumApplyTasksCreated, firstUser.Metrics.NumApplyTasksCreated, "First user's number of apply tasks created was incorrect");
            Assert.AreEqual(metrics1.NumCompaniesCreated, firstUser.Metrics.NumCompaniesCreated, "First user's number of companies was incorrect");
            Assert.AreEqual(metrics1.NumContactsCreated, firstUser.Metrics.NumContactsCreated, "First user's number of contacts was incorrect");
            Assert.AreEqual(metrics1.NumInPersonInterviewTasksCreated, firstUser.Metrics.NumInPersonInterviewTasksCreated, "First user's number in person interview tasks was incorrect");
            Assert.AreEqual(metrics1.NumPhoneInterviewTasksCreated, firstUser.Metrics.NumPhoneInterviewTasksCreated, "First user's number of phone interview tasks was incorrect");

            var secondUser = result.MemberStats.Where(x => x.Id == user2.Id).Single();
            var metrics2   = user2.LastVisitedJobSearch.Metrics;

            Assert.AreEqual(user2.FullName, secondUser.FullName, "First user's full name was incorrect");
            Assert.AreEqual(user2.Email, secondUser.Email, "First user's email was incorrect");
            Assert.AreEqual(metrics2.NumApplyTasksCompleted, secondUser.Metrics.NumApplyTasksCompleted, "First user's number of apply tasks completed was incorrect");
            Assert.AreEqual(metrics2.NumApplyTasksCreated, secondUser.Metrics.NumApplyTasksCreated, "First user's number of apply tasks created was incorrect");
            Assert.AreEqual(metrics2.NumCompaniesCreated, secondUser.Metrics.NumCompaniesCreated, "First user's number of companies was incorrect");
            Assert.AreEqual(metrics2.NumContactsCreated, secondUser.Metrics.NumContactsCreated, "First user's number of contacts was incorrect");
            Assert.AreEqual(metrics2.NumInPersonInterviewTasksCreated, secondUser.Metrics.NumInPersonInterviewTasksCreated, "First user's number in person interview tasks was incorrect");
            Assert.AreEqual(metrics2.NumPhoneInterviewTasksCreated, secondUser.Metrics.NumPhoneInterviewTasksCreated, "First user's number of phone interview tasks was incorrect");
        }
        public void Throws_UserNotAuthorizedForEntityException_If_Not_Organization_Admin()
        {
            // Setup
            var org  = new Organization();
            var user = new User {
                Organization = org
            };

            _context.Users.Add(user);
            _context.SaveChanges();

            var authMock = new Mock <IProcess <OrganizationAdminAuthorizationParams, AuthorizationResultViewModel> >();

            authMock.Setup(x => x.Execute(It.IsAny <OrganizationAdminAuthorizationParams>())).Returns(new AuthorizationResultViewModel {
                UserAuthorized = false
            });
            IProcess <OrganizationMemberStatisticsParams, OrganizationMemberStatisticsViewModel> process = new OrganizationMetricQueryProcesses(_context, authMock.Object);

            // Act
            try
            {
                process.Execute(new OrganizationMemberStatisticsParams {
                    OrganizationId = org.Id, RequestingUserId = user.Id
                });
                Assert.Fail("No exception was thrown");
            }

            // Verify
            catch (UserNotAuthorizedForEntityException ex)
            {
                Assert.AreEqual(typeof(Organization), ex.EntityType, "Exception's entity type was incorrect");
                Assert.AreEqual(org.Id, ex.IdValue, "Exception's id value was incorrect");
                Assert.AreEqual(user.Id, ex.UserId, "Exception's user id value was incorrect");
            }
        }
        public void Calls_Auth_Process_With_Correct_OrgId_and_UserId()
        {
            // Setup
            var authMock = new Mock <IProcess <OrganizationAdminAuthorizationParams, AuthorizationResultViewModel> >();

            authMock.Setup(x => x.Execute(It.IsAny <OrganizationAdminAuthorizationParams>())).Returns(new AuthorizationResultViewModel {
                UserAuthorized = true
            });
            IProcess <OrganizationMemberStatisticsParams, OrganizationMemberStatisticsViewModel> process = new OrganizationMetricQueryProcesses(_context, authMock.Object);

            // Act
            process.Execute(new OrganizationMemberStatisticsParams {
                OrganizationId = 12, RequestingUserId = 13
            });

            // Verify
            authMock.Verify(x => x.Execute(It.Is <OrganizationAdminAuthorizationParams>(y => y.UserId == 13 && y.OrganizationId == 12)), Times.Once());
        }
        public void Does_Not_Retrieve_Members_Of_Different_Organization()
        {
            // Setup
            var org1 = new Organization();
            var org2 = new Organization();
            var user = new User {
                Organization = org2
            };

            _context.Users.Add(user);
            _context.Organizations.Add(org1);
            _context.SaveChanges();

            var authMock = new Mock <IProcess <OrganizationAdminAuthorizationParams, AuthorizationResultViewModel> >();

            authMock.Setup(x => x.Execute(It.IsAny <OrganizationAdminAuthorizationParams>())).Returns(new AuthorizationResultViewModel {
                UserAuthorized = true
            });

            IProcess <OrganizationMemberStatisticsParams, OrganizationMemberStatisticsViewModel> process = new OrganizationMetricQueryProcesses(_context, authMock.Object);

            // Act
            var result = process.Execute(new OrganizationMemberStatisticsParams {
                OrganizationId = org1.Id
            });

            // Verify
            Assert.IsNotNull(result, "Process returned a null result");
            Assert.IsNotNull(result.MemberStats, "Process retured a null member list");
            Assert.AreEqual(0, result.MemberStats.Count, "Member list had an incorrect number of elements");
        }
        public void Can_Get_Members_With_Statistics_For_Organization()
        {
            // Setup
            var org = new Organization();
            var user1 = new User
            {
                Organization = org,
                FullName = "name 1",
                Email = "email 1",
                LastVisitedJobSearch = new JobSearch
                {
                    Metrics = new JobSearchMetrics
                    {
                        NumApplyTasksCompleted = 1,
                        NumApplyTasksCreated = 2,
                        NumCompaniesCreated = 3,
                        NumContactsCreated = 4,
                        NumInPersonInterviewTasksCreated = 5,
                        NumPhoneInterviewTasksCreated = 6
                    }
                }
            };

            var user2 = new User
            {
                Organization = org,
                FullName = "name 2",
                Email = "email 2",
                LastVisitedJobSearch = new JobSearch
                {
                    Metrics = new JobSearchMetrics
                    {
                        NumApplyTasksCompleted = 7,
                        NumApplyTasksCreated = 8,
                        NumCompaniesCreated = 9,
                        NumContactsCreated = 10,
                        NumInPersonInterviewTasksCreated = 11,
                        NumPhoneInterviewTasksCreated = 12
                    }
                }
            };

            _context.Users.Add(user1);
            _context.Users.Add(user2);
            _context.SaveChanges();

            var authMock = new Mock<IProcess<OrganizationAdminAuthorizationParams, AuthorizationResultViewModel>>();
            authMock.Setup(x => x.Execute(It.IsAny<OrganizationAdminAuthorizationParams>())).Returns(new AuthorizationResultViewModel { UserAuthorized = true });

            IProcess<OrganizationMemberStatisticsParams, OrganizationMemberStatisticsViewModel> process = new OrganizationMetricQueryProcesses(_context, authMock.Object);

            // Act
            var result = process.Execute(new OrganizationMemberStatisticsParams { OrganizationId = org.Id });

            // Verify
            Assert.IsNotNull(result, "Process returned a null result");
            Assert.IsNotNull(result.MemberStats, "Resulting member list was null");
            Assert.AreEqual(2, result.MemberStats.Count, "Member list had an incorrect number of elements");
            Assert.IsTrue(result.MemberStats.Any(x => x.Id == user1.Id), "Member list did not contain the first user");
            Assert.IsTrue(result.MemberStats.Any(x => x.Id == user2.Id), "Member list did not contain the second user");
            Assert.AreEqual(org.Id, result.OrganizationId, "Organization Id was incorrect");

            var firstUser = result.MemberStats.Where(x => x.Id == user1.Id).Single();
            var metrics1 = user1.LastVisitedJobSearch.Metrics;
            Assert.AreEqual(user1.FullName, firstUser.FullName, "First user's full name was incorrect");
            Assert.AreEqual(user1.Email, firstUser.Email, "First user's email was incorrect");
            Assert.AreEqual(metrics1.NumApplyTasksCompleted, firstUser.Metrics.NumApplyTasksCompleted, "First user's number of apply tasks completed was incorrect");
            Assert.AreEqual(metrics1.NumApplyTasksCreated, firstUser.Metrics.NumApplyTasksCreated, "First user's number of apply tasks created was incorrect");
            Assert.AreEqual(metrics1.NumCompaniesCreated, firstUser.Metrics.NumCompaniesCreated, "First user's number of companies was incorrect");
            Assert.AreEqual(metrics1.NumContactsCreated, firstUser.Metrics.NumContactsCreated, "First user's number of contacts was incorrect");
            Assert.AreEqual(metrics1.NumInPersonInterviewTasksCreated, firstUser.Metrics.NumInPersonInterviewTasksCreated, "First user's number in person interview tasks was incorrect");
            Assert.AreEqual(metrics1.NumPhoneInterviewTasksCreated, firstUser.Metrics.NumPhoneInterviewTasksCreated, "First user's number of phone interview tasks was incorrect");

            var secondUser = result.MemberStats.Where(x => x.Id == user2.Id).Single();
            var metrics2 = user2.LastVisitedJobSearch.Metrics;
            Assert.AreEqual(user2.FullName, secondUser.FullName, "First user's full name was incorrect");
            Assert.AreEqual(user2.Email, secondUser.Email, "First user's email was incorrect");
            Assert.AreEqual(metrics2.NumApplyTasksCompleted, secondUser.Metrics.NumApplyTasksCompleted, "First user's number of apply tasks completed was incorrect");
            Assert.AreEqual(metrics2.NumApplyTasksCreated, secondUser.Metrics.NumApplyTasksCreated, "First user's number of apply tasks created was incorrect");
            Assert.AreEqual(metrics2.NumCompaniesCreated, secondUser.Metrics.NumCompaniesCreated, "First user's number of companies was incorrect");
            Assert.AreEqual(metrics2.NumContactsCreated, secondUser.Metrics.NumContactsCreated, "First user's number of contacts was incorrect");
            Assert.AreEqual(metrics2.NumInPersonInterviewTasksCreated, secondUser.Metrics.NumInPersonInterviewTasksCreated, "First user's number in person interview tasks was incorrect");
            Assert.AreEqual(metrics2.NumPhoneInterviewTasksCreated, secondUser.Metrics.NumPhoneInterviewTasksCreated, "First user's number of phone interview tasks was incorrect");
        }
        public void Calls_Auth_Process_With_Correct_OrgId_and_UserId()
        {
            // Setup
            var authMock = new Mock<IProcess<OrganizationAdminAuthorizationParams, AuthorizationResultViewModel>>();
            authMock.Setup(x => x.Execute(It.IsAny<OrganizationAdminAuthorizationParams>())).Returns(new AuthorizationResultViewModel { UserAuthorized = true });
            IProcess<OrganizationMemberStatisticsParams, OrganizationMemberStatisticsViewModel> process = new OrganizationMetricQueryProcesses(_context, authMock.Object);

            // Act
            process.Execute(new OrganizationMemberStatisticsParams { OrganizationId = 12, RequestingUserId = 13 });

            // Verify
            authMock.Verify(x => x.Execute(It.Is<OrganizationAdminAuthorizationParams>(y => y.UserId == 13 && y.OrganizationId == 12)), Times.Once());
        }
        public void Throws_UserNotAuthorizedForEntityException_If_Not_Organization_Admin()
        {
            // Setup
            var org = new Organization();
            var user = new User { Organization = org };
            _context.Users.Add(user);
            _context.SaveChanges();

            var authMock = new Mock<IProcess<OrganizationAdminAuthorizationParams, AuthorizationResultViewModel>>();
            authMock.Setup(x => x.Execute(It.IsAny<OrganizationAdminAuthorizationParams>())).Returns(new AuthorizationResultViewModel { UserAuthorized = false });
            IProcess<OrganizationMemberStatisticsParams, OrganizationMemberStatisticsViewModel> process = new OrganizationMetricQueryProcesses(_context, authMock.Object);

            // Act
            try
            {
                process.Execute(new OrganizationMemberStatisticsParams { OrganizationId = org.Id, RequestingUserId = user.Id });
                Assert.Fail("No exception was thrown");
            }

            // Verify
            catch (UserNotAuthorizedForEntityException ex)
            {
                Assert.AreEqual(typeof(Organization), ex.EntityType, "Exception's entity type was incorrect");
                Assert.AreEqual(org.Id, ex.IdValue, "Exception's id value was incorrect");
                Assert.AreEqual(user.Id, ex.UserId, "Exception's user id value was incorrect");
            }
        }
        public void Does_Not_Retrieve_Members_Of_Different_Organization()
        {
            // Setup 
            var org1 = new Organization();
            var org2 = new Organization();
            var user = new User { Organization = org2 };

            _context.Users.Add(user);
            _context.Organizations.Add(org1);
            _context.SaveChanges();

            var authMock = new Mock<IProcess<OrganizationAdminAuthorizationParams, AuthorizationResultViewModel>>();
            authMock.Setup(x => x.Execute(It.IsAny<OrganizationAdminAuthorizationParams>())).Returns(new AuthorizationResultViewModel { UserAuthorized = true });

            IProcess<OrganizationMemberStatisticsParams, OrganizationMemberStatisticsViewModel> process = new OrganizationMetricQueryProcesses(_context, authMock.Object);

            // Act
            var result = process.Execute(new OrganizationMemberStatisticsParams { OrganizationId = org1.Id });

            // Verify
            Assert.IsNotNull(result, "Process returned a null result");
            Assert.IsNotNull(result.MemberStats, "Process retured a null member list");
            Assert.AreEqual(0, result.MemberStats.Count, "Member list had an incorrect number of elements");
        }