public async Task EditShouldEditTrade()
        {
            // Arrange
            this.FillDatabase();
            this.editModel = new EditTradeInputModel
            {
                Id = "trade1",
                InvestmentWalletId = 1,
                Quantity           = 11,
                Price           = 120,
                Type            = ViewModels.Trades.Enums.TradeType.Buy,
                SelectedCompany = new CompanyViewModel
                {
                    Id     = "company3",
                    Name   = "Amazon",
                    Ticker = "amzn",
                },
            };

            // Act
            var result = await this.controller.Edit(this.editModel);

            // Assert
            var redirectResult = Assert.IsType <RedirectResult>(result);
            var editedTrade    = this.db.Trades.FirstOrDefault(x => x.Id == "trade1");

            Assert.Equal(TradeType.Buy, editedTrade.Type);
            Assert.Equal("company3", editedTrade.CompanyId);
            Assert.Equal("AMZN", editedTrade.Company.Ticker);
            Assert.Equal("Amazon", editedTrade.Company.Name);
            Assert.Equal(11, editedTrade.StockQuantity);
            Assert.Equal(-120, editedTrade.Price);
            Assert.Equal(1, editedTrade.InvestmentWalletId);
            Assert.Equal(3, this.db.Trades.Count());
        }
        public async Task <IActionResult> Edit(string id)
        {
            var user = await this.userManager.GetUserAsync(this.User);

            try
            {
                var companies = await this.companiesService.GetAllCompaniesAsync();

                var result = await this.tradesService.GetTradeInfoForEdit(user.Id, id);

                var model = new EditTradeInputModel
                {
                    Id               = result.Id,
                    CreatedOn        = result.CreatedOn,
                    Quantity         = result.Quantity,
                    Type             = Enum.Parse <TradeType>(result.Type.ToString()),
                    Price            = result.Price,
                    InvestmentWallet = new InvestmentWalletIdNameAndCurrencyViewModel
                    {
                        Id           = result.InvestmentWallet.Id,
                        CurrencyCode = result.InvestmentWallet.CurrencyCode,
                        Name         = result.InvestmentWallet.Name,
                    },
                    AllInvestmentWallets = result.AllInvestmentWallets.Select(iw => new InvestmentWalletIdNameAndCurrencyViewModel
                    {
                        Id           = iw.Id,
                        CurrencyCode = iw.CurrencyCode,
                        Name         = iw.Name,
                    }),
                    SelectedCompany = new CompanyViewModel
                    {
                        Name   = result.SelectedCompany.Name,
                        Ticker = result.SelectedCompany.Ticker,
                        Id     = result.SelectedCompany.Id,
                    },
                    Companies = companies.Select(c => new CompanyViewModel
                    {
                        Name   = c.Name,
                        Ticker = c.Ticker,
                        Id     = c.Id,
                    })
                                .ToList(),
                };

                return(this.View(model));
            }
            catch (Exception ex)
            {
                return(this.Redirect($"/Home/Error?message={ex.Message}"));
            }
        }
        public async Task <IActionResult> Edit(EditTradeInputModel input)
        {
            var user = await this.userManager.GetUserAsync(this.User);

            try
            {
                if (!this.ModelState.IsValid)
                {
                    var companies = await this.companiesService.GetAllCompaniesAsync();

                    var result = await this.tradesService.GetTradeInfoForEdit(user.Id, input.Id);

                    input.AllInvestmentWallets = result.AllInvestmentWallets.Select(iw => new InvestmentWalletIdNameAndCurrencyViewModel
                    {
                        Id           = iw.Id,
                        CurrencyCode = iw.CurrencyCode,
                        Name         = iw.Name,
                    });

                    input.SelectedCompany = new CompanyViewModel
                    {
                        Name   = result.SelectedCompany.Name,
                        Ticker = result.SelectedCompany.Ticker,
                        Id     = result.SelectedCompany.Id,
                    };

                    input.Companies = companies.Select(c => new CompanyViewModel
                    {
                        Name   = c.Name,
                        Ticker = c.Ticker,
                        Id     = c.Id,
                    })
                                      .ToList();

                    input.InvestmentWallet = new InvestmentWalletIdNameAndCurrencyViewModel
                    {
                        Id           = result.InvestmentWallet.Id,
                        CurrencyCode = result.InvestmentWallet.CurrencyCode,
                        Name         = result.InvestmentWallet.Name,
                    };

                    input.Type = Enum.Parse <TradeType>(result.Type.ToString());

                    return(this.View(input));
                }

                await this.tradesService
                .UpdateAsync(
                    user.Id,
                    input.Id,
                    input.SelectedCompany.Id,
                    input.InvestmentWalletId,
                    input.Price,
                    input.Quantity,
                    input.CreatedOn);

                return(this.Redirect($"/Investments/Trades/{input.InvestmentWalletId}"));
            }
            catch (Exception ex)
            {
                return(this.Redirect($"/Home/Error?message={ex.Message}"));
            }
        }