/gae

Mockable Go AppEngine SDK wrapper

Primary LanguageGo

gae: A Golang AppEngine SDK wrapper

designed for testable Go Appengine SDK

This package will give you support for mockable services in GAE.

List of supported services:

  • Datastore

Install

go get -u github.com/ahmadmuzakki/gae

Datastore

file user.go

package main 

import (
	"fmt"
	"github.com/ahmadmuzakki/gae"
	"github.com/ahmadmuzakki/gae/datastore"
	"golang.org/x/net/context"
	"log"
	"net/http"
)

type User struct {
	Key     *datastore.Key
	Name    string
	Address string
}

func HandleCreateUser(w http.ResponseWriter, r *http.Request) {
	ctx := gae.NewContext(r)

	newkey, err := createUser(ctx)

	if err != nil {
		w.Write([]byte(err.Error()))
		return
	}
	w.Write([]byte(newkey.String()))
}

func createUser(ctx context.Context) (*datastore.Key, error) {
	user := &User{
		Name:    "Jeki",
		Address: "Sidoarjo",
	}
	k := datastore.NewKey(ctx, "User", user.Name, 0, nil)
	return datastore.Put(ctx, k, user)
}

Let's mock it up! :D

file user_test.go

package main

import (
	"fmt"
	"github.com/ahmadmuzakki/gae/datastore"
	gaemock "github.com/ahmadmuzakki/gae/mock"
	"github.com/stretchr/testify/assert"
	"testing"
	"errors"
)


func TestCreateUser(t *testing.T) {
	ctx := gaemock.InitMock()
	ctx, mock := datastore.Mock(ctx)

	testCases := []struct {
		mock        func()
		expectKey   *datastore.Key
		expectError error
	}{
		{
			mock: func() {
				user := User{
					Name:    "Jeki",
					Address: "Jakarta",
				}

				k := mock.MockKey(ctx, "User", user.Name, 0, nil)

				mock.MockPut(k, &user).WillReturnKeyErr(k, nil)
			},
			expectKey:   mock.MockKey(ctx, "User", "Jeki", 0, nil),
			expectError: nil,
		},
		{
			mock: func() {
				user := User{
					Name:    "Jeki",
					Address: "Jakarta",
				}
				k := mock.MockKey(ctx, "User", user.Name, 0, nil)

				mock.MockPut(k, &user).WillReturnKeyErr(nil, fmt.Errorf("failed to create user"))
			},
			expectKey:   nil,
			expectError: fmt.Errorf("failed to create user"),
		},
	}

	for _, test := range testCases {
		test.mock()
		newk, err := createUser(ctx)
		assert.Equal(t, test.expectError, err)
		assert.Equal(t, test.expectKey, newk)
	}

}