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);
        }
示例#3
0
        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());
        }
示例#6
0
        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);
        }
示例#7
0
        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);
        }
示例#9
0
        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);
        }