public async Task IntegrationTestGetCards() { // Arrange NationRepository repository = new NationRepository(DevelopmentStorageAccountConnectionString); SessionRepository sessionRepository = new SessionRepository(DevelopmentStorageAccountConnectionString); Guid validGuid = new Guid("03ECAE31-CB33-4537-9E22-FE1A68BFFA08"); Guid dummyRegionAGuid = new Guid("FD28529F-011D-42F5-B9B2-0F7AEA80CB8A"); Guid dummyRegionBGuid = new Guid("A05EBB51-1BAA-4E4E-B43E-7E30EB89F5C7"); Guid dummyRegionCGuid = new Guid("21B47511-8376-44F1-835D-41FF3BD1A860"); String dummyUserId = "DummyUserId"; await sessionRepository.SetupSession(validGuid, dummyUserId); CardTableEntry ownedCard = await sessionRepository.SetupAddCard(validGuid, dummyRegionAGuid, CardTableEntry.State.Owned, dummyUserId, 3); await sessionRepository.SetupAddCard(validGuid, dummyRegionBGuid, CardTableEntry.State.Unowned, String.Empty, 5); await sessionRepository.SetupAddCard(validGuid, dummyRegionCGuid, CardTableEntry.State.Discarded, dummyUserId, 7); // Act IEnumerable <ICardData> ownedCards = await repository.GetCards(validGuid, dummyUserId); // Assert Assert.IsNotNull(ownedCards); Assert.AreEqual(1, ownedCards.Count()); Assert.AreEqual(dummyUserId, ownedCards.First().OwnerId); Assert.AreEqual(dummyRegionAGuid, ownedCards.First().RegionId); Assert.AreEqual(3U, ownedCards.First().Value); Assert.AreEqual(ownedCard.ETag, ownedCards.First().CurrentEtag); }
public async Task <IEnumerable <ICard> > GetCards(Guid sessionId) { ISession session = await SessionRepository.GetSessionOrThrow(sessionId) .IsUserIdJoinedOrThrow(NationRepository, User.Identity.GetUserId()); IEnumerable <ICardData> playerCards = await NationRepository.GetCards(sessionId, User.Identity.GetUserId()); return(playerCards.Select(card => new Card(card))); }
public async Task PostCards(Guid sessionId, IEnumerable <Guid> cards) { ISession session = await SessionRepository.GetSessionOrThrow(sessionId) .IsUserIdJoinedOrThrow(NationRepository, User.Identity.GetUserId()) .IsPhaseTypeOrThrow(SessionPhase.Reinforcements); Task <INationData> nationDataTask = NationRepository.GetNationOrThrow(sessionId, User.Identity.GetUserId()); Task <IEnumerable <ICardData> > playerCardsTask = NationRepository.GetCards(sessionId, User.Identity.GetUserId()); if (cards == null) { throw new HttpResponseException(new HttpResponseMessage { StatusCode = HttpStatusCode.BadRequest, ReasonPhrase = "Invalid card(s) specified" }); } HashSet <Guid> cardRegionIds = new HashSet <Guid>(); foreach (Guid cardRegionId in cards) { if (cardRegionIds.Contains(cardRegionId)) { throw new HttpResponseException(new HttpResponseMessage { StatusCode = HttpStatusCode.BadRequest, ReasonPhrase = "Duplicate card(s) specified" }); } else if (cardRegionIds.Count >= 3) { throw new HttpResponseException(new HttpResponseMessage { StatusCode = HttpStatusCode.BadRequest, ReasonPhrase = "Too many card(s) specified" }); } else { cardRegionIds.Add(cardRegionId); } } if (cardRegionIds.Count != 3) { throw new HttpResponseException(new HttpResponseMessage { StatusCode = HttpStatusCode.BadRequest, ReasonPhrase = "Too few card(s) specified" }); } using (IBatchOperationHandle batchOperation = SessionRepository.StartBatchOperation(sessionId)) { IEnumerable <ICardData> playerCards = await playerCardsTask; HashSet <UInt32> seenValues = new HashSet <UInt32>(); foreach (ICardData card in playerCards) { if (cardRegionIds.Contains(card.RegionId)) { NationRepository.SetCardDiscarded(batchOperation, sessionId, card.RegionId, card.CurrentEtag); seenValues.Add(card.Value); } } UInt32 additionalReinforcements = 0; if (seenValues.Count == 1) { additionalReinforcements = seenValues.First(); } else if (seenValues.Count == 3) { additionalReinforcements = 9; } else { await batchOperation.Abort(); throw new HttpResponseException(new HttpResponseMessage { StatusCode = HttpStatusCode.BadRequest, ReasonPhrase = "Invalid combination of card(s) specified" }); } INationData nation = await nationDataTask; NationRepository.SetAvailableReinforcements(batchOperation, sessionId, nation.UserId, nation.CurrentEtag, nation.AvailableReinforcements + additionalReinforcements); await batchOperation.CommitBatch(); } }