예제 #1
0
        public async Task CreateItemTemplate_AddANewItemTemplateInDatabase_AndReturnFullyLoadedOne()
        {
            var itemTemplateId        = Guid.NewGuid();
            var newItemTemplateEntity = new ItemTemplate {
                Id = itemTemplateId
            };
            var fullyLoadedItemTemplate = new ItemTemplate {
                Id = itemTemplateId
            };
            var createItemTemplateRequest = new ItemTemplateRequest();

            _mapper.Map <ItemTemplate>(createItemTemplateRequest)
            .Returns(newItemTemplateEntity);
            _unitOfWorkFactory.GetUnitOfWork().ItemTemplates.GetWithModifiersWithRequirementsWithSkillsWithSkillModifiersWithSlotsWithUnSkillsAsync(itemTemplateId)
            .Returns(fullyLoadedItemTemplate);

            var actualItemTemplate = await _service.CreateItemTemplateAsync(new NaheulbookExecutionContext(), createItemTemplateRequest);

            var itemTemplateRepository = _unitOfWorkFactory.GetUnitOfWork().ItemTemplates;

            Received.InOrder(() =>
            {
                itemTemplateRepository.Add(newItemTemplateEntity);
                _unitOfWorkFactory.GetUnitOfWork().SaveChangesAsync();
            });
            actualItemTemplate.Should().Be(fullyLoadedItemTemplate);
        }
예제 #2
0
        public void ApplyChangesFromRequest_ChangeBasicInfo()
        {
            var itemTemplate = new ItemTemplate
            {
                Name          = "some-name",
                Data          = @"{""key"": ""value""}",
                Source        = "some-source",
                TechName      = "some-tech-name",
                SubCategoryId = 1
            };

            var request = new ItemTemplateRequest
            {
                Name          = "some-new-name",
                Data          = JObject.FromObject(new { newKey = "newValue" }),
                Source        = "some-new-source",
                TechName      = "some-new-tech-name",
                SubCategoryId = 2
            };

            _util.ApplyChangesFromRequest(itemTemplate, request);

            itemTemplate.Name.Should().BeEquivalentTo("some-new-name");
            itemTemplate.Data.Should().Be(@"{""newKey"":""newValue""}");
            itemTemplate.Source.Should().Be("some-new-source");
            itemTemplate.TechName.Should().Be("some-new-tech-name");
            itemTemplate.SubCategoryId.Should().Be(2);
        }
        public async Task <ActionResult <ItemTemplateResponse> > PutItemTemplateAsync(
            [FromServices] NaheulbookExecutionContext executionContext,
            [FromRoute] Guid itemTemplateId,
            ItemTemplateRequest request
            )
        {
            try
            {
                var itemTemplate = await _itemTemplateService.EditItemTemplateAsync(
                    executionContext,
                    itemTemplateId,
                    request
                    );

                return(_mapper.Map <ItemTemplateResponse>(itemTemplate));
            }
            catch (ItemTemplateNotFoundException ex)
            {
                throw new HttpErrorException(StatusCodes.Status404NotFound, ex);
            }
            catch (ForbiddenAccessException ex)
            {
                throw new HttpErrorException(StatusCodes.Status403Forbidden, ex);
            }
        }
예제 #4
0
        public void ApplyChangesFromRequest_UpdateRequirements()
        {
            var itemTemplate = new ItemTemplate
            {
                Requirements = new List <ItemTemplateRequirement>
                {
                    new ItemTemplateRequirement
                    {
                        Id       = 1,
                        StatName = "some-stat-name-1",
                        MinValue = 2,
                        MaxValue = 3
                    },
                    new ItemTemplateRequirement
                    {
                        Id       = 2,
                        StatName = "some-stat-name-2",
                        MinValue = 4,
                        MaxValue = 7
                    }
                }
            };

            var request = new ItemTemplateRequest
            {
                Requirements = new List <ItemTemplateRequirementRequest>
                {
                    new ItemTemplateRequirementRequest
                    {
                        Stat = "some-stat-name-2",
                        Min  = 3,
                        Max  = 8
                    },
                    new ItemTemplateRequirementRequest
                    {
                        Stat = "some-stat-name-3",
                        Min  = 4,
                        Max  = 12
                    }
                }
            };

            _util.ApplyChangesFromRequest(itemTemplate, request);

            itemTemplate.Requirements.Should().BeEquivalentTo(
                new ItemTemplateRequirement
            {
                StatName = "some-stat-name-2",
                MinValue = 3,
                MaxValue = 8
            },
                new ItemTemplateRequirement
            {
                StatName = "some-stat-name-3",
                MinValue = 4,
                MaxValue = 12
            }
                );
        }
예제 #5
0
        public void ApplyChangesFromRequest_UpdateSkills()
        {
            var itemTemplate = new ItemTemplate
            {
                Skills = new List <ItemTemplateSkill>
                {
                    new ItemTemplateSkill {
                        SkillId = new Guid("00000000-0000-0000-0000-000000000001")
                    },
                    new ItemTemplateSkill {
                        SkillId = new Guid("00000000-0000-0000-0000-000000000002")
                    }
                },
                UnSkills = new List <ItemTemplateUnSkill>
                {
                    new ItemTemplateUnSkill {
                        SkillId = new Guid("00000000-0000-0000-0000-000000000003")
                    },
                    new ItemTemplateUnSkill {
                        SkillId = new Guid("00000000-0000-0000-0000-000000000004")
                    }
                }
            };

            var request = new ItemTemplateRequest
            {
                SkillIds = new List <Guid>
                {
                    new Guid("00000000-0000-0000-0000-000000000004"),
                    new Guid("00000000-0000-0000-0000-000000000005")
                },
                UnSkillIds = new List <Guid>
                {
                    new Guid("00000000-0000-0000-0000-000000000006"),
                    new Guid("00000000-0000-0000-0000-000000000007")
                }
            };

            _util.ApplyChangesFromRequest(itemTemplate, request);

            itemTemplate.Skills.Should().BeEquivalentTo(
                new ItemTemplateSkill {
                SkillId = new Guid("00000000-0000-0000-0000-000000000004")
            },
                new ItemTemplateSkill {
                SkillId = new Guid("00000000-0000-0000-0000-000000000005")
            }
                );
            itemTemplate.UnSkills.Should().BeEquivalentTo(
                new ItemTemplateSkill {
                SkillId = new Guid("00000000-0000-0000-0000-000000000006")
            },
                new ItemTemplateSkill {
                SkillId = new Guid("00000000-0000-0000-0000-000000000007")
            }
                );
        }
예제 #6
0
        public async Task CreateItemTemplate_EnsureThatUserIsAdmin_IfSourceIsOfficial_BeforeAddingInDatabase()
        {
            var executionContext          = new NaheulbookExecutionContext();
            var createItemTemplateRequest = new ItemTemplateRequest {
                Source = "official"
            };

            _authorizationUtil.EnsureAdminAccessAsync(executionContext)
            .Throws(new TestException());

            Func <Task <ItemTemplate> > act = () => _service.CreateItemTemplateAsync(executionContext, createItemTemplateRequest);

            act.Should().Throw <TestException>();
            await _unitOfWorkFactory.GetUnitOfWork().DidNotReceive().SaveChangesAsync();
        }
예제 #7
0
        public void ApplyChangesFromRequest_UpdateSlotList()
        {
            var slot1 = CreateSlot(1);
            var slot2 = CreateSlot(1);

            var itemTemplate = new ItemTemplate
            {
                Slots = new List <ItemTemplateSlot>
                {
                    new ItemTemplateSlot
                    {
                        SlotId = 1,
                        Slot   = slot1
                    },
                    new ItemTemplateSlot
                    {
                        SlotId = 2,
                        Slot   = slot2
                    }
                }
            };

            var request = new ItemTemplateRequest
            {
                Slots = new List <IdRequest>
                {
                    new IdRequest {
                        Id = 2
                    },
                    new IdRequest {
                        Id = 3
                    },
                }
            };

            _util.ApplyChangesFromRequest(itemTemplate, request);

            itemTemplate.Slots.Should().BeEquivalentTo(
                new ItemTemplateSlot
            {
                SlotId = 2
            },
                new ItemTemplateSlot
            {
                SlotId = 3
            }
                );
        }
예제 #8
0
        public async Task PutItemTemplateAsync_CallServiceToEditItem_AndMapEditedItemIntoResponse()
        {
            var itemTemplateId       = Guid.NewGuid();
            var itemTemplate         = new ItemTemplate();
            var itemTemplateRequest  = new ItemTemplateRequest();
            var itemTemplateResponse = new ItemTemplateResponse();

            _itemTemplateService.EditItemTemplateAsync(_executionContext, itemTemplateId, itemTemplateRequest)
            .Returns(itemTemplate);
            _mapper.Map <ItemTemplateResponse>(itemTemplate)
            .Returns(itemTemplateResponse);

            var result = await _itemTemplatesController.PutItemTemplateAsync(_executionContext, itemTemplateId, itemTemplateRequest);

            result.Value.Should().Be(itemTemplateResponse);
        }
예제 #9
0
        public void ApplyChangesFromRequest_UpdateCleanName()
        {
            var itemTemplate = new ItemTemplate {
                Name = "some-name"
            };
            var request = new ItemTemplateRequest {
                Name = "some-new-name"
            };

            _stringCleanupUtil.RemoveAccents("some-new-name")
            .Returns("some-new-clean-name");

            _util.ApplyChangesFromRequest(itemTemplate, request);

            itemTemplate.CleanName.Should().BeEquivalentTo("some-new-clean-name");
        }
예제 #10
0
        public async Task PostCreateItemTemplate_CallItemService()
        {
            var itemTemplateRequest  = new ItemTemplateRequest();
            var itemTemplate         = new ItemTemplate();
            var itemTemplateResponse = new ItemTemplateResponse();

            _itemTemplateService.CreateItemTemplateAsync(_executionContext, itemTemplateRequest)
            .Returns(itemTemplate);
            _mapper.Map <ItemTemplateResponse>(itemTemplate)
            .Returns(itemTemplateResponse);

            var result = await _itemTemplatesController.PostCreateItemTemplateAsync(_executionContext, itemTemplateRequest);

            result.StatusCode.Should().Be(201);
            result.Value.Should().Be(itemTemplateResponse);
        }
        public void ApplyChangesFromRequest(ItemTemplate itemTemplate, ItemTemplateRequest request)
        {
            itemTemplate.Name          = request.Name;
            itemTemplate.TechName      = request.TechName;
            itemTemplate.Source        = request.Source;
            itemTemplate.SubCategoryId = request.SubCategoryId;
            itemTemplate.Data          = JsonConvert.SerializeObject(request.Data, Formatting.None);

            itemTemplate.CleanName = _stringCleanupUtil.RemoveAccents(request.Name);

            itemTemplate.Slots = request.Slots?.Select(x => new ItemTemplateSlot {
                SlotId = x.Id
            }).ToList() ?? new List <ItemTemplateSlot>();

            itemTemplate.Requirements = request.Requirements?.Select(x => new ItemTemplateRequirement
            {
                StatName = x.Stat,
                MaxValue = x.Max,
                MinValue = x.Min
            }).ToList() ?? new List <ItemTemplateRequirement>();

            itemTemplate.Modifiers = request.Modifiers?.Select(x => new ItemTemplateModifier
            {
                StatName         = x.Stat,
                RequiredJobId    = x.JobId,
                RequiredOriginId = x.OriginId,
                Value            = x.Value,
                Type             = x.Type,
                Special          = x.Special == null ? "" : string.Join(',', x.Special)
            }).ToList() ?? new List <ItemTemplateModifier>();

            itemTemplate.Skills = request.SkillIds?.Select(skillId => new ItemTemplateSkill
            {
                SkillId = skillId
            }).ToList() ?? new List <ItemTemplateSkill>();

            itemTemplate.UnSkills = request.UnSkillIds?.Select(skillId => new ItemTemplateUnSkill
            {
                SkillId = skillId
            }).ToList() ?? new List <ItemTemplateUnSkill>();

            itemTemplate.SkillModifiers = request.SkillModifiers?.Select(x => new ItemTemplateSkillModifier
            {
                SkillId = x.SkillId,
                Value   = x.Value
            }).ToList() ?? new List <ItemTemplateSkillModifier>();
        }
예제 #12
0
        public async Task EditItemTemplateAsync_LoadEntityWithRelatedStuff_ThenApplyChangesFromRequest_ThenSave()
        {
            var itemTemplateId          = Guid.NewGuid();
            var itemTemplateRequest     = new ItemTemplateRequest();
            var fullyLoadedItemTemplate = new ItemTemplate {
                Id = itemTemplateId
            };

            _unitOfWorkFactory.GetUnitOfWork().ItemTemplates.GetWithModifiersWithRequirementsWithSkillsWithSkillModifiersWithSlotsWithUnSkillsAsync(itemTemplateId)
            .Returns(fullyLoadedItemTemplate);

            await _service.EditItemTemplateAsync(new NaheulbookExecutionContext(), itemTemplateId, itemTemplateRequest);

            Received.InOrder(() =>
            {
                _itemTemplateUtil.ApplyChangesFromRequest(fullyLoadedItemTemplate, itemTemplateRequest);
                _unitOfWorkFactory.GetUnitOfWork().SaveChangesAsync();
            });
        }
예제 #13
0
        public async Task EditItemTemplateAsync_ShouldSetNullSourceUserId_IfSourceIsOfficial()
        {
            var itemTemplateId      = Guid.NewGuid();
            var itemTemplateRequest = new ItemTemplateRequest {
                Source = "official"
            };
            var fullyLoadedItemTemplate = new ItemTemplate {
                Id = itemTemplateId
            };
            var naheulbookExecutionContext = new NaheulbookExecutionContext();

            _unitOfWorkFactory.GetUnitOfWork().ItemTemplates.GetWithModifiersWithRequirementsWithSkillsWithSkillModifiersWithSlotsWithUnSkillsAsync(itemTemplateId)
            .Returns(fullyLoadedItemTemplate);
            _unitOfWorkFactory.GetUnitOfWork().When(x => x.SaveChangesAsync())
            .Do(_ => fullyLoadedItemTemplate.SourceUserId.Should().BeNull());

            await _service.EditItemTemplateAsync(naheulbookExecutionContext, itemTemplateId, itemTemplateRequest);

            await _unitOfWorkFactory.GetUnitOfWork().Received(1).SaveChangesAsync();
        }
        public async Task <JsonResult> PostCreateItemTemplateAsync(
            [FromServices] NaheulbookExecutionContext executionContext,
            ItemTemplateRequest request
            )
        {
            try
            {
                var itemTemplate = await _itemTemplateService.CreateItemTemplateAsync(executionContext, request);

                var itemTemplateResponse = _mapper.Map <ItemTemplateResponse>(itemTemplate);
                return(new JsonResult(itemTemplateResponse)
                {
                    StatusCode = StatusCodes.Status201Created
                });
            }
            catch (ForbiddenAccessException ex)
            {
                throw new HttpErrorException(StatusCodes.Status403Forbidden, ex);
            }
        }
예제 #15
0
        public async Task CreateItemTemplate_SetSourceUserIdForNonOfficialItem()
        {
            var itemTemplateId   = Guid.NewGuid();
            var executionContext = new NaheulbookExecutionContext {
                UserId = 42
            };
            var createItemTemplateRequest = new ItemTemplateRequest {
                Source = "non-official"
            };
            var newItemTemplateEntity = new ItemTemplate {
                Id = itemTemplateId
            };

            _mapper.Map <ItemTemplate>(createItemTemplateRequest)
            .Returns(newItemTemplateEntity);
            _unitOfWorkFactory.GetUnitOfWork().When(x => x.SaveChangesAsync())
            .Do(_ => newItemTemplateEntity.SourceUserId.Should().Be(42));

            await _service.CreateItemTemplateAsync(executionContext, createItemTemplateRequest);

            await _unitOfWorkFactory.GetUnitOfWork().Received(1).SaveChangesAsync();
        }
예제 #16
0
        public void ApplyChangesFromRequest_UpdateSkillModifiers()
        {
            var itemTemplate = new ItemTemplate
            {
                SkillModifiers = new List <ItemTemplateSkillModifier>
                {
                    new ItemTemplateSkillModifier {
                        SkillId = new Guid("00000000-0000-0000-0000-000000000001"), Value = 1
                    },
                    new ItemTemplateSkillModifier {
                        SkillId = new Guid("00000000-0000-0000-0000-000000000002"), Value = 2
                    }
                }
            };

            var request = new ItemTemplateRequest
            {
                SkillModifiers = new List <ItemTemplateSkillModifierRequest>
                {
                    new ItemTemplateSkillModifierRequest {
                        SkillId = new Guid("00000000-0000-0000-0000-000000000004"), Value = 3
                    },
                    new ItemTemplateSkillModifierRequest {
                        SkillId = new Guid("00000000-0000-0000-0000-000000000005"), Value = 4
                    },
                }
            };

            _util.ApplyChangesFromRequest(itemTemplate, request);

            itemTemplate.SkillModifiers.Should().BeEquivalentTo(
                new ItemTemplateSkillModifier {
                SkillId = new Guid("00000000-0000-0000-0000-000000000004"), Value = 3
            },
                new ItemTemplateSkillModifier {
                SkillId = new Guid("00000000-0000-0000-0000-000000000005"), Value = 4
            }
                );
        }
예제 #17
0
        public void EditItemTemplateAsync_CheckPermissionBeforeChangingSourceOfAnItemToAdmin()
        {
            var itemTemplateId   = Guid.NewGuid();
            var executionContext = new NaheulbookExecutionContext();
            var request          = new ItemTemplateRequest {
                Source = "official"
            };
            var fullyLoadedItemTemplate = new ItemTemplate {
                Id = itemTemplateId, Source = "private"
            };

            _unitOfWorkFactory.GetUnitOfWork().ItemTemplates.GetWithModifiersWithRequirementsWithSkillsWithSkillModifiersWithSlotsWithUnSkillsAsync(itemTemplateId)
            .Returns(fullyLoadedItemTemplate);
            _authorizationUtil.EnsureAdminAccessAsync(executionContext)
            .Returns(Task.FromException(new TestException()));

            Func <Task <ItemTemplate> > act = () => _service.EditItemTemplateAsync(executionContext, itemTemplateId, request);

            using (new AssertionScope())
            {
                act.Should().Throw <TestException>();
                _unitOfWorkFactory.GetUnitOfWork().DidNotReceive().SaveChangesAsync();
            }
        }
예제 #18
0
        public void ApplyChangesFromRequest_UpdateModiifers()
        {
            var itemTemplate = new ItemTemplate
            {
                Modifiers = new List <ItemTemplateModifier>
                {
                    new ItemTemplateModifier
                    {
                        Id       = 1,
                        StatName = "some-stat-name-1",
                        Value    = 2,
                        Special  = "some-special-1"
                    },
                    new ItemTemplateModifier
                    {
                        Id       = 2,
                        StatName = "some-stat-name-2",
                        Value    = 3,
                        Special  = "some-special-2",
                    }
                }
            };

            var request = new ItemTemplateRequest
            {
                Modifiers = new List <ItemTemplateModifierRequest>
                {
                    new ItemTemplateModifierRequest
                    {
                        Stat  = "some-stat-name-2",
                        JobId = new Guid("00000000-0000-0000-0000-000000000011"),
                        Type  = "ADD",
                        Value = 3
                    },
                    new ItemTemplateModifierRequest
                    {
                        Stat     = "some-stat-name-3",
                        OriginId = new Guid("00000000-0000-0000-0000-000000000001"),
                        Type     = "ADD",
                        Value    = 3,
                        Special  = new List <string> {
                            "some-special-3"
                        }
                    }
                }
            };

            _util.ApplyChangesFromRequest(itemTemplate, request);

            itemTemplate.Modifiers.Should().BeEquivalentTo(
                new ItemTemplateModifier
            {
                StatName      = "some-stat-name-2",
                RequiredJobId = new Guid("00000000-0000-0000-0000-000000000011"),
                Type          = "ADD",
                Value         = 3,
                Special       = ""
            },
                new ItemTemplateModifier
            {
                StatName         = "some-stat-name-3",
                RequiredOriginId = new Guid("00000000-0000-0000-0000-000000000001"),
                Type             = "ADD",
                Value            = 3,
                Special          = "some-special-3"
            }
                );
        }
예제 #19
0
        public async Task <ItemTemplate> EditItemTemplateAsync(NaheulbookExecutionContext executionContext, Guid itemTemplateId, ItemTemplateRequest request)
        {
            using (var uow = _unitOfWorkFactory.CreateUnitOfWork())
            {
                var itemTemplate = await uow.ItemTemplates.GetWithModifiersWithRequirementsWithSkillsWithSkillModifiersWithSlotsWithUnSkillsAsync(itemTemplateId);

                if (itemTemplate == null)
                {
                    throw new ItemTemplateNotFoundException(itemTemplateId);
                }

                await _authorizationUtil.EnsureCanEditItemTemplateAsync(executionContext, itemTemplate);

                if (itemTemplate.Source != request.Source)
                {
                    if (request.Source == "official")
                    {
                        await _authorizationUtil.EnsureAdminAccessAsync(executionContext);

                        itemTemplate.SourceUserId = null;
                    }
                    else
                    {
                        itemTemplate.SourceUserId = executionContext.UserId;
                    }
                }
                _itemTemplateUtil.ApplyChangesFromRequest(itemTemplate, request);

                await uow.SaveChangesAsync();

                return((await uow.ItemTemplates.GetWithModifiersWithRequirementsWithSkillsWithSkillModifiersWithSlotsWithUnSkillsAsync(itemTemplateId)) !);
            }
        }
예제 #20
0
        public async Task <ItemTemplate> CreateItemTemplateAsync(NaheulbookExecutionContext executionContext, ItemTemplateRequest request)
        {
            if (request.Source == "official")
            {
                await _authorizationUtil.EnsureAdminAccessAsync(executionContext);
            }

            var itemTemplate = _mapper.Map <ItemTemplate>(request);

            if (request.Source != "official")
            {
                itemTemplate.SourceUserId = executionContext.UserId;
            }

            using (var uow = _unitOfWorkFactory.CreateUnitOfWork())
            {
                uow.ItemTemplates.Add(itemTemplate);
                await uow.SaveChangesAsync();

                itemTemplate = (await uow.ItemTemplates.GetWithModifiersWithRequirementsWithSkillsWithSkillModifiersWithSlotsWithUnSkillsAsync(itemTemplate.Id)) !;
            }

            return(itemTemplate);
        }