예제 #1
0
        public async Task MakeOrder(CoffeeService coffee, User user, string text, SlackResponse response)
        {
            var canceled = await coffee.CancelOrderAsync(user.Id, DateTime.Now, DateTime.MinValue);

            var order = await coffee.MakeOrderAsync(user.Id, text, DateTime.Now, canceled);

            var deposit = await coffee.GetDepositAsync(user.Id);

            response.Ephemeral($"{order.Price}원, 현재 잔액 {deposit}원");
            if (canceled != null && canceled.IsPicked && order.Price != canceled.Price)
            {
                response.Ephemeral($"추첨된 메뉴와 가격이 다릅니다. 추출러에게 바뀐 메뉴를 확실히 알려주세요.");
            }
            response.InChannel($"{user.Name} 님이 {order.MenuId}{(canceled != null ? "로 변경" : "를 주문")} 하였습니다.");
        }
예제 #2
0
        public async Task MakeReservationForAfternoon(CoffeeService coffee, User user, string text, SlackResponse response)
        {
            var at = DateTime.Now.Noon();

            if (DateTime.Now > at)
            {
                throw new BadRequestException("오전에만 사용 가능한 메뉴입니다.");
            }
            var canceled = await coffee.CancelOrderAsync(user.Id, at, at);

            var order = await coffee.MakeOrderAsync(user.Id, text, at);

            var deposit = await coffee.GetDepositAsync(user.Id);

            response
            .Ephemeral($"{order.Price}원, 현재 잔액 {deposit}원")
            .InChannel($"{user.Name} 님이 오후 커피를 {order.MenuId}로 {(canceled != null ? "변경" : "예약")} 하였습니다.");
        }
예제 #3
0
        public async void CoffeeService()
        {
            using var context = TestCoffeeContext.CreateContext();
            context.SetUsers();
            context.SetMenus();
            await context.SaveChangesAsync();

            var at      = DateTime.Now;
            var service = new CoffeeService(context);

            // 이전 주문이 없어서 실패
            await Assert.ThrowsAsync <BadRequestException>(() => service.MakeOrderAsync("id1", "", at));

            // 없는 메뉴이기 때문에 실패
            await Assert.ThrowsAsync <MenuNotFoundException>(() => service.MakeOrderAsync("id1", "없는메뉴", at));

            var order = await service.MakeOrderAsync("id1", "메뉴1", at);

            await context.SaveChangesAsync();

            at = at.AddSeconds(10);

            // 아직 추첨을 안했기 때문에 완성 실패
            await Assert.ThrowsAsync <BadRequestException>(service.CompleteOrderAsync);

            var pickedOrders = await service.PickOrderAsync(10, at.AddSeconds(10));

            await context.SaveChangesAsync();

            at = at.AddSeconds(10);

            // 이미 추첨을 했기 때문에 추첨 불가
            await Assert.ThrowsAsync <BadRequestException>(() => service.PickOrderAsync(10, at));

            Assert.Single(pickedOrders);
            Assert.Equal("id1", pickedOrders[0].UserId);
            Assert.Equal("메뉴1", pickedOrders[0].MenuId);

            // 추가 신청
            await service.MakeOrderAsync("id2", "메뉴2", at);

            await context.SaveChangesAsync();

            at = at.AddSeconds(10);

            // 추가 추첨
            var pickedMore = await service.PickMoreOrderAsync(2, at);

            await context.SaveChangesAsync();

            Assert.Single(pickedMore);
            Assert.Equal("id2", pickedMore[0].UserId);

            var completedOrders = await service.CompleteOrderAsync();

            await context.SaveChangesAsync();

            Assert.Equal(2, completedOrders.Count);
            Assert.Equal("id1", completedOrders[0].UserId);
            Assert.Equal("메뉴1", completedOrders[0].MenuId);

            var orders = await context.Orders.ToListAsync();

            Assert.Empty(orders);

            var completeds = await context.CompletedOrders.ToListAsync();

            Assert.Equal(2, completeds.Count);

            var user = await context.Users.FindAsync("id1");

            Assert.Equal(500, (int)user.Deposit);

            user = await context.Users.FindAsync("id2");

            Assert.Equal(-500, (int)user.Deposit);
        }