Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ public interface IWorkspaceInstallationHandler
Task Uninstall(string teamId);
}

public record Workspace(string TeamId, string TeamName, string Token);
public record Workspace(string TeamId, string TeamName, string Token, string InstallerUserId = null);
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ await installationHandler.Install(new Workspace
(
response.Team.Id,
response.Team.Name,
response.Access_Token
response.Access_Token,
response.Authed_User?.Id
));

var stateTheAppSent = ctx.Request.Query["state"].FirstOrDefault();
Expand Down
2 changes: 1 addition & 1 deletion source/src/Slackbot.Net.Endpoints/OAuth/OAuthClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ internal record OAuthAccessV2Response(

internal record Team(string Id, string Name);

internal record OAuthUser(string User_Id, string App_Home);
internal record OAuthUser(string Id);
}

internal static class HttpClientExtensions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,23 @@ public async Task WithoutState_TheWorkspaceIsInstalledAndTheSuccessPageUsedUntou
Assert.Equal("/success?default=1", ctx.Response.Headers.Location.ToString());
}

[Fact]
public async Task TheInstallingUserIsCarriedToTheInstallationHandler()
{
var (_, handler) = await Install(state: null, successRedirectUri: "/success",
"""{"ok":true,"access_token":"xoxb-token","scope":"chat:write","team":{"id":"T1","name":"Team"},"app_id":"A1","authed_user":{"id":"U1"}}""");

Assert.Equal("U1", Assert.Single(handler.Installed).InstallerUserId);
}

[Fact]
public async Task WithoutAnAuthedUser_TheWorkspaceIsInstalledWithNoInstaller()
{
var (_, handler) = await Install(state: null, successRedirectUri: "/success");

Assert.Null(Assert.Single(handler.Installed).InstallerUserId);
}

[Fact]
public async Task StateRidesBackToTheSuccessPageAsAQueryParameter()
{
Expand All @@ -45,7 +62,7 @@ public async Task StateIsNeverTheRedirectTarget_WhateverItHolds(string state)
}

private static async Task<(HttpContext Context, RecordingInstallationHandler Handler)> Install(
string state, string successRedirectUri)
string state, string successRedirectUri, string oauthAccessResponse = OauthAccessResponse)
{
var services = new ServiceCollection();
services.AddLogging();
Expand All @@ -57,7 +74,7 @@ public async Task StateIsNeverTheRedirectTarget_WhateverItHolds(string state)
o.SuccessRedirectUri = successRedirectUri;
});
services.ConfigureHttpClientDefaults(b =>
b.ConfigurePrimaryHttpMessageHandler(() => new StubHttpMessageHandler(OauthAccessResponse)));
b.ConfigurePrimaryHttpMessageHandler(() => new StubHttpMessageHandler(oauthAccessResponse)));

await using var provider = services.BuildServiceProvider(new ServiceProviderOptions { ValidateScopes = true });
await using var scope = provider.CreateAsyncScope();
Expand Down
Loading