shadowspore / t38c

Tile38 Client package
MIT License
83 stars 33 forks source link

Testing #49

Open AshleyCoder3 opened 2 years ago

AshleyCoder3 commented 2 years ago

I use this for creating a point and mongodb. everything runs great. But now im testing and im unsure how to hit the keys.set.... part of the function. any pointers or examples would be fantastic

shadowspore commented 2 years ago

Hello You can mock the t38c.Executor interface and initialize client this way:

client, err := t38c.NewWithExecutor(myExecutorMock, true)

Example using gomock:

package mypkg

import (
    "context"
    "testing"

    gomock "github.com/golang/mock/gomock"
    "github.com/stretchr/testify/require"
    "github.com/xjem/t38c"
)

func TestMock(t *testing.T) {
    ctrl := gomock.NewController(t)
    defer ctrl.Finish()

    e := NewMockExecutor(ctrl)

    gomock.InOrder(
        e.EXPECT().
            Execute(gomock.Any(), "PING", []string{}).
            Return([]byte(`{"ok": true, "ping":"pong"}`), nil),

        e.EXPECT().
            Execute(gomock.Any(), "SET", []string{"test", "1", "POINT", "1", "2"}).
            Return([]byte(`{"ok": true}`), nil),

        e.EXPECT().
            Execute(gomock.Any(), "GET", []string{"test", "1", "POINT"}).
            Return([]byte(`{"ok": true, "point": {"lat": 1, "lon": 2}}`), nil),
    )

    client, err := t38c.NewWithExecutor(e, true)
    require.NoError(t, err)

    err = client.Keys.Set("test", "1").Point(1, 2).Do(context.TODO())
    require.NoError(t, err)

    point, err := client.Keys.Get("test", "1").Point(context.TODO())
    require.NoError(t, err)

    require.Equal(t, &t38c.GetPointResponse{Point: t38c.Point{Lat: 1, Lon: 2}}, point)
}

Mocking raw bytes is a bit painful, but it works :) I will try to improve this in future