Skip to content

Commit 5941242

Browse files
committed
fix(http): add missing enabled and order fields to HttpAssert sync
Fixed multiple bugs where enabled and order fields were not properly handled in HttpAssert CRUD and sync operations: - ToAPIHttpAssert converter now includes Enabled and Order fields - HttpAssertInsert reads enabled/order from request instead of hardcoding - HttpAssertUpdate handles enabled/order field updates - Sync converter includes enabled/order in insert/update events - Service Update function now persists DisplayOrder changes Added comprehensive tests for all fixed functionality.
1 parent 9a9ee04 commit 5941242

7 files changed

Lines changed: 234 additions & 19 deletions

File tree

packages/server/internal/api/rhttp/rhttp_converter.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,22 +195,27 @@ func httpAssertSyncResponseFrom(event HttpAssertEvent) *apiv1.HttpAssertSyncResp
195195

196196
switch event.Type {
197197
case eventTypeInsert:
198-
value_ := event.HttpAssert.GetValue()
199198
value = &apiv1.HttpAssertSync_ValueUnion{
200199
Kind: apiv1.HttpAssertSync_ValueUnion_KIND_INSERT,
201200
Insert: &apiv1.HttpAssertSyncInsert{
202201
HttpAssertId: event.HttpAssert.GetHttpAssertId(),
203202
HttpId: event.HttpAssert.GetHttpId(),
204-
Value: value_,
203+
Value: event.HttpAssert.GetValue(),
204+
Enabled: event.HttpAssert.GetEnabled(),
205+
Order: event.HttpAssert.GetOrder(),
205206
},
206207
}
207208
case eventTypeUpdate:
208209
value_ := event.HttpAssert.GetValue()
210+
enabled := event.HttpAssert.GetEnabled()
211+
order := event.HttpAssert.GetOrder()
209212
value = &apiv1.HttpAssertSync_ValueUnion{
210213
Kind: apiv1.HttpAssertSync_ValueUnion_KIND_UPDATE,
211214
Update: &apiv1.HttpAssertSyncUpdate{
212215
HttpAssertId: event.HttpAssert.GetHttpAssertId(),
213216
Value: &value_,
217+
Enabled: &enabled,
218+
Order: &order,
214219
},
215220
}
216221
case eventTypeDelete:

packages/server/internal/api/rhttp/rhttp_crud_assert.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,9 @@ func (h *HttpServiceRPC) HttpAssertInsert(ctx context.Context, req *connect.Requ
103103
ID: assertID,
104104
HttpID: httpID,
105105
Value: item.Value,
106-
Enabled: true, // Assertions are always active
107-
Description: "", // No description in API
108-
DisplayOrder: 0, // No order in API
106+
Enabled: item.Enabled,
107+
Description: "",
108+
DisplayOrder: item.Order,
109109
}
110110

111111
insertData = append(insertData, struct {
@@ -215,6 +215,12 @@ func (h *HttpServiceRPC) HttpAssertUpdate(ctx context.Context, req *connect.Requ
215215
if item.Value != nil {
216216
existingAssert.Value = *item.Value
217217
}
218+
if item.Enabled != nil {
219+
existingAssert.Enabled = *item.Enabled
220+
}
221+
if item.Order != nil {
222+
existingAssert.DisplayOrder = *item.Order
223+
}
218224
}
219225

220226
// Step 3: Execute updates in transaction

packages/server/internal/api/rhttp/rhttp_crud_assert_rpc_test.go

Lines changed: 175 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ func TestHttpAssertInsert(t *testing.T) {
2828
HttpAssertId: assertID.Bytes(),
2929
HttpId: httpID.Bytes(),
3030
Value: expression,
31+
Enabled: true,
32+
Order: 1.5,
3133
},
3234
},
3335
})
@@ -49,6 +51,50 @@ func TestHttpAssertInsert(t *testing.T) {
4951
}
5052
require.NotNil(t, found, "assert not found in collection")
5153
require.Equal(t, expression, found.Value)
54+
require.True(t, found.Enabled)
55+
require.Equal(t, float32(1.5), found.Order)
56+
}
57+
58+
func TestHttpAssertInsert_EnabledFalse(t *testing.T) {
59+
t.Parallel()
60+
f := newHttpFixture(t)
61+
wsID := f.createWorkspace(t, "test-workspace")
62+
httpID := f.createHttp(t, wsID, "test-http")
63+
64+
assertID := idwrap.NewNow()
65+
expression := "response.status == 200"
66+
67+
req := connect.NewRequest(&httpv1.HttpAssertInsertRequest{
68+
Items: []*httpv1.HttpAssertInsert{
69+
{
70+
HttpAssertId: assertID.Bytes(),
71+
HttpId: httpID.Bytes(),
72+
Value: expression,
73+
Enabled: false,
74+
Order: 2.0,
75+
},
76+
},
77+
})
78+
79+
_, err := f.handler.HttpAssertInsert(f.ctx, req)
80+
require.NoError(t, err)
81+
82+
// Verify insertion via Collection
83+
colReq := connect.NewRequest(&emptypb.Empty{})
84+
resp, err := f.handler.HttpAssertCollection(f.ctx, colReq)
85+
require.NoError(t, err)
86+
87+
var found *httpv1.HttpAssert
88+
for _, item := range resp.Msg.Items {
89+
if string(item.HttpAssertId) == string(assertID.Bytes()) {
90+
found = item
91+
break
92+
}
93+
}
94+
require.NotNil(t, found, "assert not found in collection")
95+
require.Equal(t, expression, found.Value)
96+
require.False(t, found.Enabled, "enabled should be false")
97+
require.Equal(t, float32(2.0), found.Order)
5298
}
5399

54100
func TestHttpAssertInsert_Errors(t *testing.T) {
@@ -91,14 +137,15 @@ func TestHttpAssertUpdate(t *testing.T) {
91137
assertID := idwrap.NewNow()
92138
// Manually create assertion to control ID
93139
assertion := &mhttp.HTTPAssert{
94-
ID: assertID,
95-
HttpID: httpID,
96-
Value: "response.status == 200",
97-
Description: "desc",
98-
Enabled: true,
99-
IsDelta: false,
100-
CreatedAt: time.Now().Unix(),
101-
UpdatedAt: time.Now().Unix(),
140+
ID: assertID,
141+
HttpID: httpID,
142+
Value: "response.status == 200",
143+
Description: "desc",
144+
Enabled: true,
145+
DisplayOrder: 1.0,
146+
IsDelta: false,
147+
CreatedAt: time.Now().Unix(),
148+
UpdatedAt: time.Now().Unix(),
102149
}
103150
err := f.handler.httpAssertService.Create(f.ctx, assertion)
104151
require.NoError(t, err)
@@ -130,6 +177,63 @@ func TestHttpAssertUpdate(t *testing.T) {
130177
}
131178
require.NotNil(t, found)
132179
require.Equal(t, newValue, found.Value)
180+
require.True(t, found.Enabled, "enabled should remain true")
181+
require.Equal(t, float32(1.0), found.Order, "order should remain unchanged")
182+
}
183+
184+
func TestHttpAssertUpdate_EnabledAndOrder(t *testing.T) {
185+
t.Parallel()
186+
f := newHttpFixture(t)
187+
wsID := f.createWorkspace(t, "test-workspace")
188+
httpID := f.createHttp(t, wsID, "test-http")
189+
190+
assertID := idwrap.NewNow()
191+
assertion := &mhttp.HTTPAssert{
192+
ID: assertID,
193+
HttpID: httpID,
194+
Value: "response.status == 200",
195+
Description: "desc",
196+
Enabled: true,
197+
DisplayOrder: 1.0,
198+
IsDelta: false,
199+
CreatedAt: time.Now().Unix(),
200+
UpdatedAt: time.Now().Unix(),
201+
}
202+
err := f.handler.httpAssertService.Create(f.ctx, assertion)
203+
require.NoError(t, err)
204+
205+
// Update enabled to false and order to 5.5
206+
newEnabled := false
207+
newOrder := float32(5.5)
208+
req := connect.NewRequest(&httpv1.HttpAssertUpdateRequest{
209+
Items: []*httpv1.HttpAssertUpdate{
210+
{
211+
HttpAssertId: assertID.Bytes(),
212+
Enabled: &newEnabled,
213+
Order: &newOrder,
214+
},
215+
},
216+
})
217+
218+
_, err = f.handler.HttpAssertUpdate(f.ctx, req)
219+
require.NoError(t, err)
220+
221+
// Verify update
222+
colReq := connect.NewRequest(&emptypb.Empty{})
223+
resp, err := f.handler.HttpAssertCollection(f.ctx, colReq)
224+
require.NoError(t, err)
225+
226+
var found *httpv1.HttpAssert
227+
for _, item := range resp.Msg.Items {
228+
if string(item.HttpAssertId) == string(assertID.Bytes()) {
229+
found = item
230+
break
231+
}
232+
}
233+
require.NotNil(t, found)
234+
require.Equal(t, "response.status == 200", found.Value, "value should remain unchanged")
235+
require.False(t, found.Enabled, "enabled should be updated to false")
236+
require.Equal(t, float32(5.5), found.Order, "order should be updated to 5.5")
133237
}
134238

135239
func TestHttpAssertUpdate_Errors(t *testing.T) {
@@ -254,3 +358,66 @@ func TestHttpAssertCollection(t *testing.T) {
254358
require.NoError(t, err)
255359
require.Len(t, resp.Msg.Items, 3)
256360
}
361+
362+
func TestHttpAssertCollection_VerifyEnabledAndOrder(t *testing.T) {
363+
t.Parallel()
364+
f := newHttpFixture(t)
365+
wsID := f.createWorkspace(t, "test-workspace")
366+
httpID := f.createHttp(t, wsID, "test-http")
367+
368+
assertID1 := idwrap.NewNow()
369+
assertion1 := &mhttp.HTTPAssert{
370+
ID: assertID1,
371+
HttpID: httpID,
372+
Value: "response.status == 200",
373+
Description: "enabled assertion",
374+
Enabled: true,
375+
DisplayOrder: 1.5,
376+
IsDelta: false,
377+
CreatedAt: time.Now().Unix(),
378+
UpdatedAt: time.Now().Unix(),
379+
}
380+
err := f.handler.httpAssertService.Create(f.ctx, assertion1)
381+
require.NoError(t, err)
382+
383+
assertID2 := idwrap.NewNow()
384+
assertion2 := &mhttp.HTTPAssert{
385+
ID: assertID2,
386+
HttpID: httpID,
387+
Value: "response.body.length > 0",
388+
Description: "disabled assertion",
389+
Enabled: false,
390+
DisplayOrder: 2.5,
391+
IsDelta: false,
392+
CreatedAt: time.Now().Unix(),
393+
UpdatedAt: time.Now().Unix(),
394+
}
395+
err = f.handler.httpAssertService.Create(f.ctx, assertion2)
396+
require.NoError(t, err)
397+
398+
colReq := connect.NewRequest(&emptypb.Empty{})
399+
resp, err := f.handler.HttpAssertCollection(f.ctx, colReq)
400+
require.NoError(t, err)
401+
require.Len(t, resp.Msg.Items, 2)
402+
403+
// Find and verify first assertion
404+
var found1, found2 *httpv1.HttpAssert
405+
for _, item := range resp.Msg.Items {
406+
if string(item.HttpAssertId) == string(assertID1.Bytes()) {
407+
found1 = item
408+
}
409+
if string(item.HttpAssertId) == string(assertID2.Bytes()) {
410+
found2 = item
411+
}
412+
}
413+
414+
require.NotNil(t, found1, "assertion 1 not found")
415+
require.Equal(t, "response.status == 200", found1.Value)
416+
require.True(t, found1.Enabled, "assertion 1 should be enabled")
417+
require.Equal(t, float32(1.5), found1.Order, "assertion 1 order should be 1.5")
418+
419+
require.NotNil(t, found2, "assertion 2 not found")
420+
require.Equal(t, "response.body.length > 0", found2.Value)
421+
require.False(t, found2.Enabled, "assertion 2 should be disabled")
422+
require.Equal(t, float32(2.5), found2.Order, "assertion 2 order should be 2.5")
423+
}

packages/server/internal/api/rhttp/rhttp_sync_rpc_test.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ func TestHttpAssertSync_Streaming(t *testing.T) {
617617
case <-time.After(100 * time.Millisecond):
618618
}
619619

620-
// Insert
620+
// Insert with enabled and order
621621
id := idwrap.NewNow()
622622
val := "res.status == 200"
623623

@@ -627,6 +627,8 @@ func TestHttpAssertSync_Streaming(t *testing.T) {
627627
HttpAssertId: id.Bytes(),
628628
HttpId: httpID.Bytes(),
629629
Value: val,
630+
Enabled: true,
631+
Order: 1.5,
630632
},
631633
},
632634
})
@@ -637,14 +639,20 @@ func TestHttpAssertSync_Streaming(t *testing.T) {
637639
v := items[0].GetValue()
638640
require.Equal(t, httpv1.HttpAssertSync_ValueUnion_KIND_INSERT, v.GetKind())
639641
require.Equal(t, val, v.GetInsert().GetValue())
642+
require.True(t, v.GetInsert().GetEnabled(), "insert should have enabled=true")
643+
require.Equal(t, float32(1.5), v.GetInsert().GetOrder(), "insert should have order=1.5")
640644

641-
// Update
645+
// Update enabled and order
642646
newVal := "res.status == 201"
647+
newEnabled := false
648+
newOrder := float32(2.5)
643649
reqUpdate := connect.NewRequest(&httpv1.HttpAssertUpdateRequest{
644650
Items: []*httpv1.HttpAssertUpdate{
645651
{
646652
HttpAssertId: id.Bytes(),
647653
Value: &newVal,
654+
Enabled: &newEnabled,
655+
Order: &newOrder,
648656
},
649657
},
650658
})
@@ -655,6 +663,8 @@ func TestHttpAssertSync_Streaming(t *testing.T) {
655663
v = items[0].GetValue()
656664
require.Equal(t, httpv1.HttpAssertSync_ValueUnion_KIND_UPDATE, v.GetKind())
657665
require.Equal(t, newVal, v.GetUpdate().GetValue())
666+
require.False(t, v.GetUpdate().GetEnabled(), "update should have enabled=false")
667+
require.Equal(t, float32(2.5), v.GetUpdate().GetOrder(), "update should have order=2.5")
658668

659669
// Delete
660670
reqDelete := connect.NewRequest(&httpv1.HttpAssertDeleteRequest{

packages/server/internal/converter/converter.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@ func ToAPIHttpAssert(assert mhttp.HTTPAssert) *httpv1.HttpAssert {
237237
HttpAssertId: assert.ID.Bytes(),
238238
HttpId: assert.HttpID.Bytes(),
239239
Value: assert.Value,
240+
Enabled: assert.Enabled,
241+
Order: assert.DisplayOrder,
240242
}
241243
}
242244

packages/server/internal/converter/converter_test.go

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -394,16 +394,41 @@ func TestToAPIHttpAssert(t *testing.T) {
394394
httpID := idwrap.NewNow()
395395

396396
assertion := mhttp.HTTPAssert{
397-
ID: assertID,
398-
HttpID: httpID,
399-
Value: "status == 200",
397+
ID: assertID,
398+
HttpID: httpID,
399+
Value: "status == 200",
400+
Enabled: true,
401+
DisplayOrder: 1.5,
400402
}
401403

402404
res := ToAPIHttpAssert(assertion)
403405

404406
assert.Equal(t, assertID.Bytes(), res.HttpAssertId)
405407
assert.Equal(t, httpID.Bytes(), res.HttpId)
406408
assert.Equal(t, "status == 200", res.Value)
409+
assert.True(t, res.Enabled)
410+
assert.Equal(t, float32(1.5), res.Order)
411+
}
412+
413+
func TestToAPIHttpAssert_DisabledWithOrder(t *testing.T) {
414+
assertID := idwrap.NewNow()
415+
httpID := idwrap.NewNow()
416+
417+
assertion := mhttp.HTTPAssert{
418+
ID: assertID,
419+
HttpID: httpID,
420+
Value: "body.length > 0",
421+
Enabled: false,
422+
DisplayOrder: 2.5,
423+
}
424+
425+
res := ToAPIHttpAssert(assertion)
426+
427+
assert.Equal(t, assertID.Bytes(), res.HttpAssertId)
428+
assert.Equal(t, httpID.Bytes(), res.HttpId)
429+
assert.Equal(t, "body.length > 0", res.Value)
430+
assert.False(t, res.Enabled)
431+
assert.Equal(t, float32(2.5), res.Order)
407432
}
408433

409434
func TestToAPIHttpVersion(t *testing.T) {

packages/server/pkg/service/shttp/assert.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ func (s *HttpAssertService) Update(ctx context.Context, assert *mhttp.HTTPAssert
160160
Value: assert.Value,
161161
Description: assert.Description,
162162
Enabled: assert.Enabled,
163-
DisplayOrder: float64(currentAssert.DisplayOrder),
163+
DisplayOrder: float64(assert.DisplayOrder),
164164
DeltaValue: stringToNull(currentAssert.DeltaValue),
165165
DeltaEnabled: currentAssert.DeltaEnabled,
166166
DeltaDescription: stringToNull(currentAssert.DeltaDescription),

0 commit comments

Comments
 (0)