public void CreateAd_Should_Succsessfully_Add_To_Repository()
        {
            // Arrange
            var ads = new List<Ad>();
            var fakeUser = this.mocks.UserRepositoryMock.Object.All()
                .FirstOrDefault();

            if (fakeUser == null)
            {
                Assert.Fail("Cannot perform test - no users available.");
            }

            this.mocks.AdRepositoryMock
                .Setup(r => r.Add(It.IsAny<Ad>()))
                .Callback((Ad ad) =>
                {
                    ad.Owner = fakeUser;
                    ads.Add(ad);
                });

            var mockContext = new Mock<IOnlineShopData>();
            mockContext.Setup(c => c.Ads)
                .Returns(this.mocks.AdRepositoryMock.Object);
            mockContext.Setup(c => c.Categories)
                .Returns(this.mocks.CategoryRepositoryMock.Object);
            mockContext.Setup(c => c.Users)
                .Returns(this.mocks.UserRepositoryMock.Object);
            mockContext.Setup(c => c.AdTypes)
                .Returns(this.mocks.AdTypeRepositoryMock.Object);

            var mockUserIdProvider = new Mock<IUserIdProvider>();
            mockUserIdProvider.Setup(uip => uip.GetUserId())
                .Returns(fakeUser.Id);

            var adsController = new AdsController(mockContext.Object, mockUserIdProvider.Object);
            this.SetupController(adsController);

            var randomName = Guid.NewGuid().ToString();
            var newAd = new CreateAdBindingModel
            {
                Name = randomName,
                Price = 555,
                TypeId = 1,
                Description = "Some description.",
                Categories = new[] { 3, 1, 99 }
            };

            var response = adsController.CreateAd(newAd)
                .ExecuteAsync(CancellationToken.None).Result;

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            mockContext.Verify(c => c.SaveChanges(), Times.Once);
            Assert.AreEqual(1, ads.Count);
            Assert.AreEqual(newAd.Name, ads[0].Name);
        }
        public void CreateAd_ShouldAddNewlyCreatedAd()
        {
            var ads = new List<Ad>();

            var fakeUser = this.mockContainer.UserRepositoryMock.Object.All().FirstOrDefault();
            if (fakeUser == null)
            {
                Assert.Fail("Cannot perform test - no users available.");
            }

            this.mockContainer.AdRepositoryMock
                .Setup(r => r.Add(It.IsAny<Ad>()))
                .Callback((Ad ad) =>
                {
                    ad.Owner = fakeUser;
                    ads.Add(ad);
                });

            var fakeCat = mockContainer.CategoryRepositoryMock.Object.All();
            var fakeAdTypes = mockContainer.AdTypeRepositoryMock.Object.All();
            var fakeUsers = mockContainer.UserRepositoryMock.Object.All();

            var mockContext = new Mock<IOnlineShopData>();
            mockContext.Setup(r => r.Ads.All()).Returns(ads.AsQueryable());
            mockContext.Setup(r => r.Ads.Add(It.IsAny<Ad>())).Callback((Ad ad) => ads.Add(ad));

            mockContext.Setup(r => r.Categories.All()).Returns(fakeCat.AsQueryable());
            mockContext.Setup(r => r.AdTypes.All()).Returns(fakeAdTypes.AsQueryable());
            mockContext.Setup(r => r.Users.All()).Returns(fakeUsers.AsQueryable());

            var mockIdProvider = new Mock<IUserIdProvider>();
            mockIdProvider.Setup(r => r.GetUserId()).Returns(fakeUser.Id);

            var adsController = new AdsController(mockContext.Object, mockIdProvider.Object);
            this.SetupController(adsController);

            var randomName = Guid.NewGuid().ToString();
            var newAd = new CreateAdBindingModel()
            {
                Name = randomName,
                Price = 555,
                TypeId = 1,
                Description = "Testing testing",
                Categories = new[] { 1, 2, 3 }
            };

            var response = adsController.CreateAd(newAd).ExecuteAsync(CancellationToken.None).Result;
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);

            mockContext.Verify(c => c.SaveChanges(), Times.Once);

            Assert.AreEqual(1, ads.Count);
            Assert.AreEqual(randomName, ads.First().Name);
        }
        public void CreateAd_WithCorrectData_ShouldSuccessfullyAddAdInRepository()
        {
            // Arrange
            var ads = new List<Ad>();

            // Act
            var mockContext = new Mock<IOnlineShopData>();
            var fakeAds = this.mockContainer.AdRepositoryMock.Object.All();
            var fakeAdTypes = this.mockContainer.AdTypeRepositoryMock.Object.All();
            var fakeCategories = this.mockContainer.CategoryRepositoryMock.Object.All();
            var fakeUsers = this.mockContainer.ApplicationUserRepositoryMock.Object.All();

            mockContext.Setup(r => r.Ads).Returns(this.mockContainer.AdRepositoryMock.Object);
            mockContext.Setup(r => r.AdTypes).Returns(this.mockContainer.AdTypeRepositoryMock.Object);
            mockContext.Setup(r => r.Categories).Returns(this.mockContainer.CategoryRepositoryMock.Object);
            mockContext.Setup(r => r.ApplicationUsers).Returns(this.mockContainer.ApplicationUserRepositoryMock.Object);
            var fakeUser = this.mockContainer.ApplicationUserRepositoryMock.Object.All().FirstOrDefault();
            var mockIdProvider = new Mock<IUserIdProvider>();
            if (fakeUser == null)
            {
                Assert.Fail("Cannot perform test no users available.");
            }

            mockIdProvider.Setup(r => r.GetUserId()).Returns(fakeUser.Id);

            var adsController = new AdsController(mockContext.Object, mockIdProvider.Object);
            this.SetupController(adsController);
            this.mockContainer.AdRepositoryMock.Setup(r => r.Add(It.IsAny<Ad>()))
                .Callback((Ad ad) =>
                {
                   // ad.Id = 10;   // Uncomment if id is required in the test
                    ad.Owner = fakeUser;
                    ads.Add(ad);
                });
            var randomName = Guid.NewGuid().ToString();
            var newAd = new CreateAdBindingModel()
                        {
                            Name = randomName,
                            Price = 555,
                            TypeId = 1,
                            Description = "Put description here",
                            Categories = new[] { 1, 2 }
                        };

            var httpResponse = adsController.CreateAd(newAd).ExecuteAsync(CancellationToken.None).Result;

            // Assert
            mockContext.Verify(c => c.SaveChanges(), Times.Once);
            Assert.AreEqual(1, ads.Count);
            Assert.AreEqual(ads[0].Name, newAd.Name);
        }