public void CloseAd_FromNonOwner()
        {
            var openAd = mockContainer.AdRepositoryMock.Object.All().FirstOrDefault(ad => ad.Status == AdStatus.Open);

            if (openAd == null)
            {
                Assert.Fail("No ads with open status available");
            }

            var adId = openAd.Id;
            var mockContext = new Mock<IOnlineShopData>();
            mockContext.Setup(r => r.Ads).Returns(this.mockContainer.AdRepositoryMock.Object);

            var mockIdProvider = new Mock<IUserIdProvider>();
            mockIdProvider.Setup(r => r.GetUserId())
                .Returns(this.mockContainer.UserRepositoryMock.Object.All().FirstOrDefault(u => u.Id != openAd.OwnerId).Id);

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

            var resposnse = adsController.CloseAd(adId).ExecuteAsync(CancellationToken.None).Result;
            Assert.AreEqual(HttpStatusCode.BadRequest, resposnse.StatusCode);
            mockContext.Verify(c => c.SaveChanges(), Times.Never);
            var stillOpenAd = mockContext.Object.Ads.Find(adId);
            Assert.AreEqual(AdStatus.Open, stillOpenAd.Status);
        }
        public void ClosingAdd_AsOwner_ShouldReturn200Ok()
        {
            // Arrange
            var fakeAds = this.mockContainer.AdRepositoryMock.Object.All();

            // Act
            var openAd = fakeAds.FirstOrDefault(a => a.Status == AdStatus.Open);
            if (openAd == null)
            {
                Assert.Fail("Cannot perform test there is no open ads.");
            }

            var adId = openAd.Id;
            var mockContext = new Mock<IOnlineShopData>();
            mockContext.Setup(c => c.Ads).Returns(this.mockContainer.AdRepositoryMock.Object);
            var mockProvider = new Mock<IUserIdProvider>();
            mockProvider.Setup(ip => ip.GetUserId()).Returns(openAd.OwnerId);

            var adsController = new AdsController(mockContext.Object, mockProvider.Object);
            this.SetupController(adsController);
            var httpResponse = adsController.CloseAd(adId).ExecuteAsync(CancellationToken.None).Result;

            // Assert
            mockContext.Verify(c => c.SaveChanges(), Times.Once);
            Assert.AreEqual(AdStatus.Closed, openAd.Status);
            Assert.IsNotNull(openAd.ClosedOn);
        }
        public void CloseAd_AsNotAdOwner_ShouldReturn400BadRequest()
        {
            // Arrange
            var fakeAds = this.mockContainer.AdRepositoryMock.Object.All();

            // Act
            var openAd = fakeAds.FirstOrDefault(a => a.Status == AdStatus.Open);
            if (openAd == null)
            {
                Assert.Fail("Cannot perform test, because there are no open ads.");
            }

            var mockContext = new Mock<IOnlineShopData>();
            mockContext.Setup(c => c.Ads).Returns(this.mockContainer.AdRepositoryMock.Object);

            var mockProvider = new Mock<IUserIdProvider>();
            var fakeUsers = this.mockContainer.ApplicationUserRepositoryMock.Object.All();
            var nonExistingUser = fakeUsers.FirstOrDefault();
            mockProvider.Setup(ip => ip.GetUserId()).Returns(nonExistingUser.Id);
            var adsController = new AdsController(mockContext.Object, mockProvider.Object);
            this.SetupController(adsController);

            var httpResponse = adsController.CloseAd(openAd.Id).ExecuteAsync(CancellationToken.None).Result;

            // Assert
            Assert.AreEqual(HttpStatusCode.BadRequest, httpResponse.StatusCode);
            Assert.AreEqual(AdStatus.Open, openAd.Status);
            Assert.IsNull(openAd.ClosedOn);
        }
        public void Closing_Ad_As_NonOwner_Should_Return_400BadRequest()
        {
            var openAd = this.mocks.AdRepositoryMock.Object
                .All()
                .FirstOrDefault(a => a.Status == AdStatus.Open);
            if (openAd == null)
            {
                Assert.Fail("Can not perform this test-no open ads available.");
            }
            var adId = openAd.Id;

            var fakeUsers = this.mocks.UserRepositoryMock.Object;
            ApplicationUser foreignUser = fakeUsers.All().FirstOrDefault(f => f.Id != openAd.OwnerId);
            if (foreignUser == null)
            {
                Assert.Fail("Can not perform this test - need user who is not the owner ");
            }

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

            var mockContext = new Mock<IOnlineShopData>();
            mockContext.Setup(m => m.Ads).Returns(this.mocks.AdRepositoryMock.Object);
            
            var adsController = new AdsController(mockContext.Object,mockIdProvider.Object);
            SetupController(adsController);

            var response = adsController.CloseAd(adId).ExecuteAsync(CancellationToken.None).Result;

            Assert.AreEqual(HttpStatusCode.BadRequest,response.StatusCode);

        }
        public void Closing_Ad_As_Owner_Should_Return_200OK()
        {
            var fakeAd = this.mocks.AdRepositoryMock.Object.All();

            var openAd = fakeAd.FirstOrDefault(f => f.Status == AdStatus.Open);
            if (openAd == null)
            {
                Assert.Fail("Can not perform test -no open ads available.");
            }
            
            var adId = openAd.Id;
            var mockContext = new Mock<IOnlineShopData>();
            mockContext.Setup(m => m.Ads).Returns(this.mocks.AdRepositoryMock.Object);

            var mockIdProvider = new Mock<IUserIdProvider>();
            
            mockIdProvider.Setup(id => id.GetUserId()).Returns(openAd.OwnerId);

            var adsController = new AdsController(mockContext.Object,mockIdProvider.Object);
            this.SetupController(adsController);
            var response = adsController.CloseAd(adId).ExecuteAsync(CancellationToken.None).Result;

            Assert.AreEqual(response.StatusCode,HttpStatusCode.OK);
            mockContext.Verify(m=>m.SaveChanges(),Times.Once);

            Assert.IsNotNull(openAd.ClosedOn);
            Assert.AreEqual(openAd.Status,AdStatus.Closed);

        }
        public void TestCloseAds_ShouldCloseAnAd()
        {
            var fakeAds = mockContainer.AdRepositoryMock.Object.All();
            var openAd = fakeAds.FirstOrDefault(ad => ad.Status == AdStatus.Open);

            if (openAd == null)
            {
                Assert.Fail("No open ads - cannot perform test");
            }

            var adId = openAd.Id;
            var mockContext = new Mock<IOnlineShopData>();
            mockContext.Setup(r => r.Ads).Returns(this.mockContainer.AdRepositoryMock.Object);

            var mockIdProvider = new Mock<IUserIdProvider>();
            mockIdProvider.Setup(i => i.GetUserId()).Returns(openAd.OwnerId);

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

            var response = adsController.CloseAd(adId).ExecuteAsync(CancellationToken.None).Result;

            Assert.AreEqual(HttpStatusCode.OK,response.StatusCode);
            mockContext.Verify(c => c.SaveChanges(), Times.Once);
            var closedAd = mockContext.Object.Ads.Find(adId);
            Assert.AreNotEqual(null, closedAd.ClosedOn);
            Assert.AreEqual(AdStatus.Closed, closedAd.Status);
        }
        public void Closing_Ad_As_NonOwner_Should_Return_400BadRequest()
        {
            var fakeAds = this.mocks.AdRepositoryMock.Object.All();
            var openAd = fakeAds.FirstOrDefault(ad => ad.Status == AdStatus.Open);
            if (openAd == null)
            {
                Assert.Fail("Cannot perform test - no open ads available.");
            }

            var fakeUsers = this.mocks.UserRepositoryMock.Object.All();
            ApplicationUser foreignUser = fakeUsers
                .FirstOrDefault(u => u.Id != openAd.OwnerId);

            if (foreignUser == null)
            {
                Assert.Fail("Cannot perform test - no user who is non owner of the ad.");
            }

            var mockContext = new Mock<IOnlineShopData>();
            mockContext.Setup(c => c.Ads)
                .Returns(this.mocks.AdRepositoryMock.Object);

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

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

            var response = adsController.CloseAd(openAd.Id)
                .ExecuteAsync(CancellationToken.None).Result;

            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
            mockContext.Verify(c => c.SaveChanges(), Times.Never);
            Assert.IsNull(openAd.ClosedOn);
            Assert.AreEqual(AdStatus.Open, openAd.Status);
        }
        public void ClosingAd_As_Owner_Should_return_200OK()
        {
            var fakeAds = this.mocks.AdRepositoryMock.Object.All();
            var openAd = fakeAds.FirstOrDefault(ad => ad.Status == AdStatus.Open);
            if (openAd==null)
            {
                Assert.Fail("Cannot perform test - no open ads available.");
            }
            var adId = openAd.Id;
            var mockContext = new Mock<IOnlineShopData>();
            mockContext.Setup(c => c.Ads).Returns(this.mocks.AdRepositoryMock.Object);
            var mockIdProvider = new Mock<IUserIdProvider>();
            mockIdProvider.Setup(ip => ip.GetUserId()).Returns(openAd.OwnerId);

            var adsController = new AdsController(mockContext.Object, mockIdProvider.Object);
            adsController.Request = new HttpRequestMessage();
            adsController.Configuration = new HttpConfiguration();

            var response = adsController.CloseAd(adId).ExecuteAsync(CancellationToken.None).Result;
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            mockContext.Verify(c => c.SaveChanges(), Times.Once);
            Assert.AreNotEqual(null, openAd.ClosedOn);
            Assert.AreEqual(AdStatus.Closed, openAd.Status);
        }