From 94be40b899aad3736b991a88381028523c0d302a Mon Sep 17 00:00:00 2001 From: Andrew Hampton Date: Fri, 6 Mar 2026 11:47:14 -0500 Subject: [PATCH] feat(user-management): add invitation accept endpoint --- lib/workos/user_management.rb | 16 ++++++ spec/lib/workos/user_management_spec.rb | 75 +++++++++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/lib/workos/user_management.rb b/lib/workos/user_management.rb index cd362005..7cfbe96c 100644 --- a/lib/workos/user_management.rb +++ b/lib/workos/user_management.rb @@ -1172,6 +1172,22 @@ def send_invitation(email:, organization_id: nil, expires_in_days: nil, inviter_ WorkOS::Invitation.new(response.body) end + # Accepts an existing Invitation. + # + # @param [String] id The unique ID of the Invitation. + # + # @return WorkOS::Invitation + def accept_invitation(id:) + request = post_request( + path: "/user_management/invitations/#{id}/accept", + auth: true, + ) + + response = execute_request(request: request) + + WorkOS::Invitation.new(response.body) + end + # Revokes an existing Invitation. # # @param [String] id The unique ID of the Invitation. diff --git a/spec/lib/workos/user_management_spec.rb b/spec/lib/workos/user_management_spec.rb index 2cdbc4e7..b9485f9c 100644 --- a/spec/lib/workos/user_management_spec.rb +++ b/spec/lib/workos/user_management_spec.rb @@ -1728,6 +1728,81 @@ end end + describe '.accept_invitation' do + context 'with a valid id' do + it 'accepts invitation' do + expect(described_class).to receive(:post_request) do |options| + expect(options[:path]).to eq('/user_management/invitations/invitation_123/accept') + expect(options[:auth]).to be true + + double('request') + end.and_return(double('request')) + + response_body = { + id: 'invitation_123', + email: 'test@workos.com', + state: 'accepted', + }.to_json + + expect(described_class).to receive(:execute_request).and_return( + double('response', body: response_body), + ) + + invitation = described_class.accept_invitation( + id: 'invitation_123', + ) + + expect(invitation.id).to eq('invitation_123') + expect(invitation.email).to eq('test@workos.com') + expect(invitation.state).to eq('accepted') + end + end + + context 'with an invalid id' do + it 'returns an error' do + expect(described_class).to receive(:post_request) do |options| + expect(options[:path]).to eq('/user_management/invitations/invalid_id/accept') + expect(options[:auth]).to be true + + double('request') + end.and_return(double('request')) + + expect(described_class).to receive(:execute_request).and_raise( + WorkOS::NotFoundError.new(message: 'Invitation not found'), + ) + + expect do + described_class.accept_invitation(id: 'invalid_id') + end.to raise_error( + WorkOS::NotFoundError, + /Invitation not found/, + ) + end + end + + context 'when invitation has already been accepted' do + it 'returns an error' do + expect(described_class).to receive(:post_request) do |options| + expect(options[:path]).to eq('/user_management/invitations/invitation_123/accept') + expect(options[:auth]).to be true + + double('request') + end.and_return(double('request')) + + expect(described_class).to receive(:execute_request).and_raise( + WorkOS::InvalidRequestError.new(message: 'Invite has already been accepted'), + ) + + expect do + described_class.accept_invitation(id: 'invitation_123') + end.to raise_error( + WorkOS::InvalidRequestError, + /Invite has already been accepted/, + ) + end + end + end + describe '.revoke_invitation' do context 'with valid payload' do it 'revokes invitation' do