Skip to content

Commit 25bbbc8

Browse files
authored
Merge pull request #778 from marle3003/develop
Develop
2 parents c9a0eb8 + ee6ee47 commit 25bbbc8

13 files changed

Lines changed: 190 additions & 82 deletions

File tree

docs/javascript-api/mokapi-encoding/base64-decode.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ Decodes a string value that is encoded with base-64 to its equivalent unencoded
2222
import { base64 } from 'mokapi/encoding'
2323

2424
export default function() {
25-
console.log(`The base64 decoded string of 'aGVsbG8gd29ybGQ=' is: ${base.decode('aGVsbG8gd29ybGQ=')}`)
25+
console.log(`The base64 decoded string of 'aGVsbG8gd29ybGQ=' is: ${base64.decode('aGVsbG8gd29ybGQ=')}`)
2626
}
2727
```

docs/javascript-api/mokapi-encoding/base64-encode.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ Encodes a string value to its equivalent string representation that is encoded w
2222
import { base64 } from 'mokapi/encoding'
2323

2424
export default function() {
25-
console.log(`The base64 encoding of 'hello world' is: ${base.encode('hello world')}`)
25+
console.log(`The base64 encoding of 'hello world' is: ${base64.encode('hello world')}`)
2626
}
2727
```

docs/resources/blogs/ensuring-api-contract-compliance-with-mokapi.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@ consumer and a backend service to validate real traffic. Using a small
3434
JavaScript script, Mokapi can forward requests to your backend and
3535
validates both requests and responses.
3636

37-
38-
Consumer (Frontend, Playwright, Microservice) → Mokapi → Backend API
39-
4037
```typescript
4138
import { on } from 'mokapi';
4239
import { fetch } from 'mokapi/http';
@@ -263,4 +260,6 @@ Using Mokapi between frontend and backend, between backend services, or inside K
263260
- more reliable CI pipelines
264261
- a smooth path from mocking to real backend validation
265262

266-
Mokapi ensures your API stays aligned with its specification, no matter how quickly your system evolves.
263+
Mokapi ensures your API stays aligned with its specification, no matter how quickly your system evolves.
264+
265+
> *Mokapi becomes your always-on API contract guardian — lightweight, transparent, and spec-driven.*

go.mod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ require (
1919
github.com/sirupsen/logrus v1.9.3
2020
github.com/stretchr/testify v1.11.1
2121
github.com/yuin/gopher-lua v1.1.1
22-
golang.org/x/net v0.47.0
23-
golang.org/x/text v0.31.0
22+
golang.org/x/net v0.48.0
23+
golang.org/x/text v0.32.0
2424
gopkg.in/go-asn1-ber/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d
2525
gopkg.in/yaml.v3 v3.0.1
2626
layeh.com/gopher-luar v1.0.11
@@ -80,8 +80,8 @@ require (
8080
github.com/xanzy/ssh-agent v0.3.3 // indirect
8181
go.etcd.io/bbolt v1.4.0 // indirect
8282
go.uber.org/atomic v1.9.0 // indirect
83-
golang.org/x/crypto v0.45.0 // indirect
84-
golang.org/x/sys v0.38.0 // indirect
83+
golang.org/x/crypto v0.46.0 // indirect
84+
golang.org/x/sys v0.39.0 // indirect
8585
google.golang.org/protobuf v1.36.6 // indirect
8686
gopkg.in/warnings.v0 v0.1.2 // indirect
8787
)

go.sum

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -190,15 +190,15 @@ go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk=
190190
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
191191
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
192192
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
193-
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
194-
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
193+
golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
194+
golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
195195
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
196196
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
197197
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
198-
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
199-
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
200-
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
201-
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
198+
golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
199+
golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
200+
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
201+
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
202202
golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
203203
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
204204
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -207,14 +207,14 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
207207
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
208208
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
209209
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
210-
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
211-
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
210+
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
211+
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
212212
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
213-
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
214-
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
213+
golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q=
214+
golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg=
215215
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
216-
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
217-
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
216+
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
217+
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
218218
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
219219
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
220220
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=

imap/idle_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,53 @@ func TestIdle(t *testing.T) {
143143
require.NoError(t, err)
144144
require.Equal(t, "+ idling", res)
145145

146+
res, err = c.SendRaw("A01 FINISHED")
147+
require.NoError(t, err)
148+
require.Equal(t, "A01 BAD Expected DONE to end IDLE", res)
149+
},
150+
},
151+
{
152+
name: "send updates while idle",
153+
handler: func(t *testing.T) imap.Handler {
154+
return &imaptest.Handler{
155+
SelectFunc: func(mailbox string, readonly bool, session map[string]interface{}) (*imap.Selected, error) {
156+
return &imap.Selected{}, nil
157+
},
158+
IdleFunc: func(w imap.UpdateWriter, done chan struct{}, session map[string]interface{}) error {
159+
session["idle"] = done
160+
go func() {
161+
err := w.WriteNumMessages(10)
162+
require.NoError(t, err)
163+
err = w.WriteMessageFlags(20, []imap.Flag{imap.FlagSeen})
164+
require.NoError(t, err)
165+
err = w.WriteExpunge(1)
166+
}()
167+
return nil
168+
},
169+
}
170+
},
171+
test: func(t *testing.T, c *imap.Client) {
172+
err := c.PlainAuth("", "bob", "password")
173+
require.NoError(t, err)
174+
_, err = c.Select("INBOX", false)
175+
require.NoError(t, err)
176+
177+
res, err := c.SendRaw("A01 IDLE")
178+
require.NoError(t, err)
179+
require.Equal(t, "+ idling", res)
180+
181+
res, err = c.ReadLine()
182+
require.NoError(t, err)
183+
require.Equal(t, "* 10 EXISTS", res)
184+
185+
res, err = c.ReadLine()
186+
require.NoError(t, err)
187+
require.Equal(t, "* 20 FETCH (\\Seen)", res)
188+
189+
res, err = c.ReadLine()
190+
require.NoError(t, err)
191+
require.Equal(t, "* 1 EXPUNGE", res)
192+
146193
res, err = c.SendRaw("A01 FINISHED")
147194
require.NoError(t, err)
148195
require.Equal(t, "A01 BAD Expected DONE to end IDLE", res)

js/mokapi/shared.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,3 +200,8 @@ func (p *SharedValue) ToValue() goja.Value {
200200
return p.source
201201
}
202202
}
203+
204+
// Export is used by the json schema parser interface Exportable
205+
func (p *SharedValue) Export() any {
206+
return p.source.Export()
207+
}

schema/json/parser/parser_object.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ func (p *Parser) parseStruct(v reflect.Value, s *schema.Schema, evaluated map[st
143143
obj := sortedmap.NewLinkedHashMap()
144144
for i := 0; i < v.NumField(); i++ {
145145
ft := t.Field(i)
146-
if ft.PkgPath == "" {
146+
if ft.PkgPath != "" {
147147
continue
148148
}
149149
name := unTitle(ft.Name)

schema/json/parser/parser_object_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package parser_test
22

33
import (
4+
"mokapi/js/mokapi"
45
"mokapi/schema/json/parser"
56
"mokapi/schema/json/schema"
67
"mokapi/schema/json/schema/schematest"
78
"mokapi/sortedmap"
89
"testing"
910

11+
"github.com/dop251/goja"
1012
"github.com/stretchr/testify/require"
1113
)
1214

@@ -459,6 +461,61 @@ func TestParser_ParseObject(t *testing.T) {
459461
require.Equal(t, map[string]interface{}{"foo": "bar", "bar": "abc"}, v)
460462
},
461463
},
464+
/*{
465+
name: "unevaluatedProperties",
466+
schema: schematest.NewTypes(nil,
467+
schematest.WithAllOf(
468+
schematest.New("object",
469+
schematest.WithAllOf(schematest.New("object",
470+
schematest.WithProperty("city", schematest.New("string")),
471+
)),
472+
),
473+
),
474+
schematest.WithProperty("type", schematest.NewTypes(nil, schematest.WithEnumValues("residential", "business"))),
475+
schematest.WithRequired("type"),
476+
schematest.WithUnevaluatedProperties(schematest.NewBool(false)),
477+
),
478+
data: map[string]any{"type": "residential", "city": "Washington"},
479+
test: func(t *testing.T, v interface{}, err error) {
480+
require.NoError(t, err)
481+
},
482+
},*/
483+
{
484+
name: "parse from JavaScript shared value",
485+
schema: schematest.NewTypes(nil,
486+
schematest.WithProperty("type", schematest.NewTypes(nil, schematest.WithEnumValues("residential", "business"))),
487+
schematest.WithRequired("type"),
488+
),
489+
data: func() any {
490+
vm := goja.New()
491+
v := vm.ToValue(map[string]any{"type": "residential"})
492+
return mokapi.NewSharedValue(v, vm)
493+
}(),
494+
test: func(t *testing.T, v interface{}, err error) {
495+
require.NoError(t, err)
496+
require.Equal(t, map[string]interface{}{"type": "residential"}, v)
497+
},
498+
},
499+
{
500+
name: "parse struct with private fields",
501+
schema: schematest.NewTypes(nil,
502+
schematest.WithProperty("bar", schematest.New("string")),
503+
schematest.WithRequired("bar"),
504+
),
505+
data: func() any {
506+
return &struct {
507+
foo string
508+
Bar string
509+
}{
510+
foo: "bar",
511+
Bar: "abc",
512+
}
513+
}(),
514+
test: func(t *testing.T, v interface{}, err error) {
515+
require.NoError(t, err)
516+
require.Equal(t, map[string]interface{}{"bar": "abc"}, v)
517+
},
518+
},
462519
}
463520

464521
t.Parallel()

webui/package-lock.json

Lines changed: 33 additions & 33 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)