Пример #1
0
        public async Task NoContent_Active()
        {
            var usersClientMock = new Mock <IUsersClient>();

            usersClientMock.Setup(x => x.GetUserByEmailAsync(It.IsAny <string>())).ReturnsAsync(new UserInfo
            {
                UserId = 1
            });
            Services.AddSingleton(usersClientMock.Object);
            var db = AddDbContext();
            var originalInvitation = new CompanyInvitation {
                Status = InvitationStatus.Pending
            }.SetStringProperties();

            originalInvitation.Permissions = "0";
            db.Add(originalInvitation);
            db.SaveChanges();
            var controller = GetController();
            var result     = await controller.Respond(originalInvitation.Token, true);

            Assert.IsType <NoContentResult>(result);
            db = Db;
            var companyUser = db.CompanyUsers.Single();

            Assert.Equal(1, companyUser.UserId);
            Assert.False(db.CompanyInvitations.Any());
        }
        public async Task <IActionResult> Invite(int companyId, string responseUrl, [FromBody] CompanyInvitationRequest request)
        {
            if (await db.CompanyInvitations.AnyAsync(x => x.CompanyId == companyId && x.Email == request.Email))
            {
                return(this.BadRequest(nameof(CompanyInvitation.Email), "An invitation has already been sent to this email."));
            }
            var invitation = new CompanyInvitation();

            invitation.Token       = Guid.NewGuid();
            invitation.CompanyId   = companyId;
            invitation.Email       = request.Email;
            invitation.Status      = InvitationStatus.Pending;
            invitation.Permissions = string.Join(",", request.Permissions);
            db.Add(invitation);
            await db.SaveChangesAsync();

            var companyName = await db.Companies
                              .Where(x => x.CompanyId == companyId)
                              .Select(x => x.Name)
                              .SingleAsync();

            await emailingClient.SendAsync(new EmailRequest
            {
                Data = new Dictionary <string, string>
                {
                    ["CompanyName"] = companyName,
                    ["ResponseUrl"] = string.Format(WebUtility.UrlDecode(responseUrl), invitation.Token)
                },
                Subject     = "Company Invitation",
                TemplateKey = "CompanyInvitation",
                To          = request.Email
            });

            var responseUri = new Uri(string.Format(WebUtility.UrlDecode(responseUrl), invitation.Token));
            var user        = await usersClient.GetUserByEmailAsync(request.Email);

            if (user != null)
            {
                await notificationsClient.NotifyAsync(user.UserId, new NotifyRequest
                {
                    RedirectPath = responseUri.PathAndQuery,
                    Subject      = $"Company Invitation",
                    Body         = $"You have been invited to to join the company <strong>{companyName}</strong>."
                });
            }

            return(NoContent());
        }
Пример #3
0
        public async Task Forbid()
        {
            var db = AddDbContext();

            db.Add(new CompanyUser {
                CompanyId = 1, UserId = 1
            });
            var originalInvitation = new CompanyInvitation {
                Status = InvitationStatus.Pending
            }.SetStringProperties();

            db.Add(originalInvitation);
            db.SaveChanges();
            var controller = GetController(1);
            var result     = await controller.Delete(originalInvitation.Token);

            Assert.IsType <ForbidResult>(result);
        }
Пример #4
0
        public async Task NoContent_Rejected()
        {
            var db = AddDbContext();
            var originalInvitation = new CompanyInvitation {
                Status = InvitationStatus.Pending
            }.SetStringProperties();

            db.Add(originalInvitation);
            db.SaveChanges();
            var controller = GetController();
            var result     = await controller.Respond(originalInvitation.Token, false);

            Assert.IsType <NoContentResult>(result);
            db = Db;
            var invitation = db.CompanyInvitations.Single();

            Assert.Equal(InvitationStatus.Rejected, invitation.Status);
        }
Пример #5
0
        public async Task Ok_Activated()
        {
            var db         = AddDbContext();
            var invitation = new CompanyInvitation
            {
                CompanyId = 1,
                Email     = "Email",
                Status    = InvitationStatus.Accepted,
                Token     = Guid.Empty
            };

            db.Add(invitation);
            db.SaveChanges();
            var controller = GetController();
            var result     = await controller.Activate(invitation.Email, 8);

            var ok = Assert.IsType <OkObjectResult>(result);

            Assert.True((bool)ok.Value);
        }
Пример #6
0
        public async Task NoContent_Accepted()
        {
            var usersClientMock = new Mock <IUsersClient>();

            usersClientMock.Setup(x => x.IsEmailUniqueAsync(It.IsAny <string>())).ReturnsAsync(true);
            Services.AddSingleton(usersClientMock.Object);
            var db = AddDbContext();
            var originalInvitation = new CompanyInvitation {
                Status = InvitationStatus.Pending
            }.SetStringProperties();

            db.Add(originalInvitation);
            db.SaveChanges();
            var controller = GetController();
            var result     = await controller.Respond(originalInvitation.Token, true);

            Assert.IsType <NoContentResult>(result);
            db = Db;
            var invitation = db.CompanyInvitations.Single();

            Assert.Equal(InvitationStatus.Accepted, invitation.Status);
        }