package apiGatewayDeploy

import (
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"

	"github.com/30x/apid"
	"github.com/30x/apid/factory"
	"io/ioutil"
	"net/http"
	"net/http/httptest"
	"os"
	"testing"
)

var (
	tmpDir     string
	testServer *httptest.Server
)

var _ = BeforeSuite(func() {
	apid.Initialize(factory.DefaultServicesFactory())

	config := apid.Config()

	// todo: This will change after apidApigeeSync is fixed for scopes
	config.SetDefault("apigeesync_proxy_server_base", "X")
	config.SetDefault("apigeesync_organization", "X")
	config.SetDefault("apigeesync_consumer_key", "X")
	config.SetDefault("apigeesync_consumer_secret", "X")
	config.SetDefault("apigeesync_log_level", "panic")

	var err error
	tmpDir, err = ioutil.TempDir("", "api_test")
	Expect(err).NotTo(HaveOccurred())

	config.Set("data_path", tmpDir)
	config.Set(configBundleDir, tmpDir)

	// init() will create the tables
	apid.InitializePlugins()

	router := apid.API().Router()
	// fake bundle repo
	router.HandleFunc("/bundle", func(w http.ResponseWriter, req *http.Request) {
		w.Write([]byte("bundle stuff"))
	})
	testServer = httptest.NewServer(router)
})

var _ = AfterSuite(func() {
	apid.Events().Close()
	if testServer != nil {
		testServer.Close()
	}
	os.RemoveAll(tmpDir)
})

func TestApidGatewayDeploy(t *testing.T) {
	RegisterFailHandler(Fail)
	RunSpecs(t, "ApidGatewayDeploy Suite")
}
