diff --git a/Octokit.Tests.Integration/Clients/RepositoryHooksClientTests.cs b/Octokit.Tests.Integration/Clients/RepositoryHooksClientTests.cs index cde8a366..a2062325 100644 --- a/Octokit.Tests.Integration/Clients/RepositoryHooksClientTests.cs +++ b/Octokit.Tests.Integration/Clients/RepositoryHooksClientTests.cs @@ -72,13 +72,15 @@ namespace Octokit.Tests.Integration.Clients { "username", "username" }, { "password", "password" } }; - var parameters = new NewRepositoryWebHook("windowsazure", config, url, contentType, secret, false) + var parameters = new NewRepositoryWebHook("windowsazure", config, url) { Events = new[] { "push" }, - Active = false + Active = false, + ContentType = contentType, + Secret = secret }; - var hook = await github.Repository.Hooks.Create(Helper.Credentials.Login, repository.Name, parameters); + var hook = await github.Repository.Hooks.Create(Helper.Credentials.Login, repository.Name, parameters.ToRequest()); var baseHookUrl = CreateExpectedBaseHookUrl(repository.Url, hook.Id); var webHookConfig = CreateExpectedConfigDictionary(config, url, contentType, secret); @@ -102,7 +104,7 @@ namespace Octokit.Tests.Integration.Clients { "url", url }, { "content_type", contentType.ToString().ToLowerInvariant() }, { "secret", secret }, - { "insecure_ssl", "0" } + { "insecure_ssl", "False" } }).ToDictionary(k => k.Key, v => v.Value); } diff --git a/Octokit.Tests/Models/NewRepositoryWebHookTests.cs b/Octokit.Tests/Models/NewRepositoryWebHookTests.cs index efa4d3dd..119b9d0c 100644 --- a/Octokit.Tests/Models/NewRepositoryWebHookTests.cs +++ b/Octokit.Tests/Models/NewRepositoryWebHookTests.cs @@ -11,23 +11,23 @@ namespace Octokit.Tests.Models public void UsesDefaultValuesForDefaultConfig() { var create = new NewRepositoryWebHook("windowsazure", new Dictionary(), "http://test.com/example"); - - Assert.Equal(create.Config.Count, 4); - - Assert.True(create.Config.ContainsKey("url")); - Assert.True(create.Config.ContainsKey("content_type")); - Assert.True(create.Config.ContainsKey("secret")); - Assert.True(create.Config.ContainsKey("insecure_ssl")); - - Assert.Equal(create.Config["url"], "http://test.com/example"); - Assert.Equal(create.Config["content_type"], WebHookContentType.Form.ToParameter()); - Assert.Equal(create.Config["secret"], ""); - Assert.Equal(create.Config["insecure_ssl"], "0"); - Assert.Equal(create.Url, "http://test.com/example"); Assert.Equal(create.ContentType, WebHookContentType.Form); Assert.Empty(create.Secret); Assert.False(create.InsecureSsl); + + var request = create.ToRequest(); + Assert.Equal(request.Config.Count, 4); + + Assert.True(request.Config.ContainsKey("url")); + Assert.True(request.Config.ContainsKey("content_type")); + Assert.True(request.Config.ContainsKey("secret")); + Assert.True(request.Config.ContainsKey("insecure_ssl")); + + Assert.Equal(request.Config["url"], "http://test.com/example"); + Assert.Equal(request.Config["content_type"], WebHookContentType.Form.ToParameter()); + Assert.Equal(request.Config["secret"], ""); + Assert.Equal(request.Config["insecure_ssl"], "False"); } [Fact] @@ -40,31 +40,38 @@ namespace Octokit.Tests.Models {"password", "password"} }; - var create = new NewRepositoryWebHook("windowsazure", config, "http://test.com/example", WebHookContentType.Json, string.Empty, true); - - Assert.Equal(create.Config.Count, 7); - - Assert.True(create.Config.ContainsKey("url")); - Assert.True(create.Config.ContainsKey("content_type")); - Assert.True(create.Config.ContainsKey("secret")); - Assert.True(create.Config.ContainsKey("insecure_ssl")); - - Assert.Equal(create.Config["url"], "http://test.com/example"); - Assert.Equal(create.Config["content_type"], WebHookContentType.Json.ToParameter()); - Assert.Equal(create.Config["secret"], ""); - Assert.Equal(create.Config["insecure_ssl"], "1"); - - Assert.True(create.Config.ContainsKey("hostname")); - Assert.Equal(create.Config["hostname"], config["hostname"]); - Assert.True(create.Config.ContainsKey("username")); - Assert.Equal(create.Config["username"], config["username"]); - Assert.True(create.Config.ContainsKey("password")); - Assert.Equal(create.Config["password"], config["password"]); + var create = new NewRepositoryWebHook("windowsazure", config, "http://test.com/example") + { + ContentType = WebHookContentType.Json, + Secret = string.Empty, + InsecureSsl = true + }; Assert.Equal(create.Url, "http://test.com/example"); Assert.Equal(create.ContentType, WebHookContentType.Json); Assert.Empty(create.Secret); Assert.True(create.InsecureSsl); + + var request = create.ToRequest(); + + Assert.Equal(request.Config.Count, 7); + + Assert.True(request.Config.ContainsKey("url")); + Assert.True(request.Config.ContainsKey("content_type")); + Assert.True(request.Config.ContainsKey("secret")); + Assert.True(request.Config.ContainsKey("insecure_ssl")); + + Assert.Equal(request.Config["url"], "http://test.com/example"); + Assert.Equal(request.Config["content_type"], WebHookContentType.Json.ToParameter()); + Assert.Equal(request.Config["secret"], ""); + Assert.Equal(request.Config["insecure_ssl"], true.ToString()); + + Assert.True(request.Config.ContainsKey("hostname")); + Assert.Equal(request.Config["hostname"], config["hostname"]); + Assert.True(request.Config.ContainsKey("username")); + Assert.Equal(request.Config["username"], config["username"]); + Assert.True(request.Config.ContainsKey("password")); + Assert.Equal(request.Config["password"], config["password"]); } } } diff --git a/Octokit/Clients/RepositoryHooksClient.cs b/Octokit/Clients/RepositoryHooksClient.cs index d4d30e55..458a1596 100644 --- a/Octokit/Clients/RepositoryHooksClient.cs +++ b/Octokit/Clients/RepositoryHooksClient.cs @@ -54,7 +54,7 @@ namespace Octokit Ensure.ArgumentNotNullOrEmptyString(repositoryName, "repositoryName"); Ensure.ArgumentNotNull(hook, "hook"); - return ApiConnection.Post(ApiUrls.RepositoryHooks(owner, repositoryName), hook); + return ApiConnection.Post(ApiUrls.RepositoryHooks(owner, repositoryName), hook.ToRequest()); } /// diff --git a/Octokit/Models/Request/NewRepositoryHook.cs b/Octokit/Models/Request/NewRepositoryHook.cs index 86ac3b70..7e696238 100644 --- a/Octokit/Models/Request/NewRepositoryHook.cs +++ b/Octokit/Models/Request/NewRepositoryHook.cs @@ -100,6 +100,11 @@ namespace Octokit /// public bool Active { get; set; } + public virtual NewRepositoryHook ToRequest() + { + return this; + } + internal string DebuggerDisplay { get diff --git a/Octokit/Models/Request/NewRepositoryWebHook.cs b/Octokit/Models/Request/NewRepositoryWebHook.cs index ee680f78..2f3e2047 100644 --- a/Octokit/Models/Request/NewRepositoryWebHook.cs +++ b/Octokit/Models/Request/NewRepositoryWebHook.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -61,64 +62,15 @@ namespace Octokit /// /// A required string defining the URL to which the payloads will be delivered. /// - public NewRepositoryWebHook(string name, IReadOnlyDictionary config, string url) : this(name, config, url, WebHookContentType.Form, string.Empty, false) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// Use web for a webhook or use the name of a valid service. (See /hooks for the list of valid service names.) - /// Use "web" for a webhook or use the name of a valid service. (See - /// https://api.github.com/hooks for the list of valid service - /// names.) - /// - /// - /// Key/value pairs to provide settings for this hook. These settings vary between the services and are - /// defined in the github-services repository. Booleans are stored internally as “1” for true, and “0” for - /// false. Any JSON true/false values will be converted automatically. - /// - /// - /// A required string defining the URL to which the payloads will be delivered. - /// - /// - /// An optional string defining the media type used to serialize the payloads. - /// Supported values include json and form. - /// The default is form. - /// - /// - /// An optional string that’s passed with the HTTP requests as an X-Hub-Signature header. - /// The value of this header is computed as the - /// - /// HMAC hex digest of the body, using the secret as the key - /// . - /// - /// - /// An optional string that determines whether the SSL certificate of the host for url will be verified when delivering payloads. - /// Supported values include "0" (verification is performed) and "1" (verification is not performed). - /// The default is "0". - /// - public NewRepositoryWebHook(string name, IReadOnlyDictionary config, string url, WebHookContentType contentType, string secret, bool insecureSsl) - : base(name, GetWebHookConfig(url, contentType, secret, insecureSsl, config)) + public NewRepositoryWebHook(string name, IReadOnlyDictionary config, string url) + : base(name, config) { Ensure.ArgumentNotNullOrEmptyString(url, "url"); Url = url; - ContentType = contentType; - Secret = secret; - InsecureSsl = insecureSsl; - } - - static Dictionary GetWebHookConfig(string url, WebHookContentType contentType, string secret, bool insecureSsl, IReadOnlyDictionary config) - { - var webHookConfig = new Dictionary - { - { "url", url }, - { "content_type", contentType.ToParameter() }, - { "secret", secret }, - { "insecure_ssl", insecureSsl ? "1" : "0" } - }; - return config.Union(webHookConfig).ToDictionary(k => k.Key, v => v.Value); + ContentType = WebHookContentType.Form; + Secret = ""; + InsecureSsl = false; } /// @@ -128,9 +80,9 @@ namespace Octokit /// The URL. /// public string Url { get; protected set; } - + /// - /// Gets the content type used to serialize the payload. + /// Gets the content type used to serialize the payload. The default is `form`. /// /// /// The content type. @@ -148,13 +100,25 @@ namespace Octokit /// /// Gets wether the SSL certificate of the host will be verified when - /// delivering payloads. + /// delivering payloads. The default is `false`. /// /// /// true if SSL certificate verification is not performed; /// otherwise, false. /// public bool InsecureSsl { get; set; } + + public override NewRepositoryHook ToRequest() + { + var config = Config.Union(new Dictionary + { + { "url", Url }, + { "content_type", ContentType.ToParameter() }, + { "secret", Secret }, + { "insecure_ssl", InsecureSsl.ToString() } + }).ToDictionary(k => k.Key, v => v.Value); + return new NewRepositoryHook(Name, config); + } } ///