public async void Subscribe_HttpHeaderDiscoveryUrl_PostsToHttpHeaderDiscoveryHubUrl()
        {
            Mock <HttpClient> webSubRocksHttpClientMock = PrepareWebSubRocksHttpClientMock();
            WebSubSubscriber  webSubSubscriber          = PrepareWebSubRocksWebSubSubscriber(webSubRocksHttpClientMock.Object);

            WebSubSubscribedUrls webSubSubscription = await webSubSubscriber.SubscribeAsync(new WebSubSubscribeParameters(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_URL, WebSubRocksConstants.WEBHOOK_URL), CancellationToken.None);

            webSubRocksHttpClientMock.Verify(m => m.SendAsync(It.Is <HttpRequestMessage>(request => (request.Method == HttpMethod.Post) && (request.RequestUri.AbsoluteUri == WebSubRocksConstants.HTTP_HEADER_DISCOVERY_HUB_URL)), CancellationToken.None), Times.Once);
        }
        public async void Subscribe_HttpHeaderDiscoveryUrl_HubTopicParameterEqualsHttpHeaderDiscoveryTopicUrl()
        {
            Mock <HttpClient> webSubRocksHttpClientMock = PrepareWebSubRocksHttpClientMock();
            WebSubSubscriber  webSubSubscriber          = PrepareWebSubRocksWebSubSubscriber(webSubRocksHttpClientMock.Object);

            WebSubSubscribedUrls webSubSubscription = await webSubSubscriber.SubscribeAsync(new WebSubSubscribeParameters(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_URL, WebSubRocksConstants.WEBHOOK_URL), CancellationToken.None);

            webSubRocksHttpClientMock.Verify(m => m.SendAsync(It.Is <HttpRequestMessage>(request => request.Content.ReadAsStringAsync().Result.Contains($"{HUB_TOPIC_PARAMETER_NAME}={WebUtility.UrlEncode(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_TOPIC_URL)}")), CancellationToken.None), Times.Once);
        }
        public async void Subscribe_CallsDiscoverWithContentUrl()
        {
            Mock <IWebSubDiscoverer> webSubRocksDiscovererMock = PrepareWebSubRocksDiscovererMock();
            WebSubSubscriber         webSubSubscriber          = PrepareWebSubRocksWebSubSubscriber(webSubRocksDiscoverer: webSubRocksDiscovererMock.Object);

            WebSubSubscribedUrls webSubSubscription = await webSubSubscriber.SubscribeAsync(new WebSubSubscribeParameters(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_URL, WebSubRocksConstants.WEBHOOK_URL), CancellationToken.None);

            webSubRocksDiscovererMock.Verify(m => m.DiscoverAsync(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_URL, CancellationToken.None), Times.Once);
        }
        public async void Subscribe_HttpHeaderDiscoveryUrlNoSecret_HubSecretParameterNotPresent()
        {
            Mock <HttpClient> webSubRocksHttpClientMock = PrepareWebSubRocksHttpClientMock();
            WebSubSubscriber  webSubSubscriber          = PrepareWebSubRocksWebSubSubscriber(webSubRocksHttpClientMock.Object);

            WebSubSubscribedUrls webSubSubscription = await webSubSubscriber.SubscribeAsync(new WebSubSubscribeParameters(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_URL, WebSubRocksConstants.WEBHOOK_URL), CancellationToken.None);

            webSubRocksHttpClientMock.Verify(m => m.SendAsync(It.Is <HttpRequestMessage>(request => request.Content.ReadAsStringAsync().Result.Contains($"{HUB_SECRET_PARAMETER_NAME}=")), CancellationToken.None), Times.Never);
        }
        public async void Subscribe_HttpHeaderDiscoveryUrlWithLeaseSeconds_HubLeaseSecondsParameterEqualsLeaseSeconds()
        {
            Mock <HttpClient> webSubRocksHttpClientMock = PrepareWebSubRocksHttpClientMock();
            WebSubSubscriber  webSubSubscriber          = PrepareWebSubRocksWebSubSubscriber(webSubRocksHttpClientMock.Object);

            WebSubSubscribedUrls webSubSubscription = await webSubSubscriber.SubscribeAsync(new WebSubSubscribeParameters(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_URL, WebSubRocksConstants.WEBHOOK_URL) { LeaseSeconds = LEASE_SECONDS }, CancellationToken.None);

            webSubRocksHttpClientMock.Verify(m => m.SendAsync(It.Is <HttpRequestMessage>(request => request.Content.ReadAsStringAsync().Result.Contains($"{HUB_LEASE_SECONDS_PARAMETER_NAME}={LEASE_SECONDS.ToString(CultureInfo.InvariantCulture)}")), CancellationToken.None), Times.Once);
        }
        public async void Unsubscribe_HttpHeaderDiscoverySubscribedUrls_HubCallbackParameterEqualsWebHookUrl()
        {
            WebSubSubscribedUrls httpHeaderDiscoverySubscribedUrls = new WebSubSubscribedUrls(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_TOPIC_URL, WebSubRocksConstants.HTTP_HEADER_DISCOVERY_HUB_URL);
            Mock <HttpClient>    webSubRocksHttpClientMock         = PrepareWebSubRocksHttpClientMock();
            WebSubSubscriber     webSubSubscriber = PrepareWebSubRocksWebSubSubscriber(webSubRocksHttpClientMock.Object);

            bool accepted = await webSubSubscriber.UnsubscribeAsync(httpHeaderDiscoverySubscribedUrls, WebSubRocksConstants.WEBHOOK_URL, CancellationToken.None);

            webSubRocksHttpClientMock.Verify(m => m.SendAsync(It.Is <HttpRequestMessage>(request => request.Content.ReadAsStringAsync().Result.Contains($"{HUB_CALLBACK_PARAMETER_NAME}={WebUtility.UrlEncode(WebSubRocksConstants.WEBHOOK_URL)}")), CancellationToken.None), Times.Once);
        }
        public async void Unsubscribe_HttpHeaderDiscoverySubscribedUrls_PostsToHttpHeaderDiscoveryHubUrl()
        {
            WebSubSubscribedUrls httpHeaderDiscoverySubscribedUrls = new WebSubSubscribedUrls(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_TOPIC_URL, WebSubRocksConstants.HTTP_HEADER_DISCOVERY_HUB_URL);
            Mock <HttpClient>    webSubRocksHttpClientMock         = PrepareWebSubRocksHttpClientMock();
            WebSubSubscriber     webSubSubscriber = PrepareWebSubRocksWebSubSubscriber(webSubRocksHttpClientMock.Object);

            bool accepted = await webSubSubscriber.UnsubscribeAsync(httpHeaderDiscoverySubscribedUrls, WebSubRocksConstants.WEBHOOK_URL, CancellationToken.None);

            webSubRocksHttpClientMock.Verify(m => m.SendAsync(It.Is <HttpRequestMessage>(request => (request.Method == HttpMethod.Post) && (request.RequestUri.AbsoluteUri == WebSubRocksConstants.HTTP_HEADER_DISCOVERY_HUB_URL)), CancellationToken.None), Times.Once);
        }