summaryrefslogtreecommitdiffstats
path: root/integrations
diff options
context:
space:
mode:
authorEthan Koenig <etk39@cornell.edu>2017-04-25 03:24:51 -0400
committerLunny Xiao <xiaolunwen@gmail.com>2017-04-25 15:24:51 +0800
commitc58708d3eedb352bb277feb2c12bb1652a8a58b7 (patch)
tree97aeed6a13031618baa7d67185b04faea506da38 /integrations
parent3012971e92b79683178a286511c091fb31ee90f6 (diff)
downloadgitea-c58708d3eedb352bb277feb2c12bb1652a8a58b7.tar.gz
gitea-c58708d3eedb352bb277feb2c12bb1652a8a58b7.zip
Integration test framework (#1290)
* Integration test framework * udpate drone sign * Formatting fixes and move router.go to routers/ * update sign for drone
Diffstat (limited to 'integrations')
-rw-r--r--integrations/install_test.go91
-rw-r--r--integrations/integration_test.go92
-rw-r--r--integrations/internal/utils/utils.go156
-rw-r--r--integrations/mysql.ini56
-rw-r--r--integrations/pgsql.ini56
-rw-r--r--integrations/signup_test.go50
-rw-r--r--integrations/sqlite.ini58
-rw-r--r--integrations/version_test.go78
-rw-r--r--integrations/view_test.go32
9 files changed, 337 insertions, 332 deletions
diff --git a/integrations/install_test.go b/integrations/install_test.go
deleted file mode 100644
index 9912bfa901..0000000000
--- a/integrations/install_test.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2017 The Gitea Authors. All rights reserved.
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file.
-
-package integration
-
-import (
- "fmt"
- "net/http"
- "os"
- "os/user"
- "testing"
- "time"
-
- "code.gitea.io/gitea/integrations/internal/utils"
-)
-
-// The HTTP port listened by the Gitea server.
-const ServerHTTPPort = "3001"
-
-const _RetryLimit = 10
-
-func makeSimpleSettings(user, port string) map[string][]string {
- return map[string][]string{
- "db_type": {"SQLite3"},
- "db_host": {"localhost"},
- "db_path": {"data/gitea.db"},
- "app_name": {"Gitea: Git with a cup of tea"},
- "repo_root_path": {"repositories"},
- "run_user": {user},
- "domain": {"localhost"},
- "ssh_port": {"22"},
- "http_port": {port},
- "app_url": {"http://localhost:" + port},
- "log_root_path": {"log"},
- }
-}
-
-func install(t *utils.T) error {
- var r *http.Response
- var err error
-
- for i := 1; i <= _RetryLimit; i++ {
-
- r, err = http.Get("http://:" + ServerHTTPPort + "/")
- if err == nil {
- fmt.Fprintln(os.Stderr)
- break
- }
-
- // Give the server some amount of time to warm up.
- time.Sleep(100 * time.Millisecond)
- fmt.Fprint(os.Stderr, ".")
- }
-
- if err != nil {
- return err
- }
-
- defer r.Body.Close()
-
- _user, err := user.Current()
- if err != nil {
- return err
- }
-
- settings := makeSimpleSettings(_user.Username, ServerHTTPPort)
- r, err = http.PostForm("http://:"+ServerHTTPPort+"/install", settings)
- if err != nil {
- return err
- }
- defer r.Body.Close()
-
- if r.StatusCode != http.StatusOK {
- return fmt.Errorf("'/install': %s", r.Status)
- }
- return nil
-}
-
-func TestInstall(t *testing.T) {
- conf := utils.Config{
- Program: "../gitea",
- WorkDir: "",
- Args: []string{"web", "--port", ServerHTTPPort},
- LogFile: os.Stderr,
- }
-
- if err := utils.New(t, &conf).RunTest(install); err != nil {
- t.Fatal(err)
- }
-}
diff --git a/integrations/integration_test.go b/integrations/integration_test.go
new file mode 100644
index 0000000000..db78eead86
--- /dev/null
+++ b/integrations/integration_test.go
@@ -0,0 +1,92 @@
+// Copyright 2017 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package integrations
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "net/http"
+ "os"
+ "testing"
+
+ "code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/routers"
+ "code.gitea.io/gitea/routers/routes"
+
+ "gopkg.in/macaron.v1"
+ "gopkg.in/testfixtures.v2"
+)
+
+var mac *macaron.Macaron
+
+func TestMain(m *testing.M) {
+ appIniPath := os.Getenv("GITEA_CONF")
+ if appIniPath == "" {
+ fmt.Println("Environment variable $GITEA_CONF not set")
+ os.Exit(1)
+ }
+ setting.CustomConf = appIniPath
+ routers.GlobalInit()
+ mac = routes.NewMacaron()
+ routes.RegisterRoutes(mac)
+
+ var helper testfixtures.Helper
+ if setting.UseMySQL {
+ helper = &testfixtures.MySQL{}
+ } else if setting.UsePostgreSQL {
+ helper = &testfixtures.PostgreSQL{}
+ } else if setting.UseSQLite3 {
+ helper = &testfixtures.SQLite{}
+ } else {
+ fmt.Println("Unsupported RDBMS for integration tests")
+ os.Exit(1)
+ }
+
+ err := models.InitFixtures(
+ helper,
+ "integrations/gitea-integration/fixtures/",
+ )
+ if err != nil {
+ fmt.Printf("Error initializing test database: %v\n", err)
+ os.Exit(1)
+ }
+ os.Exit(m.Run())
+}
+
+type TestResponseWriter struct {
+ HeaderCode int
+ Writer io.Writer
+}
+
+func (w *TestResponseWriter) Header() http.Header {
+ return make(map[string][]string)
+}
+
+func (w *TestResponseWriter) Write(b []byte) (int, error) {
+ return w.Writer.Write(b)
+}
+
+func (w *TestResponseWriter) WriteHeader(n int) {
+ w.HeaderCode = n
+}
+
+type TestResponse struct {
+ HeaderCode int
+ Body []byte
+}
+
+func MakeRequest(req *http.Request) *TestResponse {
+ buffer := bytes.NewBuffer(nil)
+ respWriter := &TestResponseWriter{
+ Writer: buffer,
+ }
+ mac.ServeHTTP(respWriter, req)
+ return &TestResponse{
+ HeaderCode: respWriter.HeaderCode,
+ Body: buffer.Bytes(),
+ }
+}
diff --git a/integrations/internal/utils/utils.go b/integrations/internal/utils/utils.go
deleted file mode 100644
index e8380df39e..0000000000
--- a/integrations/internal/utils/utils.go
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2017 The Gitea Authors. All rights reserved.
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file.
-
-package utils
-
-import (
- "errors"
- "fmt"
- "io"
- "io/ioutil"
- "log"
- "net/http"
- "os"
- "os/exec"
- "path/filepath"
- "syscall"
- "testing"
-)
-
-// T wraps testing.T and the configurations of the testing instance.
-type T struct {
- *testing.T
- Config *Config
-}
-
-// New create an instance of T
-func New(t *testing.T, c *Config) *T {
- return &T{T: t, Config: c}
-}
-
-// Config Settings of the testing program
-type Config struct {
- // The executable path of the tested program.
- Program string
- // Working directory prepared for the tested program.
- // If empty, a directory named with random suffixes is picked, and created under the platform-dependent default temporary directory.
- // The directory will be removed when the test finishes.
- WorkDir string
- // Command-line arguments passed to the tested program.
- Args []string
-
- // Where to redirect the stdout/stderr to. For debugging purposes.
- LogFile *os.File
-}
-
-func redirect(cmd *exec.Cmd, f *os.File) error {
- stdout, err := cmd.StdoutPipe()
- if err != nil {
- return err
- }
-
- stderr, err := cmd.StderrPipe()
- if err != nil {
- return err
- }
-
- go io.Copy(f, stdout)
- go io.Copy(f, stderr)
- return nil
-}
-
-// RunTest Helper function for setting up a running Gitea server for functional testing and then gracefully terminating it.
-func (t *T) RunTest(tests ...func(*T) error) (err error) {
- if t.Config.Program == "" {
- return errors.New("Need input file")
- }
-
- path, err := filepath.Abs(t.Config.Program)
- if err != nil {
- return err
- }
-
- workdir := t.Config.WorkDir
- if workdir == "" {
- workdir, err = ioutil.TempDir(os.TempDir(), "gitea_tests-")
- if err != nil {
- return err
- }
- defer os.RemoveAll(workdir)
- }
-
- newpath := filepath.Join(workdir, filepath.Base(path))
- if err := os.Symlink(path, newpath); err != nil {
- return err
- }
-
- log.Printf("Starting the server: %s args:%s workdir:%s", newpath, t.Config.Args, workdir)
-
- cmd := exec.Command(newpath, t.Config.Args...)
- cmd.Dir = workdir
-
- if t.Config.LogFile != nil && testing.Verbose() {
- if err := redirect(cmd, t.Config.LogFile); err != nil {
- return err
- }
- }
-
- if err := cmd.Start(); err != nil {
- return err
- }
-
- log.Println("Server started.")
-
- defer func() {
- // Do not early return. We have to call Wait anyway.
- _ = cmd.Process.Signal(syscall.SIGTERM)
-
- if _err := cmd.Wait(); _err != nil {
- if _err.Error() != "signal: terminated" {
- err = _err
- return
- }
- }
-
- log.Println("Server exited")
- }()
-
- for _, fn := range tests {
- if err := fn(t); err != nil {
- return err
- }
- }
-
- // Note that the return value 'err' may be updated by the 'defer' statement before despite it's returning nil here.
- return nil
-}
-
-// GetAndPost provides a convenient helper function for testing an HTTP endpoint with GET and POST method.
-// The function sends GET first and then POST with the given form.
-func GetAndPost(url string, form map[string][]string) error {
- var err error
- var r *http.Response
-
- r, err = http.Get(url)
- if err != nil {
- return err
- }
- defer r.Body.Close()
-
- if r.StatusCode != http.StatusOK {
- return fmt.Errorf("GET '%s': %s", url, r.Status)
- }
-
- r, err = http.PostForm(url, form)
- if err != nil {
- return err
- }
- defer r.Body.Close()
-
- if r.StatusCode != http.StatusOK {
- return fmt.Errorf("POST '%s': %s", url, r.Status)
- }
-
- return nil
-}
diff --git a/integrations/mysql.ini b/integrations/mysql.ini
new file mode 100644
index 0000000000..9e121ac1e6
--- /dev/null
+++ b/integrations/mysql.ini
@@ -0,0 +1,56 @@
+APP_NAME = Gitea: Git with a cup of tea
+RUN_MODE = prod
+
+[database]
+DB_TYPE = mysql
+HOST = 127.0.0.1:3306
+NAME = testgitea
+USER = root
+PASSWD =
+SSL_MODE = disable
+PATH = data/gitea.db
+
+[repository]
+ROOT = integrations/gitea-integration/gitea-repositories
+
+[server]
+SSH_DOMAIN = localhost
+HTTP_PORT = 3000
+ROOT_URL = http://localhost:3000/
+DISABLE_SSH = false
+SSH_PORT = 22
+LFS_START_SERVER = false
+OFFLINE_MODE = false
+
+[mailer]
+ENABLED = false
+
+[service]
+REGISTER_EMAIL_CONFIRM = false
+ENABLE_NOTIFY_MAIL = false
+DISABLE_REGISTRATION = false
+ENABLE_CAPTCHA = false
+REQUIRE_SIGNIN_VIEW = false
+DEFAULT_KEEP_EMAIL_PRIVATE = false
+NO_REPLY_ADDRESS = noreply.example.org
+
+[picture]
+DISABLE_GRAVATAR = false
+ENABLE_FEDERATED_AVATAR = false
+
+[session]
+PROVIDER = file
+
+[log]
+MODE = console,file
+
+[log.console]
+LEVEL = Warn
+
+[log.file]
+LEVEL = Info
+ROOT_PATH = log
+
+[security]
+INSTALL_LOCK = true
+SECRET_KEY = 9pCviYTWSb
diff --git a/integrations/pgsql.ini b/integrations/pgsql.ini
new file mode 100644
index 0000000000..42e29e8266
--- /dev/null
+++ b/integrations/pgsql.ini
@@ -0,0 +1,56 @@
+APP_NAME = Gitea: Git with a cup of tea
+RUN_MODE = prod
+
+[database]
+DB_TYPE = postgres
+HOST = 127.0.0.1:5432
+NAME = testgitea
+USER = postgres
+PASSWD = postgres
+SSL_MODE = disable
+PATH = data/gitea.db
+
+[repository]
+ROOT = integrations/gitea-integration/gitea-repositories
+
+[server]
+SSH_DOMAIN = localhost
+HTTP_PORT = 3000
+ROOT_URL = http://localhost:3000/
+DISABLE_SSH = false
+SSH_PORT = 22
+LFS_START_SERVER = false
+OFFLINE_MODE = false
+
+[mailer]
+ENABLED = false
+
+[service]
+REGISTER_EMAIL_CONFIRM = false
+ENABLE_NOTIFY_MAIL = false
+DISABLE_REGISTRATION = false
+ENABLE_CAPTCHA = false
+REQUIRE_SIGNIN_VIEW = false
+DEFAULT_KEEP_EMAIL_PRIVATE = false
+NO_REPLY_ADDRESS = noreply.example.org
+
+[picture]
+DISABLE_GRAVATAR = false
+ENABLE_FEDERATED_AVATAR = false
+
+[session]
+PROVIDER = file
+
+[log]
+MODE = console,file
+
+[log.console]
+LEVEL = Warn
+
+[log.file]
+LEVEL = Info
+ROOT_PATH = log
+
+[security]
+INSTALL_LOCK = true
+SECRET_KEY = 9pCviYTWSb
diff --git a/integrations/signup_test.go b/integrations/signup_test.go
index 55ae64c373..7d8f27332e 100644
--- a/integrations/signup_test.go
+++ b/integrations/signup_test.go
@@ -2,34 +2,40 @@
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
-package integration
+package integrations
import (
- "os"
+ "bytes"
+ "net/http"
+ "net/url"
"testing"
- "code.gitea.io/gitea/integrations/internal/utils"
-)
-
-var signupFormSample map[string][]string = map[string][]string{
- "Name": {"tester"},
- "Email": {"user1@example.com"},
- "Passwd": {"12345678"},
-}
+ "code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/modules/setting"
-func signup(t *utils.T) error {
- return utils.GetAndPost("http://:"+ServerHTTPPort+"/user/sign_up", signupFormSample)
-}
+ "github.com/stretchr/testify/assert"
+)
func TestSignup(t *testing.T) {
- conf := utils.Config{
- Program: "../gitea",
- WorkDir: "",
- Args: []string{"web", "--port", ServerHTTPPort},
- LogFile: os.Stderr,
- }
+ assert.NoError(t, models.LoadFixtures())
+ setting.Service.EnableCaptcha = false
+
+ req, err := http.NewRequest("POST", "/user/sign_up",
+ bytes.NewBufferString(url.Values{
+ "user_name": []string{"exampleUser"},
+ "email": []string{"exampleUser@example.com"},
+ "password": []string{"examplePassword"},
+ "retype": []string{"examplePassword"},
+ }.Encode()),
+ )
+ assert.NoError(t, err)
+ req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
+ resp := MakeRequest(req)
+ assert.EqualValues(t, http.StatusFound, resp.HeaderCode)
- if err := utils.New(t, &conf).RunTest(install, signup); err != nil {
- t.Fatal(err)
- }
+ // should be able to view new user's page
+ req, err = http.NewRequest("GET", "/exampleUser", nil)
+ assert.NoError(t, err)
+ resp = MakeRequest(req)
+ assert.EqualValues(t, http.StatusOK, resp.HeaderCode)
}
diff --git a/integrations/sqlite.ini b/integrations/sqlite.ini
new file mode 100644
index 0000000000..dc17b23ec8
--- /dev/null
+++ b/integrations/sqlite.ini
@@ -0,0 +1,58 @@
+APP_NAME = Gitea: Git with a cup of tea
+RUN_MODE = prod
+
+[database]
+DB_TYPE = sqlite3
+HOST = 127.0.0.1:3306
+NAME = testgitea
+USER = gitea
+PASSWD =
+SSL_MODE = disable
+PATH = :memory:
+
+[repository]
+ROOT = integrations/gitea-integration/gitea-repositories
+
+[server]
+SSH_DOMAIN = localhost
+HTTP_PORT = 3000
+ROOT_URL = http://localhost:3000/
+DISABLE_SSH = false
+SSH_PORT = 22
+LFS_START_SERVER = false
+OFFLINE_MODE = false
+
+[mailer]
+ENABLED = false
+
+[service]
+REGISTER_EMAIL_CONFIRM = false
+ENABLE_NOTIFY_MAIL = false
+DISABLE_REGISTRATION = false
+ENABLE_CAPTCHA = false
+REQUIRE_SIGNIN_VIEW = false
+DEFAULT_KEEP_EMAIL_PRIVATE = false
+NO_REPLY_ADDRESS = noreply.example.org
+
+[picture]
+DISABLE_GRAVATAR = false
+ENABLE_FEDERATED_AVATAR = false
+
+[session]
+PROVIDER = file
+
+[log]
+MODE = console,file
+
+[log.console]
+LEVEL = Warn
+
+[log.file]
+LEVEL = Info
+ROOT_PATH = log
+
+[security]
+INSTALL_LOCK = true
+SECRET_KEY = 9pCviYTWSb
+INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTI3OTU5ODN9.OQkH5UmzID2XBdwQ9TAI6Jj2t1X-wElVTjbE7aoN4I8
+
diff --git a/integrations/version_test.go b/integrations/version_test.go
index beda5c3ab7..58568e22fe 100644
--- a/integrations/version_test.go
+++ b/integrations/version_test.go
@@ -2,81 +2,33 @@
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
-package integration
+package integrations
import (
+ "bytes"
"encoding/json"
- "fmt"
- "log"
"net/http"
- "os"
- "os/exec"
- "path/filepath"
- "strings"
"testing"
- "code.gitea.io/gitea/integrations/internal/utils"
+ "code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/modules/setting"
"code.gitea.io/sdk/gitea"
"github.com/stretchr/testify/assert"
)
-func version(t *utils.T) error {
- var err error
-
- path, err := filepath.Abs(t.Config.Program)
- if err != nil {
- return err
- }
-
- cmd := exec.Command(path, "--version")
- out, err := cmd.Output()
- if err != nil {
- return err
- }
-
- fields := strings.Fields(string(out))
- if !strings.HasPrefix(string(out), "Gitea version") {
- return fmt.Errorf("unexpected version string '%s' of the gitea executable", out)
- }
-
- expected := fields[2]
-
- var r *http.Response
- r, err = http.Get("http://:" + ServerHTTPPort + "/api/v1/version")
- if err != nil {
- return err
- }
- defer r.Body.Close()
-
- if r.StatusCode != http.StatusOK {
- return fmt.Errorf("'/api/v1/version': %s\n", r.Status)
- }
-
- var v gitea.ServerVersion
-
- dec := json.NewDecoder(r.Body)
- if err := dec.Decode(&v); err != nil {
- return err
- }
-
- actual := v.Version
-
- log.Printf("Actual: \"%s\" Expected: \"%s\"\n", actual, expected)
- assert.Equal(t, expected, actual)
+func TestVersion(t *testing.T) {
+ assert.NoError(t, models.LoadFixtures())
- return nil
-}
+ setting.AppVer = "1.1.0+dev"
+ req, err := http.NewRequest("GET", "/api/v1/version", nil)
+ assert.NoError(t, err)
+ resp := MakeRequest(req)
-func TestVersion(t *testing.T) {
- conf := utils.Config{
- Program: "../gitea",
- WorkDir: "",
- Args: []string{"web", "--port", ServerHTTPPort},
- LogFile: os.Stderr,
- }
+ var version gitea.ServerVersion
+ decoder := json.NewDecoder(bytes.NewBuffer(resp.Body))
+ assert.NoError(t, decoder.Decode(&version))
- if err := utils.New(t, &conf).RunTest(install, version); err != nil {
- t.Fatal(err)
- }
+ assert.EqualValues(t, http.StatusOK, resp.HeaderCode)
+ assert.Equal(t, setting.AppVer, string(version.Version))
}
diff --git a/integrations/view_test.go b/integrations/view_test.go
new file mode 100644
index 0000000000..1314fe3832
--- /dev/null
+++ b/integrations/view_test.go
@@ -0,0 +1,32 @@
+// Copyright 2017 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package integrations
+
+import (
+ "net/http"
+ "testing"
+
+ "code.gitea.io/gitea/models"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestViewRepo(t *testing.T) {
+ assert.NoError(t, models.LoadFixtures())
+
+ req, err := http.NewRequest("GET", "/user1/repo1", nil)
+ assert.NoError(t, err)
+ resp := MakeRequest(req)
+ assert.EqualValues(t, http.StatusOK, resp.HeaderCode)
+}
+
+func TestViewUser(t *testing.T) {
+ assert.NoError(t, models.LoadFixtures())
+
+ req, err := http.NewRequest("GET", "/user1", nil)
+ assert.NoError(t, err)
+ resp := MakeRequest(req)
+ assert.EqualValues(t, http.StatusOK, resp.HeaderCode)
+}