Skip to content

Commit de28ff0

Browse files
committed
Remove authorization from Unsubscribe request
1 parent e3f0a52 commit de28ff0

4 files changed

Lines changed: 66 additions & 56 deletions

File tree

e2e/e2e_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package e2e_test
55
import (
66
"bytes"
77
"context"
8+
"errors"
89
"fmt"
910
"os"
1011
"testing"
@@ -144,6 +145,60 @@ func TestAppSyncAuthorizers(t *testing.T) {
144145
}
145146
}
146147

148+
func TestSuccessfulUnsubscribe(t *testing.T) {
149+
http_endpoint := require_env(t, "APPSYNC_E2E_HTTP_ENDPOINT")
150+
ws_endpoint := require_env(t, "APPSYNC_E2E_WS_ENDPOINT")
151+
152+
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
153+
defer cancel()
154+
155+
authz, err := authorizer.ApiKey(authorizer.ApiKeyAuthorizerConfig{
156+
ApiKey: require_env(t, "APPSYNC_E2E_API_KEY"),
157+
Endpoint: http_endpoint,
158+
})
159+
if err != nil {
160+
t.Fatalf("create authorizer: %v", err)
161+
}
162+
163+
client, err := appsync.Connect(ctx, appsync.ConnectionOptions{
164+
Endpoint: ws_endpoint,
165+
Subprotocols: []string{appsync.ProtocolEvents},
166+
Authorizer: authz,
167+
})
168+
if err != nil {
169+
t.Fatalf("connect: %v", err)
170+
}
171+
defer func() {
172+
close_ctx, close_cancel := context.WithTimeout(context.Background(), 5*time.Second)
173+
defer close_cancel()
174+
if err := client.Close(close_ctx); err != nil {
175+
t.Logf("client close: %v", err)
176+
}
177+
}()
178+
179+
namespace := require_env(t, "APPSYNC_E2E_NS_API_KEY")
180+
channel := fmt.Sprintf("%s/test-%d", namespace, time.Now().UnixNano())
181+
182+
sub, err := client.Subscribe(ctx, appsync.SubscribeCommandInput{
183+
Channel: channel,
184+
})
185+
if err != nil {
186+
t.Fatalf("subscribe: %v", err)
187+
}
188+
189+
close_ctx, close_cancel := context.WithTimeout(context.Background(), 5*time.Second)
190+
defer close_cancel()
191+
192+
if err := sub.Close(close_ctx); err != nil {
193+
t.Fatalf("unsubscribe: %v", err)
194+
}
195+
196+
_, err = sub.Next(ctx)
197+
if !errors.Is(err, appsync.ErrSubscriptionClosed) {
198+
t.Fatalf("expected ErrSubscriptionClosed after unsubscribe, got: %v", err)
199+
}
200+
}
201+
147202
func TestInvalidApiKeyCannotConnect(t *testing.T) {
148203
http_endpoint := require_env(t, "APPSYNC_E2E_HTTP_ENDPOINT")
149204
ws_endpoint := require_env(t, "APPSYNC_E2E_WS_ENDPOINT")

internal/app/services/subscription/unsubscribe.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,16 @@ import (
99
type UnsubscribeService struct {
1010
subscriptions UnsubscribeRegistry
1111
writer app.SendMessageService
12-
authorizer app.RequestAuthorizer
1312
frame FrameFactory
1413
}
1514

1615
func NewUnsubscribeService(
1716
subscriptions UnsubscribeRegistry,
1817
writer app.SendMessageService,
19-
authorizer app.RequestAuthorizer,
2018
frame FrameFactory,
2119
) *UnsubscribeService {
2220
return &UnsubscribeService{
2321
frame: frame,
24-
authorizer: authorizer,
2522
writer: writer,
2623
subscriptions: subscriptions,
2724
}
@@ -39,16 +36,10 @@ func (service UnsubscribeService) Unsubscribe(ctx context.Context, subscription_
3936
return app.ErrSubscriptionClosed
4037
}
4138

42-
signature, err := service.authorizer.Authorize(ctx, app.AuthorizeCommandInput{})
43-
if err != nil {
44-
return err
45-
}
46-
4739
frame.WithType(protocol.TypeUnsubscribe).
48-
WithSignature(signature).
4940
WithID(subscription_id)
5041

51-
err = service.writer.Send(ctx, frame.Build())
42+
err := service.writer.Send(ctx, frame.Build())
5243

5344
if err != nil {
5445
return err

internal/app/services/subscription/unsubscribe_test.go

Lines changed: 8 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,6 @@ type mock_unsubscribe_registry struct {
1919
func (m *mock_unsubscribe_registry) Get(_ string) *subscription.Subscription { return m.sub }
2020
func (m *mock_unsubscribe_registry) Remove(id string) { m.removed = id }
2121

22-
type mock_authorizer struct {
23-
signature app.Signature
24-
err error
25-
}
26-
27-
func (m *mock_authorizer) Authorize(_ context.Context, _ app.AuthorizeCommandInput) (app.Signature, error) {
28-
return m.signature, m.err
29-
}
30-
3122
type mock_sender struct {
3223
err error
3324
called bool
@@ -45,19 +36,15 @@ func (m mock_frame) Encode() (app.Payload, error) { return nil, nil }
4536

4637
type mock_frame_builder struct {
4738
frame_type string
48-
signature app.Signature
4939
id string
5040
}
5141

52-
func (m *mock_frame_builder) WithPayload(_ app.Payload) app.FrameBuilder { return m }
53-
func (m *mock_frame_builder) WithChannel(_ string) app.FrameBuilder { return m }
54-
func (m *mock_frame_builder) WithSignature(s app.Signature) app.FrameBuilder {
55-
m.signature = s
56-
return m
57-
}
58-
func (m *mock_frame_builder) WithType(t string) app.FrameBuilder { m.frame_type = t; return m }
59-
func (m *mock_frame_builder) WithID(id string) app.FrameBuilder { m.id = id; return m }
60-
func (m *mock_frame_builder) Build() app.Frame { return mock_frame{} }
42+
func (m *mock_frame_builder) WithPayload(_ app.Payload) app.FrameBuilder { return m }
43+
func (m *mock_frame_builder) WithChannel(_ string) app.FrameBuilder { return m }
44+
func (m *mock_frame_builder) WithSignature(s app.Signature) app.FrameBuilder { return m }
45+
func (m *mock_frame_builder) WithType(t string) app.FrameBuilder { m.frame_type = t; return m }
46+
func (m *mock_frame_builder) WithID(id string) app.FrameBuilder { m.id = id; return m }
47+
func (m *mock_frame_builder) Build() app.Frame { return mock_frame{} }
6148

6249
type mock_frame_factory struct {
6350
builder *mock_frame_builder
@@ -79,14 +66,11 @@ func inactive_subscription() *subscription.Subscription {
7966
func TestUnsubscribe(t *testing.T) {
8067
const subscriptionId = "sub-id"
8168

82-
auth_err := errors.New("auth failed")
8369
send_err := errors.New("send failed")
84-
signature := app.Signature{"Authorization": "sig-value"}
8570

8671
tests := []struct {
8772
name string
8873
registry *mock_unsubscribe_registry
89-
authorizer *mock_authorizer
9074
sender *mock_sender
9175
expect_err error
9276
expect_send bool
@@ -95,28 +79,18 @@ func TestUnsubscribe(t *testing.T) {
9579
{
9680
name: "subscription not found",
9781
registry: &mock_unsubscribe_registry{sub: nil},
98-
authorizer: &mock_authorizer{},
9982
sender: &mock_sender{},
10083
expect_err: app.ErrSubscriptionClosed,
10184
},
10285
{
10386
name: "inactive subscription",
10487
registry: &mock_unsubscribe_registry{sub: inactive_subscription()},
105-
authorizer: &mock_authorizer{},
10688
sender: &mock_sender{},
10789
expect_err: app.ErrSubscriptionClosed,
10890
},
109-
{
110-
name: "authorize error stops execution",
111-
registry: &mock_unsubscribe_registry{sub: active_subscription()},
112-
authorizer: &mock_authorizer{err: auth_err},
113-
sender: &mock_sender{},
114-
expect_err: auth_err,
115-
},
11691
{
11792
name: "send error does not clean up",
11893
registry: &mock_unsubscribe_registry{sub: active_subscription()},
119-
authorizer: &mock_authorizer{signature: signature},
12094
sender: &mock_sender{err: send_err},
12195
expect_err: send_err,
12296
expect_send: true,
@@ -127,11 +101,6 @@ func TestUnsubscribe(t *testing.T) {
127101
if frame.id != subscriptionId {
128102
t.Errorf("frame.id = %q, want %q", frame.id, subscriptionId)
129103
}
130-
for k, v := range signature {
131-
if frame.signature[k] != v {
132-
t.Errorf("frame.signature[%q] = %q, want %q", k, frame.signature[k], v)
133-
}
134-
}
135104
if !registry.sub.Active() {
136105
t.Error("subscription should remain active when send fails")
137106
}
@@ -143,7 +112,6 @@ func TestUnsubscribe(t *testing.T) {
143112
{
144113
name: "success",
145114
registry: &mock_unsubscribe_registry{sub: active_subscription()},
146-
authorizer: &mock_authorizer{signature: signature},
147115
sender: &mock_sender{},
148116
expect_send: true,
149117
verify: func(t *testing.T, frame *mock_frame_builder, registry *mock_unsubscribe_registry) {
@@ -153,11 +121,7 @@ func TestUnsubscribe(t *testing.T) {
153121
if frame.id != subscriptionId {
154122
t.Errorf("frame.id = %q, want %q", frame.id, subscriptionId)
155123
}
156-
for k, v := range signature {
157-
if frame.signature[k] != v {
158-
t.Errorf("frame.signature[%q] = %q, want %q", k, frame.signature[k], v)
159-
}
160-
}
124+
161125
if registry.sub.Active() {
162126
t.Error("subscription should be closed after successful unsubscribe")
163127
}
@@ -172,7 +136,7 @@ func TestUnsubscribe(t *testing.T) {
172136
t.Run(tt.name, func(t *testing.T) {
173137
frame := &mock_frame_builder{}
174138
factory := &mock_frame_factory{builder: frame}
175-
service := sub_service.NewUnsubscribeService(tt.registry, tt.sender, tt.authorizer, factory)
139+
service := sub_service.NewUnsubscribeService(tt.registry, tt.sender, factory)
176140

177141
err := service.Unsubscribe(context.Background(), subscriptionId)
178142

internal/composition/usecases.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ func NewUseCases(authorizer app.RequestAuthorizer,
3737
subscriptions_registry := subscription.NewRegistry()
3838
create_subscription_service := sub_service.NewCreateSubscriptionService(subscriptions_registry, subscription_backpressure)
3939
send_request_service := request.NewSendRequestService(egress, pending)
40-
unsubscribe_service := sub_service.NewUnsubscribeService(subscriptions_registry,
40+
unsubscribe_service := sub_service.NewUnsubscribeService(
41+
subscriptions_registry,
4142
send_request_service,
42-
authorizer,
4343
events.FrameBuilderFactory{},
4444
)
4545

0 commit comments

Comments
 (0)