From 7171535d8d202d8103e2f831ac9f9dc56a96ae49 Mon Sep 17 00:00:00 2001 From: Henrik Andersson Date: Sun, 5 Jun 2016 17:45:42 +1000 Subject: [PATCH] Add integration tests for UserGpgKeysClient --- .../Clients/UserGpgKeysClientTests.cs | 103 ++++++++++++++++++ .../Helpers/GithubClientExtensions.cs | 28 +++++ .../Helpers/GpgKeyContext.cs | 39 +++++++ .../Octokit.Tests.Integration.csproj | 2 + Octokit/Clients/UserGpgKeysClient.cs | 2 +- 5 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 Octokit.Tests.Integration/Clients/UserGpgKeysClientTests.cs create mode 100644 Octokit.Tests.Integration/Helpers/GpgKeyContext.cs diff --git a/Octokit.Tests.Integration/Clients/UserGpgKeysClientTests.cs b/Octokit.Tests.Integration/Clients/UserGpgKeysClientTests.cs new file mode 100644 index 00000000..f1929798 --- /dev/null +++ b/Octokit.Tests.Integration/Clients/UserGpgKeysClientTests.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Octokit.Tests.Integration.Helpers; +using Xunit; + +namespace Octokit.Tests.Integration.Clients +{ + public class UserGpgKeysClientTests + { + // Create a key + readonly string knownKeyId = "E88402D2E127A23A"; + readonly string knownPublicKey = "xsBNBFdTvCUBCADOaVtPoJTQOgMIVYEpI8uT60LA/kDqw/1OKn7ftKjAtxNVSgjQi/ZqZp8XKjTg2u6l4c/aPjER2BGTg90xCcbmpwq/kkQuHR4DK7dOlEOoTzDDESEFv6XXlXGCnxN8AD8YNvSO+Sy4+35ihuKUBAHDxmOl7ZAMH0STo10KuW82/DhfT3cCJNqmID7H+CW1H6IhwutPKt8XsVq2FQg2RMx+uX1KqkuBAd7b30KJ93SJqzgq5CC3DticaC0/WdZnxmYD01UvMAS6o/REs+SICdsyTxgBx/X8SIXuX2TD9PG/O2785JI5/xvBd4jU6bBH/4oWoHr3e/lyNqb1+GSeTFX3ABEBAAE="; + + readonly string publicKey = @" +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG C# v1.6.1.0 + +mQENBFdTvCUBCADOaVtPoJTQOgMIVYEpI8uT60LA/kDqw/1OKn7ftKjAtxNVSgjQ +i/ZqZp8XKjTg2u6l4c/aPjER2BGTg90xCcbmpwq/kkQuHR4DK7dOlEOoTzDDESEF +v6XXlXGCnxN8AD8YNvSO+Sy4+35ihuKUBAHDxmOl7ZAMH0STo10KuW82/DhfT3cC +JNqmID7H+CW1H6IhwutPKt8XsVq2FQg2RMx+uX1KqkuBAd7b30KJ93SJqzgq5CC3 +DticaC0/WdZnxmYD01UvMAS6o/REs+SICdsyTxgBx/X8SIXuX2TD9PG/O2785JI5 +/xvBd4jU6bBH/4oWoHr3e/lyNqb1+GSeTFX3ABEBAAG0AIkBHAQQAQIABgUCV1O8 +JQAKCRDohALS4SeiOs/QB/9PMeFNdPkB1xfBm3qvTErqvhTcQspPibucYefG6JHL +vhm6iCOVBeCuPS4P/T8RTzb0qJaTdZZWcwZ9UjRVqF/RKwdMJTBKBHRegc5hRjLH +Koxk0zXosk+CapIR6eVhHe4IzpVVxZOvunsFOclIh+qHx9UzJhz9wSO/XBn/6Rzr +DGzE9fpK1JRKC0I3PuiDCNuZvojXeUsT/zuHYsz00wnA2Em7CmcWWng3nPUSHvBB +GUJ7YE7NvYXqT09PdhoZnf9p1wOugiuG6CLzWf8stlNV3mZptpP+sCGcz/UVffRO +VO/+BCBsaoT4g1FFOmJhbBAD3G72yslBnUJmqKP/39pi +=O7Yi +-----END PGP PUBLIC KEY BLOCK----- +"; + + [IntegrationTest] + public async Task CanGetAllForCurrentUser() + { + var github = Helper.GetBasicAuthClient(); + + using (var context = await github.CreateGpgKeyContext()) + { + var keys = await github.User.GpgKeys.GetAllForCurrent(); + Assert.NotEmpty(keys); + + var first = keys[0]; + Assert.NotNull(first.Id); + Assert.NotNull(first.KeyId); + Assert.NotNull(first.PublicKey); + Assert.Null(first.PrimaryKeyId); + Assert.Empty(first.Subkeys); + } + } + + [IntegrationTest] + public async Task CanGetKeyById() + { + var github = Helper.GetBasicAuthClient(); + using (var context = await github.CreateGpgKeyContext()) + { + var key = await github.User.GpgKeys.Get(context.GpgKeyId); + + Assert.Equal(context.GpgKeyId, key.Id); + Assert.Equal(context.KeyId, key.KeyId); + Assert.Equal(context.PublicKeyData, key.PublicKey); + } + } + + [IntegrationTest] + public async Task CanCreateAndDeleteKey() + { + var github = Helper.GetBasicAuthClient(); + + var key = await github.User.GpgKeys.Create(new NewGpgKey(publicKey)); + Assert.NotNull(key); + Assert.Equal(knownPublicKey, key.PublicKey); + Assert.Equal(knownKeyId, key.KeyId); + + // Delete the key + await github.User.GpgKeys.Delete(key.Id); + + // Verify key no longer exists + var keys = await github.User.GpgKeys.GetAllForCurrent(); + Assert.False(keys.Any(k => k.KeyId == knownKeyId && k.PublicKey == knownPublicKey)); + } + + [IntegrationTest] + public async Task CanNotCreateSameKeyTwice() + { + var github = Helper.GetBasicAuthClient(); + + var key = await github.User.GpgKeys.Create(new NewGpgKey(publicKey)); + Assert.NotNull(key); + + Assert.ThrowsAsync(async () => await github.User.GpgKeys.Create(new NewGpgKey(publicKey))); + + await github.User.GpgKeys.Delete(key.Id); + var keys = await github.User.GpgKeys.GetAllForCurrent(); + Assert.False(keys.Any(k => k.KeyId == knownKeyId && k.PublicKey == knownPublicKey)); + } + } +} diff --git a/Octokit.Tests.Integration/Helpers/GithubClientExtensions.cs b/Octokit.Tests.Integration/Helpers/GithubClientExtensions.cs index 18604004..ef5e2857 100644 --- a/Octokit.Tests.Integration/Helpers/GithubClientExtensions.cs +++ b/Octokit.Tests.Integration/Helpers/GithubClientExtensions.cs @@ -50,5 +50,33 @@ namespace Octokit.Tests.Integration.Helpers return new PublicKeyContext(client.Connection, key); } + + internal static async Task CreateGpgKeyContext(this IGitHubClient client) + { + // Create a key + string publicKey = @" +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG C# v1.6.1.0 + +mQENBFdTvCUBCADOaVtPoJTQOgMIVYEpI8uT60LA/kDqw/1OKn7ftKjAtxNVSgjQ +i/ZqZp8XKjTg2u6l4c/aPjER2BGTg90xCcbmpwq/kkQuHR4DK7dOlEOoTzDDESEF +v6XXlXGCnxN8AD8YNvSO+Sy4+35ihuKUBAHDxmOl7ZAMH0STo10KuW82/DhfT3cC +JNqmID7H+CW1H6IhwutPKt8XsVq2FQg2RMx+uX1KqkuBAd7b30KJ93SJqzgq5CC3 +DticaC0/WdZnxmYD01UvMAS6o/REs+SICdsyTxgBx/X8SIXuX2TD9PG/O2785JI5 +/xvBd4jU6bBH/4oWoHr3e/lyNqb1+GSeTFX3ABEBAAG0AIkBHAQQAQIABgUCV1O8 +JQAKCRDohALS4SeiOs/QB/9PMeFNdPkB1xfBm3qvTErqvhTcQspPibucYefG6JHL +vhm6iCOVBeCuPS4P/T8RTzb0qJaTdZZWcwZ9UjRVqF/RKwdMJTBKBHRegc5hRjLH +Koxk0zXosk+CapIR6eVhHe4IzpVVxZOvunsFOclIh+qHx9UzJhz9wSO/XBn/6Rzr +DGzE9fpK1JRKC0I3PuiDCNuZvojXeUsT/zuHYsz00wnA2Em7CmcWWng3nPUSHvBB +GUJ7YE7NvYXqT09PdhoZnf9p1wOugiuG6CLzWf8stlNV3mZptpP+sCGcz/UVffRO +VO/+BCBsaoT4g1FFOmJhbBAD3G72yslBnUJmqKP/39pi +=O7Yi +-----END PGP PUBLIC KEY BLOCK----- +"; + + var key = await client.User.GpgKeys.Create(new NewGpgKey(publicKey)); + + return new GpgKeyContext(key); + } } } \ No newline at end of file diff --git a/Octokit.Tests.Integration/Helpers/GpgKeyContext.cs b/Octokit.Tests.Integration/Helpers/GpgKeyContext.cs new file mode 100644 index 00000000..58b2a15d --- /dev/null +++ b/Octokit.Tests.Integration/Helpers/GpgKeyContext.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Octokit.Tests.Integration.Helpers +{ + public class GpgKeyContext : IDisposable + { + internal GpgKeyContext(GpgKey key) + { + Key = key; + GpgKeyId = key.Id; + KeyId = key.KeyId; + PublicKeyData = key.PublicKey; + } + + + internal int GpgKeyId { get; set; } + internal string KeyId { get; set; } + internal string PublicKeyData { get; set; } + + internal GpgKey Key { get; set; } + + public void Dispose() + { + if (Key != null) + { + var api = Helper.GetBasicAuthClient(); + try + { + api.User.GpgKeys.Delete(Key.Id).Wait(TimeSpan.FromSeconds(15)); + } + catch { } + } + } + } +} diff --git a/Octokit.Tests.Integration/Octokit.Tests.Integration.csproj b/Octokit.Tests.Integration/Octokit.Tests.Integration.csproj index afe0511e..366d5b28 100644 --- a/Octokit.Tests.Integration/Octokit.Tests.Integration.csproj +++ b/Octokit.Tests.Integration/Octokit.Tests.Integration.csproj @@ -112,12 +112,14 @@ + + diff --git a/Octokit/Clients/UserGpgKeysClient.cs b/Octokit/Clients/UserGpgKeysClient.cs index 5feeac2f..14ba7cd4 100644 --- a/Octokit/Clients/UserGpgKeysClient.cs +++ b/Octokit/Clients/UserGpgKeysClient.cs @@ -86,7 +86,7 @@ namespace Octokit /// public Task Delete(int id) { - return ApiConnection.Delete(ApiUrls.GpgKeys(id), null, AcceptHeaders.GpgKeysPreview); + return ApiConnection.Delete(ApiUrls.GpgKeys(id), new object(), AcceptHeaders.GpgKeysPreview); } } } \ No newline at end of file