public async Task CreateAsync_WithEmptyNameShouldThrowArgumentNullException()
        {
            MapperInitializer.InitializeMapper();
            var context                = ApplicationDbContextInMemoryFactory.InitializeContext();
            var firmService            = new FirmService(context);
            var createFirmServiceModel = new CreateFirmServiceModel();
            var firmName               = "  ";

            createFirmServiceModel.Name = firmName;

            await Assert.ThrowsAsync <ArgumentNullException>(async() =>
            {
                await firmService.CreateAsync(createFirmServiceModel);
            });
        }
        public async Task CreateAsync_WithOverMaxNameLengthShouldThrowInvalidOperationException()
        {
            MapperInitializer.InitializeMapper();
            var context                = ApplicationDbContextInMemoryFactory.InitializeContext();
            var firmService            = new FirmService(context);
            var createFirmServiceModel = new CreateFirmServiceModel();
            var firmName               = "qwertyuiop qwertyuiop qwertyuiop qwertyuiop qwertyuiop";

            createFirmServiceModel.Name = firmName;
            var message = "Firm's Name cannot be more than 50 characters.";

            var exception = await Assert.ThrowsAsync <InvalidOperationException>(async() =>
            {
                await firmService.CreateAsync(createFirmServiceModel);
            });

            Assert.Equal(message, exception.Message);
        }
        public async Task CreateAsync_ShouldSuccessfullyCreate()
        {
            MapperInitializer.InitializeMapper();
            var context                = ApplicationDbContextInMemoryFactory.InitializeContext();
            var firmService            = new FirmService(context);
            var createFirmServiceModel = new CreateFirmServiceModel();
            var firmName               = "FN 1";

            createFirmServiceModel.Name = firmName;

            await firmService.CreateAsync(createFirmServiceModel);

            var expectedResult = firmName;
            var actualResult   = firmService
                                 .All()
                                 .First()
                                 .Name;

            Assert.True(expectedResult == actualResult);
        }
        public async Task CreateAsync_WithExistingNameShouldThrowInvalidOperationException()
        {
            MapperInitializer.InitializeMapper();
            var context = ApplicationDbContextInMemoryFactory.InitializeContext();

            await this.SeedDataAsync(context);

            var firmService            = new FirmService(context);
            var createFirmServiceModel = new CreateFirmServiceModel();
            var firmName = "FN 1";

            createFirmServiceModel.Name = firmName;
            var message = "Firm's name already exists.";

            var exception = await Assert.ThrowsAsync <InvalidOperationException>(async() =>
            {
                await firmService.CreateAsync(createFirmServiceModel);
            });

            Assert.Equal(message, exception.Message);
        }
        public async Task CreateAsync(CreateFirmServiceModel createFirmServiceModel)
        {
            var firm = AutoMapperConfig.MapperInstance.Map <Firm>(createFirmServiceModel);

            if (string.IsNullOrWhiteSpace(firm.Name))
            {
                throw new ArgumentNullException(EmptyFirmErrorMessage);
            }

            if (await this.context.Firms.AnyAsync(f => f.Name == firm.Name))
            {
                throw new InvalidOperationException(FirmExistErrorMessage);
            }

            if (firm.Name.Length > AttributesConstraints.FirmNameMaxLength)
            {
                throw new InvalidOperationException(string.Format(FirmNameMaxLengthErrorMessage, AttributesConstraints.FirmNameMaxLength));
            }

            await this.context.Firms.AddAsync(firm);

            await this.context.SaveChangesAsync();
        }