public void OnPageHandlerExecuting_SetsSubject()
    {
        // Arrange
        var filter        = new PageViewDataAttributeFilter(Array.Empty <LifecycleProperty>());
        var handler       = new object();
        var httpContext   = new DefaultHttpContext();
        var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
        var pageContext   = new PageContext(actionContext);
        var context       = new PageHandlerExecutingContext(pageContext, new IFilterMetadata[0], new HandlerMethodDescriptor(), new Dictionary <string, object>(), handler);

        // Act
        filter.OnPageHandlerExecuting(context);

        // Assert
        Assert.Same(handler, filter.Subject);
    }
    public void OnPageHandlerExecuting_AddsFeature()
    {
        // Arrange
        var filter        = new PageViewDataAttributeFilter(Array.Empty <LifecycleProperty>());
        var handler       = new object();
        var httpContext   = new DefaultHttpContext();
        var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
        var pageContext   = new PageContext(actionContext);
        var context       = new PageHandlerExecutingContext(pageContext, new IFilterMetadata[0], new HandlerMethodDescriptor(), new Dictionary <string, object>(), handler);

        // Act
        filter.OnPageHandlerExecuting(context);

        // Assert
        var feature = Assert.Single(httpContext.Features, f => f.Key == typeof(IViewDataValuesProviderFeature));

        Assert.Same(filter, feature.Value);
    }
    public void ProvideValues_AddsNonNullPropertyValuesToViewData()
    {
        // Arrange
        var type       = typeof(TestModel);
        var properties = new[]
        {
            new LifecycleProperty(type.GetProperty(nameof(TestModel.Prop1)), "Prop1"),
            new LifecycleProperty(type.GetProperty(nameof(TestModel.Prop2)), "Prop2"),
            new LifecycleProperty(type.GetProperty(nameof(TestModel.Prop3)), "Prop3"),
        };

        var controller = new TestModel();
        var filter     = new PageViewDataAttributeFilter(properties)
        {
            Subject = controller,
        };
        var viewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary());

        // Act
        controller.Prop1 = "New-Value";
        filter.ProvideViewDataValues(viewData);

        // Assert
        Assert.Collection(
            viewData.OrderBy(kvp => kvp.Key),
            kvp =>
        {
            Assert.Equal("Prop1", kvp.Key);
            Assert.Equal("New-Value", kvp.Value);
        },
            kvp =>
        {
            Assert.Equal("Prop2", kvp.Key);
            Assert.Equal("Test", kvp.Value);
        });
    }