Skip to content

Commit 8ec1611

Browse files
committed
common mocking for responses
1 parent bfa9b39 commit 8ec1611

File tree

1 file changed

+38
-32
lines changed

1 file changed

+38
-32
lines changed

mock.go

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -344,45 +344,31 @@ func (m *Mock) Query(ctx context.Context, q Query) (*Cursor, error) {
344344
return nil, query.Error
345345
}
346346

347-
var conn *Connection = nil
348-
responseVal := reflect.ValueOf(query.Response)
349-
if responseVal.Kind() == reflect.Chan || responseVal.Kind() == reflect.Func {
350-
conn = newConnection(newMockConn(query.Response), "mock", &ConnectOpts{})
351-
352-
query.Query.Type = p.Query_CONTINUE
353-
query.Query.Token = conn.nextToken()
354-
355-
conn.runConnection()
356-
}
357-
358347
if ctx == nil {
359348
ctx = context.Background()
360349
}
361350

351+
conn := newConnection(newMockConn(query.Response), "mock", &ConnectOpts{})
352+
353+
query.Query.Type = p.Query_CONTINUE
354+
query.Query.Token = conn.nextToken()
355+
362356
// Build cursor and return
363357
c := newCursor(ctx, conn, "", query.Query.Token, query.Query.Term, query.Query.Opts)
364358
c.finished = true
365359
c.fetching = false
366360
c.isAtom = true
361+
c.finished = false
362+
c.releaseConn = func() error { return conn.Close() }
367363

368-
if responseVal.Kind() == reflect.Slice || responseVal.Kind() == reflect.Array {
369-
for i := 0; i < responseVal.Len(); i++ {
370-
c.buffer = append(c.buffer, responseVal.Index(i).Interface())
371-
}
372-
} else if conn != nil {
373-
conn.cursors[query.Query.Token] = c
374-
c.finished = false
375-
c.releaseConn = func() error {
376-
return conn.Close()
377-
}
378-
c.mu.Lock()
379-
err := c.fetchMore()
380-
c.mu.Unlock()
381-
if err != nil {
382-
return nil, err
383-
}
384-
} else {
385-
c.buffer = append(c.buffer, query.Response)
364+
conn.cursors[query.Query.Token] = c
365+
conn.runConnection()
366+
367+
c.mu.Lock()
368+
err := c.fetchMore()
369+
c.mu.Unlock()
370+
if err != nil {
371+
return nil, err
386372
}
387373

388374
return c, nil
@@ -444,19 +430,39 @@ type mockConn struct {
444430
valueGetter func() []interface{}
445431
}
446432

447-
func newMockConn(responseGetter interface{}) *mockConn {
433+
func newMockConn(response interface{}) *mockConn {
448434
c := &mockConn{tokens: make(chan int64, 1)}
449-
switch g := responseGetter.(type) {
435+
switch g := response.(type) {
450436
case chan []interface{}:
451437
c.valueGetter = func() []interface{} { return <-g }
452438
case func() []interface{}:
453439
c.valueGetter = g
454440
default:
455-
panic(fmt.Sprintf("unsupported value generator type: %T", responseGetter))
441+
responseVal := reflect.ValueOf(response)
442+
if responseVal.Kind() == reflect.Slice || responseVal.Kind() == reflect.Array {
443+
responses := make([]interface{}, responseVal.Len())
444+
for i := 0; i < responseVal.Len(); i++ {
445+
responses[i] = responseVal.Index(i).Interface()
446+
}
447+
c.valueGetter = funcGetter(responses)
448+
} else {
449+
c.valueGetter = funcGetter([]interface{}{response})
450+
}
456451
}
457452
return c
458453
}
459454

455+
func funcGetter(responses []interface{}) func() []interface{} {
456+
done := false
457+
return func() []interface{} {
458+
if done {
459+
return nil
460+
}
461+
done = true
462+
return responses
463+
}
464+
}
465+
460466
func (c *mockConn) Read(b []byte) (n int, err error) {
461467
c.mu.Lock()
462468
defer c.mu.Unlock()

0 commit comments

Comments
 (0)