Skip to content

Commit ed8beeb

Browse files
authored
Merge pull request #520 from marle3003/develop
Develop
2 parents 770cb88 + c16b231 commit ed8beeb

File tree

15 files changed

+183
-81
lines changed

15 files changed

+183
-81
lines changed

api/handler_smtp.go

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -57,20 +57,20 @@ type rejectResponse struct {
5757
}
5858

5959
type message struct {
60-
Sender *address `json:"sender,omitempty"`
61-
From []address `json:"from"`
62-
To []address `json:"to"`
63-
ReplyTo []address `json:"replyTo,omitempty"`
64-
Cc []address `json:"cc,omitempty"`
65-
Bcc []address `json:"bbc,omitempty"`
66-
MessageId string `json:"messageId"`
67-
InReplyTo string `json:"inReplyTo,omitempty"`
68-
Time time.Time `json:"time"`
69-
Subject string `json:"subject"`
70-
ContentType string `json:"contentType"`
71-
Encoding string `json:"encoding,omitempty"`
72-
Body string `json:"body"`
73-
Attachments []attachment `json:"attachments,omitempty"`
60+
Sender *address `json:"sender,omitempty"`
61+
From []address `json:"from"`
62+
To []address `json:"to"`
63+
ReplyTo []address `json:"replyTo,omitempty"`
64+
Cc []address `json:"cc,omitempty"`
65+
Bcc []address `json:"bbc,omitempty"`
66+
MessageId string `json:"messageId"`
67+
InReplyTo string `json:"inReplyTo,omitempty"`
68+
Time time.Time `json:"time"`
69+
Subject string `json:"subject"`
70+
ContentType string `json:"contentType"`
71+
ContentTransferEncoding string `json:"contentTransferEncoding,omitempty"`
72+
Body string `json:"body"`
73+
Attachments []attachment `json:"attachments,omitempty"`
7474
}
7575

7676
type address struct {
@@ -258,18 +258,18 @@ func getRejectResponse(r mail.Rule) *rejectResponse {
258258

259259
func toMessage(m *smtp.Message) *message {
260260
r := &message{
261-
From: toAddress(m.From),
262-
To: toAddress(m.To),
263-
ReplyTo: toAddress(m.ReplyTo),
264-
Cc: toAddress(m.Cc),
265-
Bcc: toAddress(m.Bcc),
266-
MessageId: m.MessageId,
267-
InReplyTo: m.InReplyTo,
268-
Time: m.Time,
269-
Subject: m.Subject,
270-
ContentType: m.ContentType,
271-
Encoding: m.Encoding,
272-
Body: m.Body,
261+
From: toAddress(m.From),
262+
To: toAddress(m.To),
263+
ReplyTo: toAddress(m.ReplyTo),
264+
Cc: toAddress(m.Cc),
265+
Bcc: toAddress(m.Bcc),
266+
MessageId: m.MessageId,
267+
InReplyTo: m.InReplyTo,
268+
Time: m.Time,
269+
Subject: m.Subject,
270+
ContentType: m.ContentType,
271+
ContentTransferEncoding: m.ContentTransferEncoding,
272+
Body: m.Body,
273273
}
274274

275275
if m.Sender != nil {

config/decoders/decoder_flag.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bytes"
55
"encoding/json"
66
"fmt"
7+
log "github.com/sirupsen/logrus"
78
"mokapi/config/dynamic/provider/file"
89
"net/url"
910
"reflect"
@@ -33,6 +34,7 @@ func NewFlagDecoderWithReader(reader file.FSReader) *FlagDecoder {
3334
}
3435

3536
func (f *FlagDecoder) Decode(flags map[string][]string, element interface{}) error {
37+
log.Infof("flags: %v", flags)
3638
keys := make([]string, 0, len(flags))
3739
for k := range flags {
3840
keys = append(keys, k)
@@ -44,7 +46,7 @@ func (f *FlagDecoder) Decode(flags map[string][]string, element interface{}) err
4446
ctx := &context{path: name, paths: paths, value: flags[name], element: reflect.ValueOf(element)}
4547
err := f.setValue(ctx)
4648
if err != nil {
47-
return fmt.Errorf("configuration error %v: %w", name, err)
49+
return fmt.Errorf("configuration error '%v' value '%v': %w", name, flags[name], err)
4850
}
4951
}
5052

@@ -195,6 +197,9 @@ func (f *FlagDecoder) setMap(ctx *context) error {
195197
m.Set(reflect.MakeMap(ctx.element.Type()))
196198
}
197199

200+
i := m.Interface()
201+
_ = i
202+
198203
var key reflect.Value
199204
if len(ctx.paths) >= 1 {
200205
key = reflect.ValueOf(ctx.paths[0])
@@ -209,6 +214,10 @@ func (f *FlagDecoder) setMap(ctx *context) error {
209214
}
210215
}
211216

217+
if !key.IsValid() {
218+
return fmt.Errorf("expected key to set map value")
219+
}
220+
212221
v := m.MapIndex(key)
213222
if !v.IsValid() {
214223
v = reflect.New(m.Type().Elem())

config/decoders/decoder_flag_test.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func TestFlagDecoder_Decode(t *testing.T) {
5252
}{}
5353
d := &FlagDecoder{}
5454
err := d.Decode(map[string][]string{"flag1": {"foo"}}, s)
55-
require.EqualError(t, err, "configuration error flag1: value foo cannot be parsed as bool: strconv.ParseBool: parsing \"foo\": invalid syntax")
55+
require.EqualError(t, err, "configuration error 'flag1' value '[foo]': value foo cannot be parsed as bool: strconv.ParseBool: parsing \"foo\": invalid syntax")
5656
require.False(t, s.Flag1)
5757
},
5858
},
@@ -259,11 +259,9 @@ func TestFlagDecoder_Decode(t *testing.T) {
259259
},
260260
}
261261

262-
t.Parallel()
263262
for _, tc := range testcases {
264263
tc := tc
265264
t.Run(tc.name, func(t *testing.T) {
266-
t.Parallel()
267265
tc.f(t)
268266
})
269267
}

config/decoders/decoder_test.go

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package decoders
22

33
import (
4+
log "github.com/sirupsen/logrus"
45
"github.com/stretchr/testify/require"
56
"os"
67
"strings"
@@ -223,8 +224,8 @@ func TestLoad(t *testing.T) {
223224
defer os.Unsetenv("MOKAPI_items[0].name")
224225
require.NoError(t, err)
225226
err = os.Setenv("MOKAPI_items[0].value", "123")
226-
require.NoError(t, err)
227227
defer os.Unsetenv("MOKAPI_items[0].value")
228+
require.NoError(t, err)
228229

229230
err = Load([]ConfigDecoder{&FlagDecoder{}}, s)
230231
require.NoError(t, err)
@@ -247,8 +248,8 @@ func TestLoad(t *testing.T) {
247248
defer os.Unsetenv("MOKAPI_items_0_name")
248249
require.NoError(t, err)
249250
err = os.Setenv("MOKAPI_items_0_value", "123")
250-
require.NoError(t, err)
251251
defer os.Unsetenv("MOKAPI_items_0_value")
252+
require.NoError(t, err)
252253

253254
err = Load([]ConfigDecoder{&FlagDecoder{}}, s)
254255
require.NoError(t, err)
@@ -272,7 +273,7 @@ func TestLoad(t *testing.T) {
272273
require.NoError(t, err)
273274
err = os.Setenv("MOKAPI_ITEMS_0_VALUE", "123")
274275
require.NoError(t, err)
275-
defer os.Unsetenv("MOKAPI_ITEMS_0_VALUE.0.value")
276+
defer os.Unsetenv("MOKAPI_ITEMS_0_VALUE")
276277
err = os.Setenv("MOKAPI_items.0.value", "123")
277278
require.NoError(t, err)
278279
defer os.Unsetenv("MOKAPI_items.0.value")
@@ -294,27 +295,45 @@ func TestLoad(t *testing.T) {
294295
os.Args = append(os.Args, "--foo=bar")
295296

296297
err := Load([]ConfigDecoder{&FlagDecoder{}}, s)
297-
require.EqualError(t, err, "configuration error foo: not found")
298+
require.EqualError(t, err, "configuration error 'foo' value '[bar]': not found")
298299
},
299300
},
300301
{
301302
name: "argument after positional argument",
302303
f: func(t *testing.T) {
303304
s := &struct {
304-
Name string
305+
Foo string
306+
Args []string `json:"args" yaml:"-" aliases:"args"`
305307
}{}
306308
os.Args = append(os.Args, "mokapi.exe", "file.json", "--foo=bar")
307309

308310
err := Load([]ConfigDecoder{&FlagDecoder{}}, s)
309-
require.EqualError(t, err, "unexpected --foo=bar after positional argument")
311+
require.NoError(t, err)
312+
require.Equal(t, s.Foo, "bar")
313+
require.Equal(t, s.Args, []string{"file.json"})
314+
},
315+
},
316+
{
317+
name: "after -- an additional flag argument",
318+
f: func(t *testing.T) {
319+
s := &struct {
320+
Foo string
321+
Args []string `json:"args" yaml:"-" aliases:"args"`
322+
}{}
323+
os.Args = append(os.Args, "mokapi.exe", "--", "--foo=bar")
324+
325+
err := Load([]ConfigDecoder{&FlagDecoder{}}, s)
326+
require.EqualError(t, err, "unknown positional argument: '--foo=bar'")
310327
},
311328
},
312329
}
313330

314331
for _, tc := range testcases {
315332
tc := tc
316333
t.Run(tc.name, func(t *testing.T) {
334+
log.Infof("Test: %s", tc.name)
317335
os.Args = nil
336+
log.Infof("Args: %s", os.Args)
318337
tc.f(t)
319338
})
320339
}
@@ -326,7 +345,6 @@ func TestLoad_Invalid(t *testing.T) {
326345
}{
327346
{args: "name=bar"},
328347
{args: "-"},
329-
{args: "--"},
330348
{args: "-=bar"},
331349
{args: "---name=bar"},
332350
}

config/decoders/parser.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,20 @@ func parseArgs(args []string) (map[string][]string, error) {
4545
for i := 0; i < len(args); i++ {
4646
s := args[i]
4747
if len(s) < 2 || s[0] != '-' {
48-
inPositionalArgs = true
4948
dictionary["args"] = append(dictionary["args"], s)
5049
continue
5150
} else if inPositionalArgs {
52-
return nil, fmt.Errorf("unexpected %v after positional argument", s)
51+
// currently, no positional argument with prefix -- are defined
52+
return nil, fmt.Errorf("unknown positional argument: '%s'", s)
5353
}
5454

5555
index := 1
5656

5757
if s[1] == '-' {
5858
index++
5959
if len(s) == 2 {
60-
return nil, fmt.Errorf("invalid argument %v", s)
60+
inPositionalArgs = true
61+
continue
6162
}
6263
}
6364

config/dynamic/mail/handler.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ func (h *Handler) ServeSMTP(rw smtp.ResponseWriter, r smtp.Request) {
2828
ctx := smtp.ClientFromContext(r.Context())
2929
switch req := r.(type) {
3030
case *smtp.LoginRequest:
31+
// todo disable Auth capability on server if no mailbox is defined
3132
for _, acc := range h.config.Mailboxes {
3233
if acc.Username == req.Username && acc.Password == req.Password {
3334
rw.Write(&smtp.LoginResponse{Result: &smtp.AuthSucceeded})

config/static/static_config_test.go

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -621,12 +621,13 @@ func TestFileProvider(t *testing.T) {
621621
testcases := []struct {
622622
name string
623623
args []string
624-
test func(t *testing.T, cfg *static.Config)
624+
test func(t *testing.T, cfg *static.Config, err error)
625625
}{
626626
{
627627
name: "skipPrefix single element appends to default value",
628628
args: []string{"--providers-file-skip-prefix", "foo"},
629-
test: func(t *testing.T, cfg *static.Config) {
629+
test: func(t *testing.T, cfg *static.Config, err error) {
630+
require.NoError(t, err)
630631
require.Len(t, cfg.Providers.File.SkipPrefix, 2)
631632
require.Contains(t, cfg.Providers.File.SkipPrefix, "foo")
632633
require.Contains(t, cfg.Providers.File.SkipPrefix, "_")
@@ -635,7 +636,8 @@ func TestFileProvider(t *testing.T) {
635636
{
636637
name: "skipPrefix list replace default value",
637638
args: []string{"--providers-file-skip-prefix", "foo", "bar"},
638-
test: func(t *testing.T, cfg *static.Config) {
639+
test: func(t *testing.T, cfg *static.Config, err error) {
640+
require.NoError(t, err)
639641
require.Len(t, cfg.Providers.File.SkipPrefix, 2)
640642
require.Contains(t, cfg.Providers.File.SkipPrefix, "foo")
641643
require.Contains(t, cfg.Providers.File.SkipPrefix, "bar")
@@ -644,42 +646,71 @@ func TestFileProvider(t *testing.T) {
644646
{
645647
name: "feature foo",
646648
args: []string{"--feature", "foo"},
647-
test: func(t *testing.T, cfg *static.Config) {
649+
test: func(t *testing.T, cfg *static.Config, err error) {
650+
require.NoError(t, err)
648651
require.Len(t, cfg.Features, 1)
649652
require.Equal(t, "foo", cfg.Features[0])
650653
},
651654
},
652655
{
653656
name: "event store size",
654657
args: []string{"--event-store-default", "size=200"},
655-
test: func(t *testing.T, cfg *static.Config) {
658+
test: func(t *testing.T, cfg *static.Config, err error) {
659+
require.NoError(t, err)
656660
require.Equal(t, int64(200), cfg.Event.Store["default"].Size)
657661
},
658662
},
659663
{
660664
name: "event store size",
661665
args: []string{"--event-store-default-size", "200"},
662-
test: func(t *testing.T, cfg *static.Config) {
666+
test: func(t *testing.T, cfg *static.Config, err error) {
667+
require.NoError(t, err)
663668
require.Equal(t, int64(200), cfg.Event.Store["default"].Size)
664669
},
665670
},
666671
{
667672
name: "default event store size",
668-
test: func(t *testing.T, cfg *static.Config) {
673+
test: func(t *testing.T, cfg *static.Config, err error) {
674+
require.NoError(t, err)
669675
require.Equal(t, int64(100), cfg.Event.Store["default"].Size)
670676
},
671677
},
672678
{
673679
name: "event store for foo",
674680
args: []string{"--event-store-foo-size", "250"},
675-
test: func(t *testing.T, cfg *static.Config) {
681+
test: func(t *testing.T, cfg *static.Config, err error) {
682+
require.NoError(t, err)
676683
require.Equal(t, int64(250), cfg.Event.Store["foo"].Size)
677684
},
678685
},
679686
{
680687
name: "event store name with spaces",
681688
args: []string{"--event-store", `Swagger PetStore API={"size": 250}`},
682-
test: func(t *testing.T, cfg *static.Config) {
689+
test: func(t *testing.T, cfg *static.Config, err error) {
690+
require.NoError(t, err)
691+
require.Equal(t, int64(250), cfg.Event.Store["Swagger PetStore API"].Size)
692+
},
693+
},
694+
{
695+
name: "event store name with spaces followed by positional parameter: error",
696+
args: []string{"--event-store", `Swagger PetStore API={"size": 250}`, "smtp.yaml"},
697+
test: func(t *testing.T, cfg *static.Config, err error) {
698+
require.EqualError(t, err, "configuration error 'event-store' value '[Swagger PetStore API={\"size\": 250} smtp.yaml]': expected key to set map value")
699+
},
700+
},
701+
{
702+
name: "event store name with spaces and positional parameter",
703+
args: []string{"--event-store", `Swagger PetStore API={"size": 250}`, "--", "smtp.yaml"},
704+
test: func(t *testing.T, cfg *static.Config, err error) {
705+
require.NoError(t, err)
706+
require.Equal(t, int64(250), cfg.Event.Store["Swagger PetStore API"].Size)
707+
},
708+
},
709+
{
710+
name: "positional parameter followed event store name with spaces and ",
711+
args: []string{"smtp.yaml", "--event-store", `Swagger PetStore API={"size": 250}`},
712+
test: func(t *testing.T, cfg *static.Config, err error) {
713+
require.NoError(t, err)
683714
require.Equal(t, int64(250), cfg.Event.Store["Swagger PetStore API"].Size)
684715
},
685716
},
@@ -694,9 +725,8 @@ func TestFileProvider(t *testing.T) {
694725

695726
cfg := static.NewConfig()
696727
err := decoders.Load([]decoders.ConfigDecoder{decoders.NewDefaultFileDecoder(), decoders.NewFlagDecoder()}, cfg)
697-
require.NoError(t, err)
698728

699-
tc.test(t, cfg)
729+
tc.test(t, cfg, err)
700730
})
701731
}
702732
}

0 commit comments

Comments
 (0)