Skip to content

Commit 13c3d70

Browse files
alicodingclaude
andcommitted
ADR-0016 Phase A: rename Connector to HTTPRequest, frontend + e2e + docs
Completes the rename started in the previous commit (Go backend only) across the rest of the codebase: frontend components/files (ConnectorForm/ConnectorSummary/ConnectorTestPanel/ConfigureIntegration -> RequestForm/RequestSummary/RequestTestPanel/ConfigureRequests, connectorHeaders.ts -> requestHeaders.ts), the composition canvas's IntegrationBindingsEditor/NodeInspector (connectorId config key -> requestId, a real functional wiring fix, not just cosmetic), 10 e2e spec files (7 renamed, all test IDs/labels/helper functions updated), docs/SPEC.md (a new Update entry, terminology note on §4.1's own historical table), and pointer notes on the six ADRs (0007, 0009, 0011, 0013, 0014, 0015) that predate this rename and are otherwise left as written, per this repo's own "historical decision records stay as written" practice (§9.1). Verified: full Go build/vet/test/lint (both build tags), frontend tsc/eslint/boundaries/vitest/build, and the complete 57-test Playwright e2e suite run twice with no persisted-data leakage (.claude/rules/ testing.md). Zero UX/behavior change in this phase -- Method is still a closed 5-value list; that's Phase B, tracked in ADR-0016. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C7zUjYuMtgetjNaxMQPg2h
1 parent e884209 commit 13c3d70

71 files changed

Lines changed: 1837 additions & 1796 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

compositionservice.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ func (c *CompositionService) UpdateWorkflow(id, label, description string, nodes
211211
// place -- the delegate ConfigureService (configureservice.go) calls for
212212
// its Attributes CRUD, per SPEC.md §3.5's "Configure-authored but
213213
// workflow-scoped" cardinality (Attributes aren't their own top-level
214-
// entity the way a Connector/List is, they're metadata on a Workflow).
214+
// entity the way an HTTPRequest/List is, they're metadata on a Workflow).
215215
// Re-validates the existing Nodes/Edges against the *new* schema before
216216
// accepting it: a Decision edge referencing a field this change removes
217217
// or retypes must be caught here, not left to silently break the next

configuremcpserver.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"github.com/alicoding/mill/internal/domain/mcpserver"
1010
)
1111

12-
// mcpServersKey mirrors connectorsKey/listsKey's shape (configureservice.go):
12+
// mcpServersKey mirrors requestsKey/listsKey's shape (configureservice.go):
1313
// one atomic JSON blob, same settings.json file. In its own file (not
1414
// appended to configureservice.go) to keep that file under CLAUDE.md's
1515
// 500-line convention -- confirmed it was already close before this was
@@ -18,7 +18,7 @@ const mcpServersKey = "configure-mcpservers"
1818

1919
// resolveMCPServer implements composition.go's lookupMCPServerFn seam.
2020
// Unexported, so Wails never binds it as a callable frontend method --
21-
// Go-internal wiring only, same as resolveConnector/resolveList.
21+
// Go-internal wiring only, same as resolveHTTPRequest/resolveList.
2222
func (c *ConfigureService) resolveMCPServer(id string) (composition.ResolvedMCPServer, error) {
2323
c.mu.Lock()
2424
defer c.mu.Unlock()
@@ -101,7 +101,7 @@ func (c *ConfigureService) DeleteMCPServer(id string) error {
101101

102102
// ListMCPServerTools is a live, on-demand reference lookup (connects to
103103
// the server, lists its tools, disconnects) -- not persisted or synced,
104-
// same "occasional reference lookup, not a live feed" shape Connectors()/
104+
// same "occasional reference lookup, not a live feed" shape HTTPRequests()/
105105
// Lists() themselves already have (the frontend polls them on demand,
106106
// nothing pushes). This is docs/SPEC.md §3.6's actual discoverability
107107
// answer: a user finds the exact toolName to paste into an mcp-tool-call

configureservice.go

Lines changed: 46 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@ import (
88
"github.com/alicoding/mill/internal/adapters/openapispec"
99
"github.com/alicoding/mill/internal/adapters/settings"
1010
"github.com/alicoding/mill/internal/domain/composition"
11-
"github.com/alicoding/mill/internal/domain/connector"
11+
"github.com/alicoding/mill/internal/domain/httprequest"
1212
"github.com/alicoding/mill/internal/domain/list"
1313
"github.com/alicoding/mill/internal/domain/mcpserver"
1414
)
1515

16-
// validateOpenAPISpec rejects a Connector save whose OpenAPISpec field
17-
// doesn't parse -- an empty spec is valid (ADR-0007: OpenAPISpec is
18-
// optional, a Connector with none behaves exactly as before this field
19-
// existed). Parsing/validating a Connector's raw spec text is a
16+
// validateOpenAPISpec rejects an HTTPRequest save whose OpenAPISpec
17+
// field doesn't parse -- an empty spec is valid (ADR-0007: OpenAPISpec
18+
// is optional, a request with none behaves exactly as before this
19+
// field existed). Parsing/validating a request's raw spec text is a
2020
// commodity-adapter concern (internal/adapters/openapispec), not core
2121
// domain, so it lives here at the service layer rather than inside
22-
// connector.Validate -- internal/domain/connector stays pure per
22+
// httprequest.Validate -- internal/domain/httprequest stays pure per
2323
// CLAUDE.md's domain-purity rule, same reasoning ConfigureService
2424
// already applies to credential.Delete/Set below.
2525
func validateOpenAPISpec(spec string) error {
@@ -32,29 +32,35 @@ func validateOpenAPISpec(spec string) error {
3232
return nil
3333
}
3434

35-
// connectorsKey/listsKey mirror workflowsKey's shape (compositionservice.go):
35+
// requestsKey/listsKey mirror workflowsKey's shape (compositionservice.go):
3636
// one atomic JSON blob per entity kind, sharing the same settings.json
37-
// file rather than a new store/file per entity.
37+
// file rather than a new store/file per entity. requestsKey renamed
38+
// from connectorsKey by ADR-0016 -- restore() below migrates
39+
// already-persisted data forward from the old key, since (unlike
40+
// composition-workflows -> -v2's own prototype-data precedent) this
41+
// key holds real current data on a real machine, not throwaway data
42+
// safe to silently drop.
3843
const (
39-
connectorsKey = "configure-connectors"
40-
listsKey = "configure-lists"
44+
requestsKey = "configure-requests"
45+
legacyConnectorsKey = "configure-connectors"
46+
listsKey = "configure-lists"
4147
)
4248

4349
// ConfigureService is the Wails-facing layer over Configure-authored data
44-
// (docs/SPEC.md §3.5): Connectors, Lists, and (delegated to
50+
// (docs/SPEC.md §3.5): HTTPRequests, Lists, and (delegated to
4551
// CompositionService) a workflow's Attributes schema. Mirrors
4652
// CompositionService's own shape -- state + persistence a stateless
4753
// domain package can't own, no domain logic of its own.
4854
//
49-
// It also owns wiring composition.go's connector-lookup and list-lookup
50-
// seams (SetConnectorLookup/SetListLookup) to its own resolve* methods --
51-
// composition.go doesn't (and shouldn't) import this package directly,
52-
// same reasoning as CompositionService's Syncer interface for
53-
// TriggerService.
55+
// It also owns wiring composition.go's request-lookup and list-lookup
56+
// seams (SetHTTPRequestLookup/SetListLookup) to its own resolve*
57+
// methods -- composition.go doesn't (and shouldn't) import this
58+
// package directly, same reasoning as CompositionService's Syncer
59+
// interface for TriggerService.
5460
type ConfigureService struct {
5561
mu sync.Mutex
5662
store settings.Store
57-
connectors []connector.Connector
63+
requests []httprequest.HTTPRequest
5864
lists []list.List
5965
mcpServers []mcpserver.MCPServer
6066
composition *CompositionService
@@ -64,7 +70,7 @@ func NewConfigureService(store settings.Store, comp *CompositionService) *Config
6470
c := &ConfigureService{store: store, composition: comp}
6571
c.restore()
6672
c.restoreMCPServers()
67-
composition.SetConnectorLookup(c.resolveConnector)
73+
composition.SetHTTPRequestLookup(c.resolveHTTPRequest)
6874
composition.SetListLookup(c.resolveList)
6975
composition.SetMCPServerLookup(c.resolveMCPServer)
7076
return c
@@ -173,25 +179,32 @@ func (c *ConfigureService) persistLists() {
173179
_ = c.store.Set(listsKey, string(data))
174180
}
175181

176-
// restore loads persisted Connectors/Lists, or -- on a genuinely fresh
177-
// install, nothing ever persisted for connectors -- seeds c.connectors
178-
// with connector.BuiltIn()'s seven example connectors (docs/SPEC.md
179-
// §4's Update) plus their demo secrets (seedBuiltInSecrets,
180-
// configureservice_builtin.go). Same lazy-seed-until-first-real-
182+
// restore loads persisted HTTPRequests/Lists. HTTPRequests has three
183+
// cases, checked in order (ADR-0016's migration plan): (1) requestsKey
184+
// already has data -- the common case after this migration has run
185+
// once; (2) requestsKey is empty but the pre-rename legacyConnectorsKey
186+
// has data -- a real machine's existing Connectors, migrated forward
187+
// and persisted under the new key so this branch never fires again;
188+
// (3) neither key has anything -- a genuinely fresh install, seeded
189+
// with httprequest.BuiltIn()'s seven examples (docs/SPEC.md §4's
190+
// Update) plus their demo secrets (seedBuiltInSecrets,
191+
// configureservice_builtin.go), same lazy-seed-until-first-real-
181192
// mutation shape CompositionService.restore() already established for
182-
// Workflows: seeded here, not eagerly persisted, so identically
183-
// re-seeding on a second launch before any real edit is harmless
184-
// (nothing was ever changed to lose); the moment any real mutation
185-
// happens (including deleting a seed), persistConnectors() makes it
186-
// real and this branch never fires again.
193+
// Workflows.
187194
func (c *ConfigureService) restore() {
188-
if raw, ok := c.store.Get(connectorsKey).(string); ok && raw != "" {
189-
var connectors []connector.Connector
190-
if err := json.Unmarshal([]byte(raw), &connectors); err == nil {
191-
c.connectors = connectors
195+
if raw, ok := c.store.Get(requestsKey).(string); ok && raw != "" {
196+
var requests []httprequest.HTTPRequest
197+
if err := json.Unmarshal([]byte(raw), &requests); err == nil {
198+
c.requests = requests
199+
}
200+
} else if raw, ok := c.store.Get(legacyConnectorsKey).(string); ok && raw != "" {
201+
var requests []httprequest.HTTPRequest
202+
if err := json.Unmarshal([]byte(raw), &requests); err == nil {
203+
c.requests = requests
204+
c.persistHTTPRequests()
192205
}
193206
} else {
194-
c.connectors = connector.BuiltIn()
207+
c.requests = httprequest.BuiltIn()
195208
c.seedBuiltInSecrets()
196209
}
197210
if raw, ok := c.store.Get(listsKey).(string); ok && raw != "" {

configureservice_builtin.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ package main
33
import (
44
"github.com/alicoding/mill/internal/adapters/credential"
55
"github.com/alicoding/mill/internal/domain/composition"
6-
"github.com/alicoding/mill/internal/domain/connector"
6+
"github.com/alicoding/mill/internal/domain/httprequest"
77
)
88

9-
// builtInSecrets holds the demo secret VALUES for connector.BuiltIn()'s
9+
// builtInSecrets holds the demo secret VALUES for httprequest.BuiltIn()'s
1010
// seeded examples -- kept here, in package main, not in
11-
// internal/domain/connector, since Connector itself never carries a
11+
// internal/domain/httprequest, since HTTPRequest itself never carries a
1212
// secret field (domain purity -- ADR-0007's own "the secret itself
13-
// never lives on a Connector value at all" rule) -- only the layer
13+
// never lives on an HTTPRequest value at all" rule) -- only the layer
1414
// that already owns credential.Set calls should own these values too.
1515
//
1616
// Every value here is either a publicly-published test credential
@@ -20,12 +20,12 @@ import (
2020
// echoes back whatever it received, docs/SPEC.md §4's own honest
2121
// caveat on those examples' Description). AuthOAuth2's example
2222
// deliberately has no entry here -- Mill's own repo will never carry a
23-
// real client secret, see connector.BuiltIn()'s own doc comment.
23+
// real client secret, see httprequest.BuiltIn()'s own doc comment.
2424
var builtInSecrets = map[string]string{
25-
connector.ExampleAPIKeyID: "demo-api-key-do-not-use-in-production",
26-
connector.ExampleBearerID: "demo-bearer-token-do-not-use-in-production",
27-
connector.ExampleHMACID: "demo-hmac-signing-key-do-not-use-in-production",
28-
connector.ExampleQueryParamID: "demo-query-api-key-do-not-use-in-production",
25+
httprequest.ExampleAPIKeyID: "demo-api-key-do-not-use-in-production",
26+
httprequest.ExampleBearerID: "demo-bearer-token-do-not-use-in-production",
27+
httprequest.ExampleHMACID: "demo-hmac-signing-key-do-not-use-in-production",
28+
httprequest.ExampleQueryParamID: "demo-query-api-key-do-not-use-in-production",
2929
}
3030

3131
// builtInOAuth1ConsumerSecret is Postman's own published, intentionally
@@ -52,5 +52,5 @@ func (c *ConfigureService) seedBuiltInSecrets() {
5252
for id, secret := range builtInSecrets {
5353
_ = credential.Set(id, secret)
5454
}
55-
_ = credential.Set(connector.ExampleOAuth1ID, composition.EncodeOAuth1Secret(builtInOAuth1ConsumerSecret, ""))
55+
_ = credential.Set(httprequest.ExampleOAuth1ID, composition.EncodeOAuth1Secret(builtInOAuth1ConsumerSecret, ""))
5656
}

configureservice_builtin_test.go

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,33 @@ package main
33
import (
44
"testing"
55

6-
"github.com/alicoding/mill/internal/domain/connector"
6+
"github.com/alicoding/mill/internal/domain/httprequest"
77
)
88

9-
// docs/SPEC.md §4's Update: seeded example connectors, verified at the
10-
// service layer -- internal/domain/connector/builtin_test.go already
9+
// docs/SPEC.md §4's Update: seeded example requests, verified at the
10+
// service layer -- internal/domain/httprequest/builtin_test.go already
1111
// proves BuiltIn()'s own data is well-formed; these tests prove
1212
// ConfigureService actually seeds it (and its demo secrets) on a
1313
// genuinely fresh install, and that seeding is lazy/one-shot, same
1414
// pattern already proven for Workflows.
1515

16-
func TestConfigureService_FreshInstall_SeedsBuiltInConnectors(t *testing.T) {
16+
func TestConfigureService_FreshInstall_SeedsBuiltInRequests(t *testing.T) {
1717
store := newFakeStore()
1818
comp := NewCompositionService(store)
1919
cfg := NewConfigureService(store, comp)
2020

21-
got := cfg.Connectors()
22-
want := connector.BuiltIn()
21+
got := cfg.HTTPRequests()
22+
want := httprequest.BuiltIn()
2323
if len(got) != len(want) {
24-
t.Fatalf("Connectors() on a fresh install = %d entries, want %d (connector.BuiltIn())", len(got), len(want))
24+
t.Fatalf("HTTPRequests() on a fresh install = %d entries, want %d (httprequest.BuiltIn())", len(got), len(want))
2525
}
2626
seen := map[string]bool{}
27-
for _, c := range got {
28-
seen[c.ID] = true
27+
for _, r := range got {
28+
seen[r.ID] = true
2929
}
30-
for _, c := range want {
31-
if !seen[c.ID] {
32-
t.Errorf("fresh-install Connectors() missing built-in %q", c.ID)
30+
for _, r := range want {
31+
if !seen[r.ID] {
32+
t.Errorf("fresh-install HTTPRequests() missing built-in %q", r.ID)
3333
}
3434
}
3535
}
@@ -43,9 +43,9 @@ func TestConfigureService_FreshInstall_SeedsOAuth1DemoSecret(t *testing.T) {
4343
comp := NewCompositionService(store)
4444
cfg := NewConfigureService(store, comp)
4545

46-
rc, err := cfg.resolveConnector(connector.ExampleOAuth1ID)
46+
rc, err := cfg.resolveHTTPRequest(httprequest.ExampleOAuth1ID)
4747
if err != nil {
48-
t.Fatalf("resolveConnector(%q) returned error: %v", connector.ExampleOAuth1ID, err)
48+
t.Fatalf("resolveHTTPRequest(%q) returned error: %v", httprequest.ExampleOAuth1ID, err)
4949
}
5050
if rc.Secret == "" {
5151
t.Error("seeded OAuth1 example's resolved Secret is empty, want Postman's published test credential (encoded)")
@@ -62,19 +62,19 @@ func TestConfigureService_FreshInstall_SeedsPlaceholderDemoSecrets(t *testing.T)
6262
cfg := NewConfigureService(store, comp)
6363

6464
for id, want := range builtInSecrets {
65-
rc, err := cfg.resolveConnector(id)
65+
rc, err := cfg.resolveHTTPRequest(id)
6666
if err != nil {
67-
t.Errorf("resolveConnector(%q) returned error: %v", id, err)
67+
t.Errorf("resolveHTTPRequest(%q) returned error: %v", id, err)
6868
continue
6969
}
7070
if rc.Secret != want {
71-
t.Errorf("resolveConnector(%q) Secret = %q, want %q", id, rc.Secret, want)
71+
t.Errorf("resolveHTTPRequest(%q) Secret = %q, want %q", id, rc.Secret, want)
7272
}
7373
}
7474
}
7575

7676
// The OAuth2 example deliberately has no keychain secret seeded --
77-
// resolveConnector must still succeed (AuthOAuth2 != AuthNone, but
77+
// resolveHTTPRequest must still succeed (AuthOAuth2 != AuthNone, but
7878
// there's genuinely no secret to fetch since none was ever Set) rather
7979
// than erroring, since a missing-but-never-set secret and a
8080
// missing-but-expected one need to be distinguishable in principle --
@@ -85,79 +85,79 @@ func TestConfigureService_FreshInstall_OAuth2Example_HasNoSecretSeeded(t *testin
8585
comp := NewCompositionService(store)
8686
cfg := NewConfigureService(store, comp)
8787

88-
if _, err := cfg.resolveConnector(connector.ExampleOAuth2ID); err == nil {
89-
t.Error("resolveConnector for the credential-less OAuth2 example returned nil error, want an error (no secret was ever seeded for it, matching a real not-yet-configured connector)")
88+
if _, err := cfg.resolveHTTPRequest(httprequest.ExampleOAuth2ID); err == nil {
89+
t.Error("resolveHTTPRequest for the credential-less OAuth2 example returned nil error, want an error (no secret was ever seeded for it, matching a real not-yet-configured request)")
9090
}
9191
}
9292

9393
// Seeding is lazy and one-shot, same as CompositionService's own
94-
// BuiltInWorkflows pattern: deleting a seeded connector, then
94+
// BuiltInWorkflows pattern: deleting a seeded request, then
9595
// constructing a second ConfigureService over the same (now-persisted)
9696
// store, must NOT bring it back.
9797
func TestConfigureService_DeletingABuiltIn_DoesNotReturnOnRestart(t *testing.T) {
9898
store := newFakeStore()
9999
comp := NewCompositionService(store)
100100
cfg := NewConfigureService(store, comp)
101101

102-
if err := cfg.DeleteConnector(connector.ExampleNoneID); err != nil {
103-
t.Fatalf("DeleteConnector(%q) returned error: %v", connector.ExampleNoneID, err)
102+
if err := cfg.DeleteHTTPRequest(httprequest.ExampleNoneID); err != nil {
103+
t.Fatalf("DeleteHTTPRequest(%q) returned error: %v", httprequest.ExampleNoneID, err)
104104
}
105105

106106
restarted := NewConfigureService(store, comp)
107-
for _, c := range restarted.Connectors() {
108-
if c.ID == connector.ExampleNoneID {
109-
t.Fatalf("deleted built-in %q reappeared after restart, want it to stay deleted", connector.ExampleNoneID)
107+
for _, r := range restarted.HTTPRequests() {
108+
if r.ID == httprequest.ExampleNoneID {
109+
t.Fatalf("deleted built-in %q reappeared after restart, want it to stay deleted", httprequest.ExampleNoneID)
110110
}
111111
}
112112
// The other six built-ins should still be there -- deleting one
113113
// persists the whole (now-mutated) list, not just that one entry's
114114
// absence.
115-
if len(restarted.Connectors()) != len(connector.BuiltIn())-1 {
116-
t.Errorf("Connectors() after restart = %d entries, want %d (one deleted, the rest persisted)", len(restarted.Connectors()), len(connector.BuiltIn())-1)
115+
if len(restarted.HTTPRequests()) != len(httprequest.BuiltIn())-1 {
116+
t.Errorf("HTTPRequests() after restart = %d entries, want %d (one deleted, the rest persisted)", len(restarted.HTTPRequests()), len(httprequest.BuiltIn())-1)
117117
}
118118
}
119119

120120
// Editing a seeded example carries its BuiltIn flag forward (same
121121
// "purely informational" behavior CompositionService.UpdateWorkflow
122122
// already established) and correctly persists the new Description.
123-
func TestUpdateConnector_PreservesBuiltInFlag_AndUpdatesDescription(t *testing.T) {
123+
func TestUpdateHTTPRequest_PreservesBuiltInFlag_AndUpdatesDescription(t *testing.T) {
124124
store := newFakeStore()
125125
comp := NewCompositionService(store)
126126
cfg := NewConfigureService(store, comp)
127127

128-
var original connector.Connector
129-
for _, c := range cfg.Connectors() {
130-
if c.ID == connector.ExampleNoneID {
131-
original = c
128+
var original httprequest.HTTPRequest
129+
for _, r := range cfg.HTTPRequests() {
130+
if r.ID == httprequest.ExampleNoneID {
131+
original = r
132132
break
133133
}
134134
}
135135
if original.ID == "" {
136-
t.Fatalf("seeded connector %q not found", connector.ExampleNoneID)
136+
t.Fatalf("seeded request %q not found", httprequest.ExampleNoneID)
137137
}
138138

139-
updated, err := cfg.UpdateConnector(
140-
original.ID, original.Label, original.Type, original.BaseURL, original.AuthType,
139+
updated, err := cfg.UpdateHTTPRequest(
140+
original.ID, original.Label, original.BaseURL, original.AuthType,
141141
original.Headers, original.OpenAPISpec, original.Auth, original.JOSE, "my own notes",
142142
)
143143
if err != nil {
144-
t.Fatalf("UpdateConnector returned error: %v", err)
144+
t.Fatalf("UpdateHTTPRequest returned error: %v", err)
145145
}
146146
if !updated.BuiltIn {
147-
t.Error("UpdateConnector reset BuiltIn to false, want it carried forward (purely informational)")
147+
t.Error("UpdateHTTPRequest reset BuiltIn to false, want it carried forward (purely informational)")
148148
}
149149
if updated.Description != "my own notes" {
150-
t.Errorf("UpdateConnector Description = %q, want %q", updated.Description, "my own notes")
150+
t.Errorf("UpdateHTTPRequest Description = %q, want %q", updated.Description, "my own notes")
151151
}
152152
}
153153

154-
func TestCreateConnector_DescriptionPersists(t *testing.T) {
154+
func TestCreateHTTPRequest_DescriptionPersists(t *testing.T) {
155155
cfg, _ := newTestConfigureService(t)
156-
conn, err := cfg.CreateConnector("My API", connector.TypeHTTP, "https://example.com", connector.AuthNone, nil, "", nil, nil, "a helpful note")
156+
req, err := cfg.CreateHTTPRequest("My API", "https://example.com", httprequest.AuthNone, nil, "", nil, nil, "a helpful note")
157157
if err != nil {
158-
t.Fatalf("CreateConnector returned error: %v", err)
158+
t.Fatalf("CreateHTTPRequest returned error: %v", err)
159159
}
160-
if conn.Description != "a helpful note" {
161-
t.Errorf("CreateConnector Description = %q, want %q", conn.Description, "a helpful note")
160+
if req.Description != "a helpful note" {
161+
t.Errorf("CreateHTTPRequest Description = %q, want %q", req.Description, "a helpful note")
162162
}
163163
}

0 commit comments

Comments
 (0)