private async Task UpdateProjectLobbyStateAsync(Guid projectId, LobbyState lobbyStatus) { var projectLobbyState = new ProjectLobbyState { ProjectId = projectId, LobbyState = lobbyStatus }; await _projectLobbyStateController.UpsertProjectLobbyStateAsync(projectId, projectLobbyState); }
private async Task <ProjectLobbyState> SetProjectLobbyStateToError(Guid projectId, bool saveState = true) { var state = new ProjectLobbyState { ProjectId = projectId, LobbyState = LobbyState.Error }; return(saveState ? await UpsertProjectLobbyStateAsync(projectId, state) : state); }
public async Task GetProjectLobbyStateAsync_RetrievesLobbyState() { var state = ProjectLobbyState.Example(); _cacheMock .Setup(m => m.ItemGetAsync(It.IsAny <IEnumerable <string> >(), typeof(ProjectLobbyState))) .ReturnsAsync(new List <ProjectLobbyState>() { state }); var result = await _target.GetProjectLobbyStateAsync(Guid.NewGuid()); Assert.IsAssignableFrom <ProjectLobbyState>(result); Assert.Equal(state, result); }
/// <inheritdoc /> public async Task CreateProjectLobbyStateAsync(Guid projectId) { var validationResult = _validatorLocator.Validate <ProjectIdValidator>(projectId); if (!validationResult.IsValid) { throw new ValidationFailedException(validationResult.Errors); } var state = new ProjectLobbyState { ProjectId = projectId, LobbyState = LobbyState.Normal }; await _cacheSelector[CacheConnection.General].ItemSetAsync(LobbyStateKeyResolver.GetProjectLobbyStateKey(projectId), state, _expirationTime); }
/// <inheritdoc /> public ProjectLobbyStateModule(IMetadataRegistry metadataRegistry, IPolicyEvaluator policyEvaluator, ILoggerFactory loggerFactory, IProjectLobbyStateController projectLobbyStateController) : base(GuestServiceBootstrapper.ServiceNameShort, metadataRegistry, policyEvaluator, loggerFactory) { _projectLobbyStateController = projectLobbyStateController; CreateRoute("GetProjectLobbyState", HttpMethod.Get, $"{Routing.ProjectsRoute}/{{projectId:guid}}/{Routing.ProjectLobbyStatePath}", GetProjectLobbyStateAsync) .Description("Retrieves lobby state for a project.") .StatusCodes(HttpStatusCode.OK, HttpStatusCode.BadRequest, HttpStatusCode.Unauthorized, HttpStatusCode.Forbidden, HttpStatusCode.NotFound, HttpStatusCode.InternalServerError) .ResponseFormat(JsonConvert.SerializeObject(new ProjectLobbyState())); CreateRoute("RecalculateProjectLobbyState", HttpMethod.Put, $"{Routing.ProjectsRoute}/{{projectId:guid}}/{Routing.ProjectLobbyStatePath}", RecalculateProjectLobbyStateAsync) .Description("Recalculates the the lobby state of a project.") .StatusCodes(HttpStatusCode.OK, HttpStatusCode.BadRequest, HttpStatusCode.Unauthorized, HttpStatusCode.Forbidden, HttpStatusCode.NotFound, HttpStatusCode.InternalServerError) .ResponseFormat(ProjectLobbyState.Example()); }
public async Task RecalculateProjectLobbyStateAsync_IfNotFoundAndProjectExists_CreatesAndReturnsLobbyState() { SetupApisForRecalculate(); var stateRef = new Reference <ProjectLobbyState> { Value = ProjectLobbyState.Example() }; _cacheMock .SetupSequence(m => m.TryItemGetAsync(It.IsAny <string>(), typeof(ProjectLobbyState), stateRef)) .ReturnsAsync(false) .ReturnsAsync(true); _cacheMock .Setup(m => m.ItemSetAsync(It.IsAny <string>(), It.IsAny <ProjectLobbyState>(), It.IsAny <TimeSpan>(), It.IsAny <CacheCommandOptions>())) .Returns(Task.FromResult <object>(null)); var result = await _target.RecalculateProjectLobbyStateAsync(Guid.NewGuid()); Assert.IsAssignableFrom <ProjectLobbyState>(result); }
public async Task GetProjectLobbyStateAsync_IfNotFoundAndProjectExists_ReturnsState() { var project = Project.Example(); SetupApisForRecalculate(HttpStatusCode.OK, false, project); var state = ProjectLobbyState.Example(); state.ProjectId = project.Id; var participants = new List <Participant>(); var participant = Participant.Example(); ParticipantExtensions.SetProjectId(participant, project.Id); participant.GuestSessionId = null; participant.IsGuest = false; participants.Add(participant); _sessionServiceMock.Setup(m => m.GetParticipantsByGroupNameAsync(It.IsAny <string>(), It.IsAny <bool>(), false)) .ReturnsAsync(participants); _cacheMock .Setup(m => m.ItemSetAsync(It.IsAny <string>(), It.IsAny <ProjectLobbyState>(), It.IsAny <TimeSpan>(), It.IsAny <CacheCommandOptions>())) .Returns(Task.FromResult(state)); _cacheMock .SetupSequence(m => m.ItemGetAsync(It.IsAny <List <string> >(), typeof(ProjectLobbyState))) .ReturnsAsync(default(List <ProjectLobbyState>)) .ReturnsAsync(new List <ProjectLobbyState>() { state }); var result = await _target.GetProjectLobbyStateAsync(project.Id); Assert.IsAssignableFrom <ProjectLobbyState>(result); Assert.Equal(state.ProjectId, result.ProjectId); Assert.Equal(state.LobbyState, result.LobbyState); }
public async Task <ProjectLobbyState> UpsertProjectLobbyStateAsync(Guid projectId, ProjectLobbyState projectLobbyState) { string key = LobbyStateKeyResolver.GetProjectLobbyStateKey(projectId); await _cacheSelector[CacheConnection.General].ItemSetAsync(key, projectLobbyState, _expirationTime); _eventService.Publish(EventNames.ProjectStatusUpdated, projectLobbyState); return(projectLobbyState); }
public async Task RecalculateProjectLobbyStateAsync_ReturnsExpectedLobbyState(int fullMemberParticipantCount, int guestSessionCount, LobbyState lobbyState) { var project = Project.Example(); var projectId = project.Id; var participants = new List <Participant>(); for (int i = 1; i <= fullMemberParticipantCount; i++) { var participant = Participant.Example(); ParticipantExtensions.SetProjectId(participant, project.Id); participant.GuestSessionId = null; participant.IsGuest = false; participants.Add(participant); } _sessionServiceMock.Setup(m => m.GetParticipantsByGroupNameAsync(It.IsAny <string>(), It.IsAny <bool>(), false)) .ReturnsAsync(participants); var guestSessions = new List <GuestSession>(); project.GuestAccessCode = Guid.NewGuid().ToString(); for (int i = 1; i <= guestSessionCount; i++) { var guestSession = GuestSession.Example(); guestSession.ProjectId = projectId; guestSession.ProjectAccessCode = project.GuestAccessCode; guestSession.GuestSessionState = GuestState.InProject; guestSession.CreatedDateTime = DateTime.UtcNow; guestSession.UserId = Guid.NewGuid(); guestSessions.Add(guestSession); // Should never have more than one InProject sessions for same user and project, // but need to test LINQ query with group by, where, and order by clauses, // for correct calculation of current guest quantity. var guestSession2 = CloneGuestSession(guestSession); guestSession2.CreatedDateTime = DateTime.UtcNow.AddHours(-1.0); guestSessions.Add(guestSession2); var guestSession3 = CloneGuestSession(guestSession); guestSession3.CreatedDateTime = DateTime.UtcNow.AddHours(-2.0); guestSessions.Add(guestSession3); } _guestSessionRepositoryMock .Setup(m => m.GetItemsAsync(It.IsAny <Expression <Func <GuestSession, bool> > >(), It.IsAny <BatchOptions>(), It.IsAny <CancellationToken>())) .ReturnsAsync(guestSessions); _projectApi .Setup(m => m.GetProjectByIdAsync(It.IsAny <Guid>(), null)) .ReturnsAsync(MicroserviceResponse.Create(HttpStatusCode.OK, project)); _cacheMock .SetupSequence(m => m.ItemGetAsync(It.IsAny <List <string> >(), typeof(ProjectLobbyState))) .ReturnsAsync(new List <ProjectLobbyState>() { default(ProjectLobbyState) }); _cacheMock .Setup(m => m.ItemSetAsync(It.IsAny <string>(), It.IsAny <ProjectLobbyState>(), It.IsAny <TimeSpan>(), It.IsAny <CacheCommandOptions>())) .Returns(Task.FromResult(ProjectLobbyState.Example())); var result = await _target.RecalculateProjectLobbyStateAsync(project.Id); Assert.IsAssignableFrom <ProjectLobbyState>(result); Assert.Equal(lobbyState, result.LobbyState); }
public ProjectGuestContextControllerTests() { _defaultProject = new Project() { Id = _defaultProjectId, TenantId = _projectTenantId, GuestAccessCode = _defaultAccessCode }; _defaultPrincipalId = Guid.NewGuid(); _defaultProjectTenantHeaders = new List <KeyValuePair <string, string> >() { new KeyValuePair <string, string>(HeaderKeys.Tenant, _defaultProject.TenantId.ToString()) }; _defaultUser = new User { Id = _currentUserId, Username = "******" }; var defaultProjectLobbyState = new ProjectLobbyState { LobbyState = LobbyState.Normal, ProjectId = _defaultProjectId }; _defaultGuestSession = new GuestSession { Id = Guid.NewGuid(), ProjectId = _defaultProjectId, UserId = _currentUserId, ProjectAccessCode = _defaultAccessCode, GuestSessionState = GuestState.InLobby, SessionId = _defaultUserSessionId }; _defaultProjectGuestContext = new ProjectGuestContext { GuestSessionId = _defaultGuestSession.Id, GuestState = Guest.ProjectContext.Enums.GuestState.InLobby, ProjectId = _defaultProjectId, TenantId = _projectTenantId }; var repositoryFactoryMock = new Mock <IRepositoryFactory>(); repositoryFactoryMock .Setup(x => x.CreateRepository <GuestSession>()) .Returns(_guestSessionRepositoryMock.Object); _projectGuestContextServiceMock .Setup(x => x.GetProjectGuestContextAsync(It.IsAny <string>())) .ReturnsAsync(_defaultProjectGuestContext); _projectAccessApiMock .Setup(x => x.GrantProjectMembershipAsync(It.IsAny <GrantProjectMembershipRequest>(), _defaultProjectTenantHeaders)) .ReturnsAsync(MicroserviceResponse.Create(HttpStatusCode.OK)); _guestSessionControllerMock .Setup(x => x.UpdateGuestSessionStateAsync(It.IsAny <UpdateGuestSessionStateRequest>(), It.IsAny <Guid>())) .ReturnsAsync(new UpdateGuestSessionStateResponse()); _guestSessionControllerMock .Setup(x => x.VerifyGuestAsync(It.IsAny <GuestVerificationRequest>(), It.IsAny <Project>(), It.IsAny <Guid?>())) .ReturnsAsync(new GuestVerificationResponse() { ResultCode = VerifyGuestResponseCode.Success }); _guestSessionControllerMock .Setup(x => x.CreateGuestSessionAsync(It.IsAny <GuestSession>(), _defaultPrincipalId, It.IsAny <Guid>())) .ReturnsAsync(_defaultGuestSession); _userApiMock .Setup(x => x.GetUserAsync(_currentUserId)) .ReturnsAsync(MicroserviceResponse.Create(HttpStatusCode.OK, _defaultUser)); _serviceToServiceProjectApiMock .Setup(x => x.GetProjectByIdAsync(_defaultProjectId, null)) .ReturnsAsync(MicroserviceResponse.Create(HttpStatusCode.OK, _defaultProject)); _projectAccessApiMock .Setup(x => x.GetProjectMemberUserIdsAsync(_defaultProjectId, MemberRoleFilter.FullUser, _defaultProjectTenantHeaders)) .ReturnsAsync(MicroserviceResponse.Create(HttpStatusCode.OK, (new List <Guid>() { _currentUserId }).AsEnumerable())); _projectLobbyStateControllerMock .Setup(x => x.GetProjectLobbyStateAsync(_defaultProjectId)) .ReturnsAsync(defaultProjectLobbyState); _target = new ProjectGuestContextController(repositoryFactoryMock.Object, _guestSessionControllerMock.Object, _projectLobbyStateControllerMock.Object, _projectGuestContextServiceMock.Object, _projectAccessApiMock.Object, _serviceToServiceProjectApiMock.Object, _userApiMock.Object); }