public async Task GetAnalysis_NoSellData_ShouldReturnOnly1RowForBuyData()
        {
            //Arrange
            // Seeding the test data with only BUY data presents
            var returnTrade1 = new Trade[5]
            {
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 10, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 20, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 30, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 40, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 50, PortfolioId = 1, Price = 10, Symbol = "CBI"
                }
            };

            _tradeRepositoryMock.Setup(i => i.Query()).Returns(returnTrade1.AsQueryable());
            //Act
            var result = _tradeController.GetAnalysis("CBI").GetAwaiter().GetResult() as OkObjectResult;
            var list   = result.Value as List <TradeAnalysis>;

            //Assert
            Assert.NotNull(list);
            Assert.AreEqual(1, list.Count);       // return 1 row each with different group
        }
        public async Task GetAnalysis_NoMatchingData_ShouldReturnNotFound()
        {
            //Arrange
            // Seeding the test data with only BUY data presents
            var returnTrade1 = new Trade[5]
            {
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 10, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 20, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 30, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 40, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 50, PortfolioId = 1, Price = 10, Symbol = "CBI"
                }
            };

            _tradeRepositoryMock.Setup(i => i.Query()).Returns(returnTrade1.AsQueryable());
            //Act
            var result = _tradeController.GetAnalysis("REL").GetAwaiter().GetResult() as NotFoundResult;

            //Assert
            Assert.AreEqual(404, result.StatusCode);
        }
        public async Task GetAnalysis_ShouldReturnCalulatedData()
        {
            // Arrange
            // Seeding the test data with both BUY and SELL data presents
            var returnTrade = new Trade [10]
            {
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 10, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 20, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 30, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 40, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_BUY, NoOfShares = 50, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_SELL, NoOfShares = 100, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_SELL, NoOfShares = 200, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_SELL, NoOfShares = 300, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_SELL, NoOfShares = 400, PortfolioId = 1, Price = 10, Symbol = "CBI"
                },
                new Trade {
                    Id = 0, Action = TradeAnalysis.ACTION_SELL, NoOfShares = 500, PortfolioId = 1, Price = 10, Symbol = "CBI"
                }
            };

            _tradeRepositoryMock.Setup(i => i.Query()).Returns(returnTrade.AsQueryable());
            // Act
            var result = _tradeController.GetAnalysis("CBI").GetAwaiter().GetResult() as OkObjectResult;
            var list   = result.Value as List <TradeAnalysis>;

            // Assert
            Assert.NotNull(list);
            Assert.AreEqual(2, list.Count);       // return 2 rows each with different group
            Assert.AreEqual(50, list[0].Maximum); // Acquire the BUYs to verify calculated data
            Assert.AreEqual(10, list[0].Minimum);
            Assert.AreEqual(30, list[0].Average);
            Assert.AreEqual(150, list[0].Sum);
        }