public async Task GetFormToken_FormFieldIsEmpty_ReturnsNull()
        {
            // Arrange
            var mockHttpContext = new Mock <HttpContext>();
            var requestContext  = new Mock <HttpRequest>();
            var formCollection  = new Mock <IFormCollection>();

            formCollection.Setup(f => f["form-field-name"]).Returns(string.Empty);
            requestContext.Setup(o => o.ReadFormAsync(CancellationToken.None))
            .Returns(Task.FromResult(formCollection.Object));
            mockHttpContext.Setup(o => o.Request)
            .Returns(requestContext.Object);

            var options = new AntiforgeryOptions()
            {
                FormFieldName = "form-field-name",
            };

            var tokenStore = new DefaultAntiforgeryTokenStore(
                optionsAccessor: new TestOptionsManager(options),
                tokenSerializer: null);

            // Act
            var token = await tokenStore.GetFormTokenAsync(mockHttpContext.Object);

            // Assert
            Assert.Null(token);
        }
        public async Task GetFormToken_FormFieldIsInvalid_PropagatesException()
        {
            // Arrange
            var formCollection = new Mock <IFormCollection>();

            formCollection.Setup(f => f["form-field-name"]).Returns("invalid-value");

            var requestContext = new Mock <HttpRequest>();

            requestContext.Setup(o => o.ReadFormAsync(CancellationToken.None))
            .Returns(Task.FromResult(formCollection.Object));

            var mockHttpContext = new Mock <HttpContext>();

            mockHttpContext.Setup(o => o.Request)
            .Returns(requestContext.Object);

            var expectedException = new InvalidOperationException("some exception");
            var mockSerializer    = new Mock <IAntiforgeryTokenSerializer>();

            mockSerializer.Setup(o => o.Deserialize("invalid-value"))
            .Throws(expectedException);

            var options = new AntiforgeryOptions()
            {
                FormFieldName = "form-field-name",
            };

            var tokenStore = new DefaultAntiforgeryTokenStore(
                optionsAccessor: new TestOptionsManager(options),
                tokenSerializer: mockSerializer.Object);

            // Act & assert
            var exception = await Assert.ThrowsAsync <InvalidOperationException>(
                async() => await tokenStore.GetFormTokenAsync(mockHttpContext.Object));

            Assert.Same(expectedException, exception);
        }
        public async Task GetFormToken_FormFieldIsValid_ReturnsToken()
        {
            // Arrange
            var expectedToken = new AntiforgeryToken();

            // Arrange
            var mockHttpContext = new Mock <HttpContext>();
            var requestContext  = new Mock <HttpRequest>();
            var formCollection  = new Mock <IFormCollection>();

            formCollection.Setup(f => f["form-field-name"]).Returns("valid-value");
            requestContext.Setup(o => o.ReadFormAsync(CancellationToken.None))
            .Returns(Task.FromResult(formCollection.Object));
            mockHttpContext.Setup(o => o.Request)
            .Returns(requestContext.Object);

            var mockSerializer = new Mock <IAntiforgeryTokenSerializer>();

            mockSerializer.Setup(o => o.Deserialize("valid-value"))
            .Returns(expectedToken);

            var options = new AntiforgeryOptions()
            {
                FormFieldName = "form-field-name",
            };

            var tokenStore = new DefaultAntiforgeryTokenStore(
                optionsAccessor: new TestOptionsManager(options),
                tokenSerializer: mockSerializer.Object);

            // Act
            var retVal = await tokenStore.GetFormTokenAsync(mockHttpContext.Object);

            // Assert
            Assert.Same(expectedToken, retVal);
        }
        public async Task GetFormToken_FormFieldIsValid_ReturnsToken()
        {
            // Arrange
            var expectedToken = new AntiforgeryToken();

            // Arrange
            var mockHttpContext = new Mock<HttpContext>();
            var requestContext = new Mock<HttpRequest>();
            var formCollection = new Mock<IFormCollection>();
            formCollection.Setup(f => f["form-field-name"]).Returns("valid-value");
            requestContext.Setup(o => o.ReadFormAsync(CancellationToken.None))
                          .Returns(Task.FromResult(formCollection.Object));
            mockHttpContext.Setup(o => o.Request)
                           .Returns(requestContext.Object);

            var mockSerializer = new Mock<IAntiforgeryTokenSerializer>();
            mockSerializer.Setup(o => o.Deserialize("valid-value"))
                          .Returns(expectedToken);

            var options = new AntiforgeryOptions()
            {
                FormFieldName = "form-field-name",
            };

            var tokenStore = new DefaultAntiforgeryTokenStore(
                optionsAccessor: new TestOptionsManager(options),
                tokenSerializer: mockSerializer.Object);

            // Act
            var retVal = await tokenStore.GetFormTokenAsync(mockHttpContext.Object);

            // Assert
            Assert.Same(expectedToken, retVal);
        }
        public async Task GetFormToken_FormFieldIsInvalid_PropagatesException()
        {
            // Arrange
            var formCollection = new Mock<IFormCollection>();
            formCollection.Setup(f => f["form-field-name"]).Returns("invalid-value");

            var requestContext = new Mock<HttpRequest>();
            requestContext.Setup(o => o.ReadFormAsync(CancellationToken.None))
                          .Returns(Task.FromResult(formCollection.Object));

            var mockHttpContext = new Mock<HttpContext>();
            mockHttpContext.Setup(o => o.Request)
                           .Returns(requestContext.Object);

            var expectedException = new InvalidOperationException("some exception");
            var mockSerializer = new Mock<IAntiforgeryTokenSerializer>();
            mockSerializer.Setup(o => o.Deserialize("invalid-value"))
                          .Throws(expectedException);

            var options = new AntiforgeryOptions()
            {
                FormFieldName = "form-field-name",
            };

            var tokenStore = new DefaultAntiforgeryTokenStore(
                optionsAccessor: new TestOptionsManager(options),
                tokenSerializer: mockSerializer.Object);

            // Act & assert
            var exception = await Assert.ThrowsAsync<InvalidOperationException>(
                        async () => await tokenStore.GetFormTokenAsync(mockHttpContext.Object));
            Assert.Same(expectedException, exception);
        }
        public async Task GetFormToken_FormFieldIsEmpty_ReturnsNull()
        {
            // Arrange
            var mockHttpContext = new Mock<HttpContext>();
            var requestContext = new Mock<HttpRequest>();
            var formCollection = new Mock<IFormCollection>();
            formCollection.Setup(f => f["form-field-name"]).Returns(string.Empty);
            requestContext.Setup(o => o.ReadFormAsync(CancellationToken.None))
                          .Returns(Task.FromResult(formCollection.Object));
            mockHttpContext.Setup(o => o.Request)
                           .Returns(requestContext.Object);

            var options = new AntiforgeryOptions()
            {
                FormFieldName = "form-field-name",
            };

            var tokenStore = new DefaultAntiforgeryTokenStore(
                optionsAccessor: new TestOptionsManager(options),
                tokenSerializer: null);

            // Act
            var token = await tokenStore.GetFormTokenAsync(mockHttpContext.Object);

            // Assert
            Assert.Null(token);
        }