public void PreventPlayersFromJoiningAPartyWithoutAValidInvite()
        {
            // Create a party.
            var pitLeader          = CreatePlayerIdentityTokenForPlayer(LeaderPlayerId);
            var createPartyRequest = new CreatePartyRequest {
                MinMembers = MinMembers, MaxMembers = MaxMembers
            };
            var partyId = _partyClient
                          .CreateParty(createPartyRequest, new Metadata {
                { PitRequestHeaderName, pitLeader }
            }).PartyId;

            // Verify that the party was successfully created.
            var partyAssociatedToPlayer = _partyClient.GetPartyByPlayerId(new GetPartyByPlayerIdRequest(),
                                                                          new Metadata {
                { PitRequestHeaderName, pitLeader }
            }).Party;

            Assert.NotNull(partyAssociatedToPlayer);

            // Verify that another player can successfully join the party.
            var joinRequest = new JoinPartyRequest {
                PartyId = partyId
            };
            var exception = Assert.Throws <RpcException>(() =>
                                                         _partyClient.JoinParty(joinRequest, new Metadata {
                { PitRequestHeaderName, CreatePlayerIdentityTokenForPlayer(PlayerId) }
            }));

            Assert.AreEqual(StatusCode.FailedPrecondition, exception.StatusCode);
            Assert.That(exception.Message, Contains.Substring("not invited"));
        }
Example #2
0
        public override Task <CreatePartyResponse> CreateParty(CreatePartyRequest request, ServerCallContext context)
        {
            var playerId = AuthHeaders.ExtractPlayerId(context);
            var pit      = AuthHeaders.ExtractPit(context);

            // TODO(iuliaharasim/dom): Move logic specific to party creation in a separate class.
            PartyDataModel party;

            try
            {
                party = new PartyDataModel(playerId, pit, request.MinMembers, request.MaxMembers, request.Metadata);
            }
            catch (ArgumentException exception)
            {
                throw new RpcException(new Status(StatusCode.InvalidArgument, exception.Message));
            }

            var leader = party.GetLeader();

            using (var memClient = _memoryStoreClientManager.GetClient())
                using (var transaction = memClient.CreateTransaction())
                {
                    transaction.CreateAll(new List <Entry> {
                        party, leader
                    });
                }

            return(Task.FromResult(new CreatePartyResponse {
                PartyId = party.Id
            }));
        }
        public Task <Party> CreateParty(CreatePartyRequest request)
        {
            var party = new Party
            {
                Name    = "NullReferenceException",
                Members = new List <PartyMember>()
            };

            party.Members.Add(new Fighter()
            {
                Id           = 1,
                Name         = "Brambo",
                Constitution = 11,
                Strength     = 12,
                Intelligence = 11
            });
            party.Members.Add(new Fighter()
            {
                Id           = 2,
                Name         = "Chrissy",
                Constitution = 11,
                Strength     = 12,
                Intelligence = 11
            });

            return(Task.FromResult(party));
        }
Example #4
0
        public void CreateParty(CreatePartyRequest request)
        {
            var customer = _customerService.GetCustomer(request.CustomerId);

            if (string.IsNullOrEmpty(customer.Phone.PhoneNumber))
            {
                throw new InvalidRequestException($"Customer {customer.Id} has not provided a phone number.");
            }
            if (!customer.Phone.IsVerified)
            {
                throw new InvalidRequestException($"Phone number for customer {customer.Id} has not been validated.");
            }

            var activeParty = GetParties(customer.Id, isActive: true);

            if (activeParty.Any())
            {
                throw new InvalidRequestException($"Customer {customer.Id} has an existing active party");
            }

            var party = new Party(request);

            _partyRepository.Add(party);
            _partyRepository.Save();
        }
        public void PreventPlayersFromJoiningAPartyIfTheyAreMembersOfAnotherParty()
        {
            // Create a party.
            var pitLeader          = CreatePlayerIdentityTokenForPlayer(LeaderPlayerId);
            var createPartyRequest = new CreatePartyRequest {
                MinMembers = MinMembers, MaxMembers = MaxMembers
            };
            var partyId = _partyClient
                          .CreateParty(createPartyRequest, new Metadata {
                { PitRequestHeaderName, pitLeader }
            }).PartyId;

            // Verify that the party was successfully created.
            var partyAssociatedToPlayer = _partyClient
                                          .GetPartyByPlayerId(new GetPartyByPlayerIdRequest(),
                                                              new Metadata {
                { PitRequestHeaderName, pitLeader }
            })
                                          .Party;

            Assert.NotNull(partyAssociatedToPlayer);

            // Create another party.
            var pitAnotherPlayer    = CreatePlayerIdentityTokenForPlayer(PlayerId);
            var inviteAnotherPlayer = _inviteClient.CreateInvite(new CreateInviteRequest {
                ReceiverPlayerId = PlayerId
            },
                                                                 new Metadata {
                { PitRequestHeaderName, pitLeader }
            });

            Assert.NotNull(inviteAnotherPlayer);
            createPartyRequest = new CreatePartyRequest {
                MinMembers = MinMembers, MaxMembers = MaxMembers
            };
            _partyClient.CreateParty(createPartyRequest, new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            });

            // Verify that the party was successfully created.
            partyAssociatedToPlayer = _partyClient
                                      .GetPartyByPlayerId(new GetPartyByPlayerIdRequest(),
                                                          new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            })
                                      .Party;
            Assert.NotNull(partyAssociatedToPlayer);

            // Verify that the second player is not allowed to join another party.
            var joinRequest = new JoinPartyRequest {
                PartyId = partyId
            };
            var exception = Assert.Throws <RpcException>(() =>
                                                         _partyClient.JoinParty(joinRequest, new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            }));

            Assert.AreEqual(StatusCode.AlreadyExists, exception.StatusCode);
        }
Example #6
0
 public Party(CreatePartyRequest request)
 {
     CustomerId      = request.CustomerId;
     PartySize       = request.PartySize;
     CreatedDateTime = DateTime.Now;
     IsNotified      = false;
     IsActive        = true;
 }
        public void PreventNonLeadersFromKickingOutOtherMembers()
        {
            // Create a party.
            var pitLeader          = CreatePlayerIdentityTokenForPlayer(LeaderPlayerId);
            var createPartyRequest = new CreatePartyRequest {
                MinMembers = MinMembers, MaxMembers = MaxMembers
            };
            var partyId = _partyClient
                          .CreateParty(createPartyRequest, new Metadata {
                { PitRequestHeaderName, pitLeader }
            }).PartyId;

            // Another player joins the party.
            var pitAnotherPlayer    = CreatePlayerIdentityTokenForPlayer(PlayerId);
            var inviteAnotherPlayer = _inviteClient.CreateInvite(new CreateInviteRequest {
                ReceiverPlayerId = PlayerId
            },
                                                                 new Metadata {
                { PitRequestHeaderName, pitLeader }
            });

            Assert.NotNull(inviteAnotherPlayer);
            var joinRequest = new JoinPartyRequest {
                PartyId = partyId
            };

            _partyClient.JoinParty(joinRequest, new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            });

            // Verify that the player who has recently joined the party is associated to it.
            var party = _partyClient.GetPartyByPlayerId(new GetPartyByPlayerIdRequest(),
                                                        new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            }).Party;

            Assert.NotNull(party);
            Assert.AreEqual(LeaderPlayerId, party.LeaderPlayerId);

            // Verify that the leader can kick out other players.
            _partyClient.KickOutPlayer(new KickOutPlayerRequest {
                EvictedPlayerId = PlayerId
            },
                                       new Metadata {
                { PitRequestHeaderName, pitLeader }
            });

            var exception = Assert.Throws <RpcException>(
                () => _partyClient.GetPartyByPlayerId(new GetPartyByPlayerIdRequest(),
                                                      new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            }));

            Assert.AreEqual(StatusCode.NotFound, exception.StatusCode);
        }
Example #8
0
        public void ReturnPartyIdWhenSuccessful()
        {
            // Setup the client such that it will claim that TestLeader isn't a member of any party and such it will
            // return a party id for some particular parameters.
            IEnumerable <Entry> created = null;

            _mockMemoryStoreClient.Setup(client => client.GetAsync <Member>(TestLeaderPlayerId))
            .ReturnsAsync((Member)null);
            _mockTransaction.Setup(tr => tr.CreateAll(It.IsAny <IEnumerable <Entry> >()))
            .Callback <IEnumerable <Entry> >(entries => created = entries);

            foreach (string AnalyticsEventType in AnalyticsEventTypes)
            {
                _mockAnalyticsSender.Setup(
                    sender => sender.Send(AnalyticsConstants.PartyClass, AnalyticsEventType,
                                          It.Is <Dictionary <string, string> >(d => ExpectedAnalyticsDict(d)), TestLeaderPlayerId));
            }

            // Verify that a party has been successfully created and that its id has been returned.
            var createPartyRequest = new CreatePartyRequest
            {
                MinMembers = TestMinMembers,
                MaxMembers = TestMaxMembers
            };

            createPartyRequest.Metadata.Add(_testMetadata);

            var context             = Util.CreateFakeCallContext(TestLeaderPlayerId, Pit);
            var createPartyResponse = _partyService.CreateParty(createPartyRequest, context).Result;

            var entriesList = created.ToList();

            Assert.AreEqual(2, entriesList.Count);

            var party = (PartyDataModel)entriesList[0];

            Assert.False(string.IsNullOrEmpty(party.Id));
            Assert.AreEqual(TestLeaderPlayerId, party.LeaderPlayerId);
            Assert.AreEqual(TestMinMembers, party.MinMembers);
            Assert.AreEqual(TestMaxMembers, party.MaxMembers);
            CollectionAssert.AreEquivalent(_testMetadata, party.Metadata);
            Assert.That(party.MemberIdToPit, Contains.Key(TestLeaderPlayerId));
            Assert.AreEqual(party.MemberIdToPit[TestLeaderPlayerId], Pit);

            var leader = (Member)entriesList[1];

            Assert.AreEqual(TestLeaderPlayerId, leader.Id);
            Assert.AreEqual(party.Id, leader.PartyId);
            Assert.AreEqual(party.Id, createPartyResponse.PartyId);

            _mockAnalyticsSender.VerifyAll();
        }
        public void PreventNonLeadersFromDeletingAParty()
        {
            // Create a party.
            var pitLeader          = CreatePlayerIdentityTokenForPlayer(LeaderPlayerId);
            var createPartyRequest = new CreatePartyRequest {
                MinMembers = MinMembers, MaxMembers = MaxMembers
            };
            var partyId = _partyClient
                          .CreateParty(createPartyRequest, new Metadata {
                { PitRequestHeaderName, pitLeader }
            }).PartyId;

            // Verify that the party was successfully created.
            var partyAssociatedToPlayer = _partyClient
                                          .GetPartyByPlayerId(new GetPartyByPlayerIdRequest(),
                                                              new Metadata {
                { PitRequestHeaderName, pitLeader }
            })
                                          .Party;

            Assert.NotNull(partyAssociatedToPlayer);

            // Another player joins the party.
            var pitAnotherPlayer    = CreatePlayerIdentityTokenForPlayer(PlayerId);
            var inviteAnotherPlayer = _inviteClient.CreateInvite(new CreateInviteRequest {
                ReceiverPlayerId = PlayerId
            },
                                                                 new Metadata {
                { PitRequestHeaderName, pitLeader }
            });

            Assert.NotNull(inviteAnotherPlayer);
            var joinRequest = new JoinPartyRequest {
                PartyId = partyId
            };

            _partyClient.JoinParty(joinRequest, new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            });

            // Verify that it is impossible for the non-leader to delete the party.
            var exception = Assert.Throws <RpcException>(() =>
                                                         _partyClient.DeleteParty(new DeletePartyRequest(),
                                                                                  new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            }));

            Assert.AreEqual(StatusCode.PermissionDenied, exception.StatusCode);
            Assert.That(exception.Message, Contains.Substring("player needs to be the leader"));
        }
Example #10
0
        public IActionResult CreateParty([FromBody] CreatePartyRequest request)
        {
            Authorize.TokenAgainstResource(HttpContext.User, request.CustomerId);

            if (request.PartySize <= 0)
            {
                throw new InvalidRequestException("PartySize must be greater than 0.");
            }

            var domainRequest = request.ToDomain();

            _partyService.CreateParty(domainRequest);

            return(Ok());
        }
Example #11
0
        public override Task <CreatePartyResponse> CreateParty(CreatePartyRequest request, ServerCallContext context)
        {
            var playerId = AuthHeaders.ExtractPlayerId(context);
            var pit      = AuthHeaders.ExtractPit(context);

            // TODO(iuliaharasim/dom): Move logic specific to party creation in a separate class.
            PartyDataModel party;

            try
            {
                party = new PartyDataModel(playerId, pit, request.MinMembers, request.MaxMembers, request.Metadata);
            }
            catch (ArgumentException exception)
            {
                throw new RpcException(new Status(StatusCode.InvalidArgument, exception.Message));
            }

            var leader = party.GetLeader();

            using (var memClient = _memoryStoreClientManager.GetClient())
                using (var transaction = memClient.CreateTransaction())
                {
                    transaction.CreateAll(new List <Entry> {
                        party, leader
                    });
                }

            var eventAttributes = new Dictionary <string, string>
            {
                { "partyId", party.Id }
            };

            string[] eventTypes = { "player_created_party", "player_joined_party", "party_created" };
            foreach (string eventType in eventTypes)
            {
                if (eventType == "party_created")
                {
                    eventAttributes.Add("partyPhase", party.CurrentPhase.ToString());
                }
                _analytics.Send(eventType, eventAttributes, playerId);
            }

            return(Task.FromResult(new CreatePartyResponse {
                PartyId = party.Id
            }));
        }
        public async Task MyAdventure_CreateParty_Should_Create_Two_Party_Members()
        {
            // Arrange
            var adventure = new MyAdventure();
            var request   = new CreatePartyRequest
            {
                MembersCount = 2
            };

            // Act
            var response = await adventure.CreateParty(request);

            // Assert
            response.Name.Should().Be("My Party");
            response.Members.Should().HaveCount(2);
            response.Members.Should().Contain(x => x.Name == "Member 1");
            response.Members.Should().Contain(x => x.Name == "Member 2");
        }
Example #13
0
        public Task <Party> CreateParty(CreatePartyRequest request)
        {
            var party = new Party
            {
                Name    = "DedSec",
                Members = new List <PartyMember>()
            };

            for (var i = 0; i < request.MembersCount; i++)
            {
                party.Members.Add(new Fighter()
                {
                    Id           = i,
                    Name         = $"Hacker {i + 1}",
                    Constitution = 11,
                    Strength     = 12,
                    Intelligence = 11
                });
            }
            return(Task.FromResult(party));
        }
        public void PreventNonLeadersFromExtractingLeaderPit()
        {
            // Create a party.
            var pitLeader          = CreatePlayerIdentityTokenForPlayer(LeaderPlayerId);
            var createPartyRequest = new CreatePartyRequest {
                MinMembers = MinMembers, MaxMembers = MaxMembers
            };
            var partyId = _partyClient
                          .CreateParty(createPartyRequest, new Metadata {
                { PitRequestHeaderName, pitLeader }
            }).PartyId;

            // Another player joins the party.
            var pitAnotherPlayer    = CreatePlayerIdentityTokenForPlayer(PlayerId);
            var inviteAnotherPlayer = _inviteClient.CreateInvite(new CreateInviteRequest {
                ReceiverPlayerId = PlayerId
            },
                                                                 new Metadata {
                { PitRequestHeaderName, pitLeader }
            });

            Assert.NotNull(inviteAnotherPlayer);
            var joinRequest = new JoinPartyRequest {
                PartyId = partyId
            };

            _partyClient.JoinParty(joinRequest, new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            });

            // Verify that the player who has recently joined the party is associated to it.
            var party = _partyClient.GetPartyByPlayerId(new GetPartyByPlayerIdRequest(),
                                                        new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            }).Party;

            Assert.NotNull(party);
            Assert.AreEqual(LeaderPlayerId, party.LeaderPlayerId);
        }
        public Task <Party> CreateParty(CreatePartyRequest request)
        {
            var party = new Party
            {
                Name    = "My Party",
                Members = new List <PartyMember>()
            };


            for (var i = 0; i < request.MembersCount; i++)
            {
                party.Members.Add(new Fighter()
                {
                    Id           = i,
                    Name         = $"Member {i + 1}",
                    Constitution = 8,
                    Strength     = 8,
                    Intelligence = 18
                });
            }
            Console.WriteLine("Amount Party members: " + request.MembersCount);

            return(Task.FromResult(party));
        }
Example #16
0
        public Task <Party> CreateParty(CreatePartyRequest request)
        {
            var party = new Party
            {
                Name    = "My Party",
                Members = new List <PartyMember>()
            };

            for (var i = 0; i < request.MembersCount; i++)
            {
                if (_random.Next(0, 10) > 5)
                {
                    party.Members.Add(new Wizard()
                    {
                        Id           = i,
                        Name         = $"Wizard {i + 1}",
                        Constitution = 11,
                        Strength     = 9,
                        Intelligence = 14
                    });
                }
                else
                {
                    party.Members.Add(new Fighter()
                    {
                        Id           = i,
                        Name         = $"Fighter {i + 1}",
                        Constitution = 11,
                        Strength     = 14,
                        Intelligence = 9
                    });
                }
            }

            return(Task.FromResult(party));
        }
        public Task <Party> CreateParty(CreatePartyRequest request)
        {
            var party = new Party
            {
                Name    = "Monke Hakkers",
                Members = new List <PartyMember>()
            };

            for (var i = 0; i < request.MembersCount; i++)
            {
                if (i % 2 == 0)
                {
                    party.Members.Add(new Wizard
                    {
                        Id           = i,
                        Name         = $"Monke Wizard {i + 1}",
                        Constitution = 13,
                        Strength     = 8,
                        Intelligence = 13
                    });
                }
                else
                {
                    party.Members.Add(new Fighter
                    {
                        Id           = i,
                        Name         = $"Monke Fighter {i + 1}",
                        Constitution = 13,
                        Strength     = 13,
                        Intelligence = 8
                    });
                }
            }
            _party = party;
            return(Task.FromResult(party));
        }
        public void CreatePartyAndAssociateLeaderToIt()
        {
            // Create a party.
            var pit = CreatePlayerIdentityTokenForPlayer(LeaderPlayerId);
            var createPartyRequest = new CreatePartyRequest {
                MinMembers = MinMembers, MaxMembers = MaxMembers
            };
            var partyId = _partyClient.CreateParty(createPartyRequest, new Metadata {
                { PitRequestHeaderName, pit }
            })
                          .PartyId;

            // Verify that the party was appropriately stored and is associated to the player that created it.
            var partyAssociatedToPlayer = _partyClient
                                          .GetPartyByPlayerId(new GetPartyByPlayerIdRequest(), new Metadata {
                { PitRequestHeaderName, pit }
            })
                                          .Party;

            Assert.AreEqual(partyId, partyAssociatedToPlayer.Id);
            Assert.AreEqual(LeaderPlayerId, partyAssociatedToPlayer.LeaderPlayerId);
            Assert.AreEqual(MinMembers, partyAssociatedToPlayer.MinMembers);
            Assert.AreEqual(MaxMembers, partyAssociatedToPlayer.MaxMembers);
        }
        public Task <Party> CreateParty(CreatePartyRequest request)
        {
            var party = new Party
            {
                Name    = "Fellowship of the chickenwing",
                Members = new List <PartyMember>()
            };

            for (var i = 0; i < request.MembersCount; i++)
            {
                if (i % 2 == 0)
                {
                    party.Members.Add(new Fighter()
                    {
                        Id           = i,
                        Name         = $"FighterMan",
                        Constitution = 15,
                        Strength     = 11,
                        Intelligence = 8
                    });
                }
                else
                {
                    party.Members.Add(new Wizard()
                    {
                        Id           = i,
                        Name         = $"Tim the Enchanter",
                        Constitution = 11,
                        Strength     = 8,
                        Intelligence = 15
                    });
                }
            }

            return(Task.FromResult(party));
        }
        public void LetOtherMembersJoinAParty()
        {
            // Create a party.
            var pitLeader          = CreatePlayerIdentityTokenForPlayer(LeaderPlayerId);
            var createPartyRequest = new CreatePartyRequest {
                MinMembers = MinMembers, MaxMembers = MaxMembers
            };
            var partyId = _partyClient
                          .CreateParty(createPartyRequest, new Metadata {
                { PitRequestHeaderName, pitLeader }
            }).PartyId;

            // Verify that the party was successfully created.
            var partyAssociatedToPlayer = _partyClient
                                          .GetPartyByPlayerId(new GetPartyByPlayerIdRequest(),
                                                              new Metadata {
                { PitRequestHeaderName, pitLeader }
            })
                                          .Party;

            Assert.NotNull(partyAssociatedToPlayer);

            // Verify that another player can successfully join the party.
            var pitAnotherPlayer    = CreatePlayerIdentityTokenForPlayer(PlayerId);
            var inviteAnotherPlayer = _inviteClient.CreateInvite(new CreateInviteRequest {
                ReceiverPlayerId = PlayerId
            },
                                                                 new Metadata {
                { PitRequestHeaderName, pitLeader }
            }).InviteId;

            Assert.NotNull(inviteAnotherPlayer);
            var joinRequest = new JoinPartyRequest {
                PartyId = partyId
            };
            var partyJoined = _partyClient
                              .JoinParty(joinRequest, new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            }).Party;

            Assert.AreEqual(2, partyJoined.MemberIds.Count);

            // Rejoining the same party should be allowed but the number of players should remain the same.
            partyJoined = _partyClient
                          .JoinParty(joinRequest, new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            }).Party;
            Assert.AreEqual(2, partyJoined.MemberIds.Count);

            // Clean up.
            _partyClient.DeleteParty(new DeletePartyRequest(), new Metadata {
                { PitRequestHeaderName, pitLeader }
            });

            // Verify that its former members are no longer associated to the party since it has been deleted.
            var exception = Assert.Throws <RpcException>(() =>
                                                         _partyClient.GetPartyByPlayerId(new GetPartyByPlayerIdRequest(),
                                                                                         new Metadata {
                { PitRequestHeaderName, pitLeader }
            }));

            Assert.AreEqual(StatusCode.NotFound, exception.StatusCode);

            exception = Assert.Throws <RpcException>(() =>
                                                     _partyClient.GetPartyByPlayerId(new GetPartyByPlayerIdRequest(),
                                                                                     new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            }));
            Assert.AreEqual(StatusCode.NotFound, exception.StatusCode);
        }
        public void PreventPlayersFromJoiningAPartyIfItIsAtFullCapacity()
        {
            // Create a party.
            var pitLeader          = CreatePlayerIdentityTokenForPlayer(LeaderPlayerId);
            var createPartyRequest = new CreatePartyRequest {
                MinMembers = MinMembers, MaxMembers = MaxMembers
            };
            var partyId = _partyClient
                          .CreateParty(createPartyRequest, new Metadata {
                { PitRequestHeaderName, pitLeader }
            }).PartyId;

            // Verify that the party was successfully created.
            var partyAssociatedToPlayer = _partyClient
                                          .GetPartyByPlayerId(new GetPartyByPlayerIdRequest(),
                                                              new Metadata {
                { PitRequestHeaderName, pitLeader }
            })
                                          .Party;

            Assert.NotNull(partyAssociatedToPlayer);

            // Fill up the party such that it is at full capacity.
            for (var i = 1; i < MaxMembers; i++)
            {
                var playerId            = $"{PlayerId}:{i}";
                var pit                 = CreatePlayerIdentityTokenForPlayer(playerId);
                var inviteAnotherPlayer = _inviteClient.CreateInvite(new CreateInviteRequest {
                    ReceiverPlayerId = playerId
                },
                                                                     new Metadata {
                    { PitRequestHeaderName, pitLeader }
                });
                Assert.NotNull(inviteAnotherPlayer);
                var joinRequest = new JoinPartyRequest {
                    PartyId = partyId
                };
                _partyClient.JoinParty(joinRequest, new Metadata {
                    { PitRequestHeaderName, pit }
                });
            }

            // Verify that it is impossible for another player to join the party.
            var extraPlayerPit    = CreatePlayerIdentityTokenForPlayer(PlayerId);
            var inviteExtraPlayer = _inviteClient.CreateInvite(new CreateInviteRequest {
                ReceiverPlayerId = PlayerId
            },
                                                               new Metadata {
                { PitRequestHeaderName, pitLeader }
            });

            Assert.NotNull(inviteExtraPlayer);
            var extraJoinRequest = new JoinPartyRequest {
                PartyId = partyId
            };
            var exception = Assert.Throws <RpcException>(() =>
                                                         _partyClient.JoinParty(extraJoinRequest, new Metadata {
                { PitRequestHeaderName, extraPlayerPit }
            }));

            Assert.AreEqual(StatusCode.FailedPrecondition, exception.StatusCode);
            Assert.That(exception.Message, Contains.Substring("full capacity"));
        }
        public void AllowLeadersToAppointOtherPlayersAsLeader()
        {
            // Create a party.
            var pitLeader          = CreatePlayerIdentityTokenForPlayer(LeaderPlayerId);
            var createPartyRequest = new CreatePartyRequest {
                MinMembers = MinMembers, MaxMembers = MaxMembers
            };
            var partyId = _partyClient
                          .CreateParty(createPartyRequest, new Metadata {
                { PitRequestHeaderName, pitLeader }
            }).PartyId;

            // Another player joins the party.
            var pitAnotherPlayer    = CreatePlayerIdentityTokenForPlayer(PlayerId);
            var inviteAnotherPlayer = _inviteClient.CreateInvite(new CreateInviteRequest {
                ReceiverPlayerId = PlayerId
            },
                                                                 new Metadata {
                { PitRequestHeaderName, pitLeader }
            });

            Assert.NotNull(inviteAnotherPlayer);
            var joinRequest = new JoinPartyRequest {
                PartyId = partyId
            };

            _partyClient.JoinParty(joinRequest, new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            });

            var partyAssociatedToPlayer = _partyClient
                                          .GetPartyByPlayerId(new GetPartyByPlayerIdRequest(),
                                                              new Metadata {
                { PitRequestHeaderName, pitLeader }
            })
                                          .Party;

            // Appoint the newly joined player as the leader of the party.
            partyAssociatedToPlayer.LeaderPlayerId = PlayerId;
            var updatedParty = _partyClient.UpdateParty(new UpdatePartyRequest {
                UpdatedParty = partyAssociatedToPlayer
            },
                                                        new Metadata {
                { PitRequestHeaderName, pitLeader }
            }).Party;

            // Verify that only the leader player id has been updated.
            Assert.AreEqual(PlayerId, updatedParty.LeaderPlayerId);
            Assert.AreEqual(MinMembers, updatedParty.MinMembers);
            Assert.AreEqual(MaxMembers, updatedParty.MaxMembers);
            Assert.AreEqual(PartyPhaseProto.Forming, updatedParty.CurrentPhase);
            CollectionAssert.AreEquivalent(createPartyRequest.Metadata, updatedParty.Metadata);

            // Verify that the leader no longer has the necessary permissions to perform certain operations.
            var exception = Assert.Throws <RpcException>(() =>
                                                         _partyClient.DeleteParty(new DeletePartyRequest(),
                                                                                  new Metadata {
                { PitRequestHeaderName, pitLeader }
            }));

            Assert.AreEqual(StatusCode.PermissionDenied, exception.StatusCode);

            updatedParty.CurrentPhase = PartyPhaseProto.Matchmaking;
            exception = Assert.Throws <RpcException>(() =>
                                                     _partyClient.UpdateParty(new UpdatePartyRequest {
                UpdatedParty = updatedParty
            },
                                                                              new Metadata {
                { PitRequestHeaderName, pitLeader }
            }));
            Assert.AreEqual(StatusCode.PermissionDenied, exception.StatusCode);
        }
 public CreatePartyViewModel()
 {
     CreatePartyRequest = new CreatePartyRequest();
 }
        public void RandomlyAssignAnotherLeaderWhenTheyLeaveTheParty()
        {
            // Create a party.
            var pitLeader = CreatePlayerIdentityTokenForPlayer(LeaderPlayerId);
            var metadata  = new Dictionary <string, string> {
                { "random", "things" }
            };
            var createPartyRequest = new CreatePartyRequest {
                MinMembers = MinMembers, MaxMembers = MaxMembers
            };

            createPartyRequest.Metadata.Add(metadata);
            var partyId = _partyClient
                          .CreateParty(createPartyRequest, new Metadata {
                { PitRequestHeaderName, pitLeader }
            }).PartyId;

            // Another player joins the party.
            var pitAnotherPlayer    = CreatePlayerIdentityTokenForPlayer(PlayerId);
            var inviteAnotherPlayer = _inviteClient.CreateInvite(new CreateInviteRequest {
                ReceiverPlayerId = PlayerId
            },
                                                                 new Metadata {
                { PitRequestHeaderName, pitLeader }
            });

            Assert.NotNull(inviteAnotherPlayer);
            var joinRequest = new JoinPartyRequest {
                PartyId = partyId
            };

            _partyClient.JoinParty(joinRequest, new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            });

            // The leader leaves the party.
            _partyClient.LeaveParty(new LeavePartyRequest(), new Metadata {
                { PitRequestHeaderName, pitLeader }
            });

            // Verify that the former-leader is no longer associated to any party.
            _partyClient.LeaveParty(new LeavePartyRequest(), new Metadata {
                { PitRequestHeaderName, pitLeader }
            });
            var exception = Assert.Throws <RpcException>(
                () => _partyClient.GetPartyByPlayerId(new GetPartyByPlayerIdRequest(),
                                                      new Metadata {
                { PitRequestHeaderName, pitLeader }
            }));

            Assert.AreEqual(StatusCode.NotFound, exception.StatusCode);

            // Verify that the other remaining player has automatically been assigned the role of 'leader' since there
            // are no other members in the party.
            var partyAfterLeaderLeft = _partyClient
                                       .GetPartyByPlayerId(new GetPartyByPlayerIdRequest(),
                                                           new Metadata {
                { PitRequestHeaderName, pitAnotherPlayer }
            }).Party;

            Assert.AreEqual(PlayerId, partyAfterLeaderLeft.LeaderPlayerId);
        }