public void GetUrl_WhenUrlHelperReturnsNull_Throws()
    {
        // Arrange
        var testableAttribute = new TestablePageRemoteAttribute
        {
            PageName    = "Foo",
            PageHandler = "Bar"
        };

        var ambientValues = new RouteValueDictionary
        {
            ["page"] = "/Page"
        };

        var routeData = new RouteData(ambientValues)
        {
            Routers = { Mock.Of <IRouter>() }
        };

        var urlHelper = new MockUrlHelper(url: null)
        {
            ActionContext = GetActionContext(new ServiceCollection().BuildServiceProvider(), routeData)
        };

        var validationContext = GetValidationContext(urlHelper);

        // Act && Assert
        ExceptionAssert.Throws <InvalidOperationException>(
            () => testableAttribute.InvokeGetUrl(validationContext),
            Resources.RemoteAttribute_NoUrlFound);
    }
    public void GetUrl_WhenPageNameIsNotSet_WillUsePageNameFromAmbientValues()
    {
        // Arrange
        var testableAttribute = new TestablePageRemoteAttribute()
        {
            PageHandler = "Handler"
        };

        var ambientValues = new RouteValueDictionary
        {
            ["page"] = "/Page"
        };

        var routeData = new RouteData(ambientValues)
        {
            Routers = { Mock.Of <IRouter>() }
        };

        var urlHelper = new MockUrlHelper(url: "/Page?handler=Handler")
        {
            ActionContext = GetActionContext(new ServiceCollection().BuildServiceProvider(), routeData)
        };

        var validationContext = GetValidationContext(urlHelper);

        // Act
        var actualUrl = testableAttribute.InvokeGetUrl(validationContext);

        // Assert
        Assert.Equal("/Page?handler=Handler", actualUrl);
    }
    public void GetUrl_CallsUrlHelperWithExpectedValues()
    {
        // Arrange
        var testableAttribute = new TestablePageRemoteAttribute
        {
            PageName    = "Foo",
            PageHandler = "Bar"
        };

        var ambientValues = new RouteValueDictionary()
        {
            ["page"] = "/Foo"
        };

        var routeData = new RouteData(ambientValues)
        {
            Routers = { Mock.Of <IRouter>() }
        };

        var urlHelper = new MockUrlHelper(url: "/Foo?handler=Bar")
        {
            ActionContext = GetActionContext(new ServiceCollection().BuildServiceProvider(), routeData)
        };

        var validationContext = GetValidationContext(urlHelper);

        // Act
        testableAttribute.InvokeGetUrl(validationContext);

        // Assert
        var routeDictionary = Assert.IsType <RouteValueDictionary>(urlHelper.RouteValues);

        Assert.Equal(2, routeDictionary.Count);
        Assert.Equal("/Foo", routeDictionary["page"] as string);
        Assert.Equal("Bar", routeDictionary["handler"] as string);
    }