[Feat] Add suspended_at and suspended_by to the Installation model

This commit is contained in:
Liam Neville
2023-09-21 17:12:30 -04:00
committed by GitHub
parent f8aee83691
commit dcc31b8e0c
3 changed files with 182 additions and 2 deletions

View File

@@ -74,6 +74,8 @@ namespace Octokit.Tests.Integration.Clients
Assert.Equal(InstallationReadWritePermissionLevel.Read, installation.Permissions.Metadata); Assert.Equal(InstallationReadWritePermissionLevel.Read, installation.Permissions.Metadata);
Assert.False(string.IsNullOrEmpty(installation.HtmlUrl)); Assert.False(string.IsNullOrEmpty(installation.HtmlUrl));
Assert.NotEqual(0, installation.TargetId); Assert.NotEqual(0, installation.TargetId);
Assert.Null(installation.SuspendedBy);
Assert.Null(installation.SuspendedAt);
} }
} }
} }

View File

@@ -0,0 +1,165 @@
using System.Collections.Generic;
using System.Linq;
using Octokit.Internal;
using Xunit;
namespace Octokit.Tests.Models
{
public class InstallationResponseTests
{
[Fact]
public void CanBeDeserialized()
{
const string json = @"[
{
""id"": 1,
""account"": {
""login"": ""octocat"",
""id"": 1,
""node_id"": ""MDQ6VXNlcjE="",
""avatar_url"": ""https://github.com/images/error/octocat_happy.gif"",
""gravatar_id"": """",
""url"": ""https://api.github.com/users/octocat"",
""html_url"": ""https://github.com/octocat"",
""followers_url"": ""https://api.github.com/users/octocat/followers"",
""following_url"": ""https://api.github.com/users/octocat/following{/other_user}"",
""gists_url"": ""https://api.github.com/users/octocat/gists{/gist_id}"",
""starred_url"": ""https://api.github.com/users/octocat/starred{/owner}{/repo}"",
""subscriptions_url"": ""https://api.github.com/users/octocat/subscriptions"",
""organizations_url"": ""https://api.github.com/users/octocat/orgs"",
""repos_url"": ""https://api.github.com/users/octocat/repos"",
""events_url"": ""https://api.github.com/users/octocat/events{/privacy}"",
""received_events_url"": ""https://api.github.com/users/octocat/received_events"",
""type"": ""User"",
""site_admin"": false
},
""access_tokens_url"": ""https://api.github.com/app/installations/1/access_tokens"",
""repositories_url"": ""https://api.github.com/installation/repositories"",
""html_url"": ""https://github.com/organizations/github/settings/installations/1"",
""app_id"": 1,
""target_id"": 1,
""target_type"": ""Organization"",
""permissions"": {
""checks"": ""write"",
""metadata"": ""read"",
""contents"": ""read""
},
""events"": [
""push"",
""pull_request""
],
""single_file_name"": ""config.yaml"",
""has_multiple_single_files"": true,
""single_file_paths"": [
""config.yml"",
"".github/issue_TEMPLATE.md""
],
""repository_selection"": ""selected"",
""created_at"": ""2017-07-08T16:18:44-04:00"",
""updated_at"": ""2017-07-08T16:18:44-04:00"",
""app_slug"": ""github-actions"",
""suspended_at"": null,
""suspended_by"": null
}
]";
var serializer = new SimpleJsonSerializer();
var installations = serializer.Deserialize<IReadOnlyList<Installation>>(json);
Assert.NotNull(installations);
Assert.NotEmpty(installations);
Assert.Equal(1, installations.Count);
Assert.Null(installations.First().SuspendedAt);
Assert.Null(installations.First().SuspendedBy);
}
[Fact]
public void CanBeDeserializedWithSuspendedAtValues()
{
const string json = @"[
{
""id"": 1,
""account"": {
""login"": ""octocat"",
""id"": 1,
""node_id"": ""MDQ6VXNlcjE="",
""avatar_url"": ""https://github.com/images/error/octocat_happy.gif"",
""gravatar_id"": """",
""url"": ""https://api.github.com/users/octocat"",
""html_url"": ""https://github.com/octocat"",
""followers_url"": ""https://api.github.com/users/octocat/followers"",
""following_url"": ""https://api.github.com/users/octocat/following{/other_user}"",
""gists_url"": ""https://api.github.com/users/octocat/gists{/gist_id}"",
""starred_url"": ""https://api.github.com/users/octocat/starred{/owner}{/repo}"",
""subscriptions_url"": ""https://api.github.com/users/octocat/subscriptions"",
""organizations_url"": ""https://api.github.com/users/octocat/orgs"",
""repos_url"": ""https://api.github.com/users/octocat/repos"",
""events_url"": ""https://api.github.com/users/octocat/events{/privacy}"",
""received_events_url"": ""https://api.github.com/users/octocat/received_events"",
""type"": ""User"",
""site_admin"": false
},
""access_tokens_url"": ""https://api.github.com/app/installations/1/access_tokens"",
""repositories_url"": ""https://api.github.com/installation/repositories"",
""html_url"": ""https://github.com/organizations/github/settings/installations/1"",
""app_id"": 1,
""target_id"": 1,
""target_type"": ""Organization"",
""permissions"": {
""checks"": ""write"",
""metadata"": ""read"",
""contents"": ""read""
},
""events"": [
""push"",
""pull_request""
],
""single_file_name"": ""config.yaml"",
""has_multiple_single_files"": true,
""single_file_paths"": [
""config.yml"",
"".github/issue_TEMPLATE.md""
],
""repository_selection"": ""selected"",
""created_at"": ""2017-07-08T16:18:44-04:00"",
""updated_at"": ""2017-07-08T16:18:44-04:00"",
""app_slug"": ""github-actions"",
""suspended_at"": ""2017-07-08T16:18:44-04:00"",
""suspended_by"": {
""login"": ""octocat"",
""id"": 1,
""node_id"": ""MDQ6VXNlcjE="",
""avatar_url"": ""https://github.com/images/error/octocat_happy.gif"",
""gravatar_id"": """",
""url"": ""https://api.github.com/users/octocat"",
""html_url"": ""https://github.com/octocat"",
""followers_url"": ""https://api.github.com/users/octocat/followers"",
""following_url"": ""https://api.github.com/users/octocat/following{/other_user}"",
""gists_url"": ""https://api.github.com/users/octocat/gists{/gist_id}"",
""starred_url"": ""https://api.github.com/users/octocat/starred{/owner}{/repo}"",
""subscriptions_url"": ""https://api.github.com/users/octocat/subscriptions"",
""organizations_url"": ""https://api.github.com/users/octocat/orgs"",
""repos_url"": ""https://api.github.com/users/octocat/repos"",
""events_url"": ""https://api.github.com/users/octocat/events{/privacy}"",
""received_events_url"": ""https://api.github.com/users/octocat/received_events"",
""type"": ""User"",
""site_admin"": false
}
}
]";
var serializer = new SimpleJsonSerializer();
var installations = serializer.Deserialize<IReadOnlyList<Installation>>(json);
Assert.NotNull(installations);
Assert.NotEmpty(installations);
Assert.Equal(1, installations.Count);
Assert.NotNull(installations.First().SuspendedAt);
Assert.NotNull(installations.First().SuspendedBy);
}
}
}

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Globalization; using System.Globalization;
using Octokit.Internal; using Octokit.Internal;
@@ -16,7 +17,7 @@ namespace Octokit
{ {
public Installation() { } public Installation() { }
public Installation(long id, User account, string accessTokensUrl, string repositoriesUrl, string htmlUrl, long appId, long targetId, AccountType targetType, InstallationPermissions permissions, IReadOnlyList<string> events, string singleFileName, string repositorySelection) : base(id) public Installation(long id, User account, string accessTokensUrl, string repositoriesUrl, string htmlUrl, long appId, long targetId, AccountType targetType, InstallationPermissions permissions, IReadOnlyList<string> events, string singleFileName, string repositorySelection, User suspendedBy, DateTimeOffset? suspendedAt) : base(id)
{ {
Account = account; Account = account;
AccessTokensUrl = accessTokensUrl; AccessTokensUrl = accessTokensUrl;
@@ -29,6 +30,8 @@ namespace Octokit
Events = events; Events = events;
SingleFileName = singleFileName; SingleFileName = singleFileName;
RepositorySelection = repositorySelection; RepositorySelection = repositorySelection;
SuspendedBy = suspendedBy;
SuspendedAt = suspendedAt;
} }
/// <summary> /// <summary>
@@ -80,6 +83,16 @@ namespace Octokit
/// </summary> /// </summary>
public StringEnum<InstallationRepositorySelection> RepositorySelection { get; private set; } public StringEnum<InstallationRepositorySelection> RepositorySelection { get; private set; }
/// <summary>
/// The user who suspended the Installation. Can be null if the Installation is not suspended.
/// </summary>
public User SuspendedBy { get; private set; }
/// <summary>
/// The date the Installation was suspended. Can be null if the Installation is not suspended.
/// </summary>
public DateTimeOffset? SuspendedAt { get; private set; }
internal new string DebuggerDisplay => string.Format(CultureInfo.InvariantCulture, "Id: {0} AppId: {1}", Id, AppId); internal new string DebuggerDisplay => string.Format(CultureInfo.InvariantCulture, "Id: {0} AppId: {1}", Id, AppId);
} }