2019-05-16 10:39:25 -04:00
|
|
|
package tests
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"os"
|
|
|
|
"runtime/debug"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"geeks-accelerator/oss/saas-starter-kit/example-project/internal/platform/docker"
|
|
|
|
"geeks-accelerator/oss/saas-starter-kit/example-project/internal/platform/web"
|
2019-05-23 14:32:24 -05:00
|
|
|
"github.com/aws/aws-sdk-go/aws/session"
|
|
|
|
"github.com/jmoiron/sqlx"
|
2019-05-16 10:39:25 -04:00
|
|
|
"github.com/pborman/uuid"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Success and failure markers.
|
|
|
|
const (
|
|
|
|
Success = "\u2713"
|
|
|
|
Failed = "\u2717"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Test owns state for running/shutting down tests.
|
|
|
|
type Test struct {
|
2019-05-17 14:42:50 -04:00
|
|
|
Log *log.Logger
|
2019-05-23 14:32:24 -05:00
|
|
|
MasterDB *sqlx.DB
|
2019-05-17 14:42:50 -04:00
|
|
|
container *docker.Container
|
|
|
|
AwsSession *session.Session
|
2019-05-16 10:39:25 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
// New is the entry point for tests.
|
|
|
|
func New() *Test {
|
|
|
|
|
|
|
|
// =========================================================================
|
|
|
|
// Logging
|
|
|
|
|
|
|
|
log := log.New(os.Stdout, "TEST : ", log.LstdFlags|log.Lmicroseconds|log.Lshortfile)
|
|
|
|
|
2019-05-17 14:42:50 -04:00
|
|
|
// ============================================================
|
|
|
|
// Init AWS Session
|
|
|
|
awsSession := session.Must(session.NewSession())
|
|
|
|
|
2019-05-16 10:39:25 -04:00
|
|
|
// ============================================================
|
|
|
|
// Startup Mongo container
|
|
|
|
|
|
|
|
container, err := docker.StartMongo(log)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalln(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ============================================================
|
|
|
|
// Configuration
|
|
|
|
|
|
|
|
dbDialTimeout := 25 * time.Second
|
|
|
|
dbHost := fmt.Sprintf("mongodb://localhost:%s/gotraining", container.Port)
|
|
|
|
|
|
|
|
// ============================================================
|
|
|
|
// Start Mongo
|
|
|
|
|
|
|
|
log.Println("main : Started : Initialize Mongo")
|
|
|
|
masterDB, err := db.New(dbHost, dbDialTimeout)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("startup : Register DB : %v", err)
|
|
|
|
}
|
|
|
|
|
2019-05-17 14:42:50 -04:00
|
|
|
return &Test{log, masterDB, container, awsSession}
|
2019-05-16 10:39:25 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
// TearDown is used for shutting down tests. Calling this should be
|
|
|
|
// done in a defer immediately after calling New.
|
|
|
|
func (t *Test) TearDown() {
|
|
|
|
t.MasterDB.Close()
|
|
|
|
if err := docker.StopMongo(t.Log, t.container); err != nil {
|
|
|
|
t.Log.Println(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Recover is used to prevent panics from allowing the test to cleanup.
|
|
|
|
func Recover(t *testing.T) {
|
|
|
|
if r := recover(); r != nil {
|
|
|
|
t.Fatal("Unhandled Exception:", string(debug.Stack()))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Context returns an app level context for testing.
|
|
|
|
func Context() context.Context {
|
|
|
|
values := web.Values{
|
|
|
|
TraceID: uuid.New(),
|
|
|
|
Now: time.Now(),
|
|
|
|
}
|
|
|
|
|
|
|
|
return context.WithValue(context.Background(), web.KeyValues, &values)
|
|
|
|
}
|