github.com/kvattikuti/drone@v0.2.1-0.20140603034306-d400229a327a/pkg/database/testing/testing.go (about)

     1  package database
     2  
     3  import (
     4  	"crypto/aes"
     5  	"database/sql"
     6  	"fmt"
     7  	"log"
     8  	"os"
     9  	"strings"
    10  
    11  	"github.com/drone/drone/pkg/database"
    12  	"github.com/drone/drone/pkg/database/encrypt"
    13  	. "github.com/drone/drone/pkg/model"
    14  
    15  	_ "github.com/mattn/go-sqlite3"
    16  	"github.com/russross/meddler"
    17  )
    18  
    19  const (
    20  	pubkey  = `sh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClp9+xjhYj2Wz0nwLNhUiR1RkqfoVZwlJoxdubQy8GskZtY7C7YGa/PeKfdfaKOWtVgg37r/OYS3kc7bIKVup4sx/oW59FMwCZYQ2nxoaPZpPwUJs8D0Wy0b2VSP+vAnJ6jZQEIEiClrzyYafSfqN6L9T/BTkn28ktWalOHqWVKejKeD6M0uhlpyIZFsQ1K2wNt32ACwT/rbanx/r/jfczqxSkLzvIKXXs/RdKQgwRRUYnKkl4Lh6r22n9n3m2VwRor5wdsPK8sr57OsqdRpnvsFs3lxwM8w5ZiAZV3T0xTMGVs3W8Uy5HexAD6TgWBWFjSrgdXF1pE83wmUtJtVBf`
    21  	privkey = `-----BEGIN RSA PRIVATE KEY-----
    22  MIIEogIBAAKCAQEApaffsY4WI9ls9J8CzYVIkdUZKn6FWcJSaMXbm0MvBrJGbWOw
    23  u2Bmvz3in3X2ijlrVYIN+6/zmEt5HO2yClbqeLMf6FufRTMAmWENp8aGj2aT8FCb
    24  PA9FstG9lUj/rwJyeo2UBCBIgpa88mGn0n6jei/U/wU5J9vJLVmpTh6llSnoyng+
    25  jNLoZaciGRbENStsDbd9gAsE/622p8f6/433M6sUpC87yCl17P0XSkIMEUVGJypJ
    26  eC4eq9tp/Z95tlcEaK+cHbDyvLK+ezrKnUaZ77BbN5ccDPMOWYgGVd09MUzBlbN1
    27  vFMuR3sQA+k4FgVhY0q4HVxdaRPN8JlLSbVQXwIDAQABAoIBAA3EqSPxwkdSf+rI
    28  +IuqY0CzrHbKszylmQHaSAlciSEOWionWf4I4iFM/HPycv5EDXa663yawC1NQJC1
    29  9NFFLhHAGYvPaapvtcIJvf/O0UpD5VHY8T4JqupU4mPxAEdEdc1XzRCWulAYRTYE
    30  BdXJ7r5uEU7s2TZF3y+kvxyeEXcXNWK1I4kGBSgH4KI5WIODtNJ6vaIk5Yugqt1N
    31  cg5Sprk4bUMRTBH6GmSiJUleA0f/k6MCCmhETKXGt9mmfJ1PXpVlfDn5m26MX6vZ
    32  XgaoIHUCy4sh1Fq6vbEI831JcO4kdvl4TtX90SzSadHjewNHy0V2gjAysvqbEDhw
    33  Hn8D+MkCgYEA00tTKPp3AUTxT9ZgfPBD3DY7tk7+xp2R2lA6H9TUWe79TRfncFtS
    34  8bCfEXd8xALL5cFyzi4q4YJ77mJjlWE7AMYdsFoAW1l3Q71JRRBSwsyIwp4hU8AV
    35  K48SDjqecDzY42UvuKGp3opPWb0PzJixJNUgawU/ZGPxqN8jlr0o+K0CgYEAyLSO
    36  rZqOvyE5wu8yadHLlQC4usoYtnyDC8PG2SgnZnlnZnkgNy3yLmHYvTvYSQsAv7rA
    37  fFsKMt2MJhlclx+sTds/LLHKj/RfVDFenFf6ajBNZ1k+KRcwrV1A4iWinWmBxiEi
    38  A8aM9rGs7WRBkqaCONSUQHcmLRRz7hqDtsBpkrsCgYBY2FJ2Z6LEmN2zCVx3DHws
    39  S22eQeclUroyhwt5uP81daVy1jtN5kihMfgg2xJORTLBQC9q/MSxIDHGUf63oDO0
    40  JpnzPlTqFFtu01fMv4ldOa3Dz8QJuDnun/EipIlcfmlgbHq9ctS/q36kKDhNemL6
    41  Lte7yHAYYWIK9RC84Hsq3QKBgAfDbC1s6A6ek2Rl6jZLpitKTtryzEfqwwrmdL+b
    42  nQKKuaQuFT/tKAwBPuf685/HrCy+ZYmp39gd17j1jC5QTFLqoyPwcJxm4HUaP8We
    43  ZZJL8gKIYi4mtnxOOh9FQ2gBV8K5L16kBHnaX40DLsIkbK8UEfP4Z+Kggud34RZl
    44  lO/XAoGAFFZdolsVbSieFhJt7ypzp/19dKJ8Sk6QGCk3uQpTuLJMvwcBT8X5XCTD
    45  zFfYARarx87mbD2k5GZ7F0fmGYTUV14qlxJCGMythLM/xZ6EJuJWBz69puNj4yhn
    46  exWM7t1BDHy2zIoPfIQLDH2h1zNTRjismMeErOCy0Uha7jrZhW8=
    47  -----END RSA PRIVATE KEY-----`
    48  )
    49  
    50  var (
    51  	dbname, driver, dsn, login string
    52  	db                         *sql.DB
    53  )
    54  
    55  func init() {
    56  	// create a cipher for ecnrypting and decrypting
    57  	// database fields
    58  	cipher, err := aes.NewCipher([]byte("38B241096B8DA08131563770F4CDDFAC"))
    59  	if err != nil {
    60  		log.Fatal(err)
    61  	}
    62  
    63  	// register function with meddler to encrypt and
    64  	// decrypt database fields.
    65  	meddler.Register("gobencrypt", &encrypt.EncryptedField{cipher})
    66  
    67  	// Check for $DB_ENV
    68  	dbenv := os.Getenv("DB_ENV")
    69  	if dbenv == "mysql" {
    70  		driver = dbenv
    71  		dbname = "drone_test"
    72  		login = os.Getenv("MYSQL_LOGIN")
    73  		if len(login) == 0 {
    74  			login = "root"
    75  		}
    76  		log.Println("Using mysql database ...")
    77  	} else {
    78  		driver = "sqlite3"
    79  		dsn = ":memory:"
    80  		log.Println("Using sqlite3 database ...")
    81  	}
    82  
    83  }
    84  
    85  func Setup() {
    86  	// create an in-memory database
    87  	if driver == "mysql" {
    88  		idsn := fmt.Sprintf("%s@/?parseTime=true", login)
    89  		db, dsn = createDB(dbname, idsn)
    90  	}
    91  	database.Init(driver, dsn)
    92  
    93  	// create dummy user data
    94  	user1 := User{
    95  		Password:    "$2a$10$b8d63QsTL38vx7lj0HEHfOdbu1PCAg6Gfca74UavkXooIBx9YxopS",
    96  		Name:        "Brad Rydzewski",
    97  		Email:       "brad.rydzewski@gmail.com",
    98  		Gravatar:    "8c58a0be77ee441bb8f8595b7f1b4e87",
    99  		Token:       "123",
   100  		GitlabToken: "123",
   101  		Admin:       true}
   102  	user2 := User{
   103  		Password:    "$2a$10$b8d63QsTL38vx7lj0HEHfOdbu1PCAg6Gfca74UavkXooIBx9YxopS",
   104  		Name:        "Thomas Burke",
   105  		Email:       "cavepig@gmail.com",
   106  		Gravatar:    "c62f7126273f7fa786274274a5dec8ce",
   107  		Token:       "456",
   108  		GitlabToken: "456",
   109  		Admin:       false}
   110  	user3 := User{
   111  		Password:    "$2a$10$b8d63QsTL38vx7lj0HEHfOdbu1PCAg6Gfca74UavkXooIBx9YxopS",
   112  		Name:        "Carlos Morales",
   113  		Email:       "ytsejammer@gmail.com",
   114  		Gravatar:    "c2180a539620d90d68eaeb848364f1c2",
   115  		Token:       "789",
   116  		GitlabToken: "789",
   117  		Admin:       false}
   118  	user4 := User{
   119  		Password:    "$2a$10$b8d63QsTL38vx7lj0HEHfOdbu1PCAg6Gfca74UavkXooIBx9YxopS",
   120  		Name:        "Rick El Toro",
   121  		Email:       "rick@el.to.ro",
   122  		Gravatar:    "c2180a539620d90d68eaeb848364f1c2",
   123  		Token:       "987",
   124  		GitlabToken: "987",
   125  		Admin:       false}
   126  
   127  
   128  	database.SaveUser(&user1)
   129  	database.SaveUser(&user2)
   130  	database.SaveUser(&user3)
   131  	database.SaveUser(&user4)
   132  
   133  	// create dummy team data
   134  	team1 := Team{
   135  		Slug:     "drone",
   136  		Name:     "Drone",
   137  		Email:    "support@drone.io",
   138  		Gravatar: "8c58a0be77ee441bb8f8595b7f1b4e87"}
   139  	team2 := Team{
   140  		Slug:     "github",
   141  		Name:     "Github",
   142  		Email:    "support@github.com",
   143  		Gravatar: "61024896f291303615bcd4f7a0dcfb74"}
   144  	team3 := Team{
   145  		Slug:     "golang",
   146  		Name:     "Golang",
   147  		Email:    "support@golang.org",
   148  		Gravatar: "991695cc770c6b8354b68cd18c280b95"}
   149  
   150  	database.SaveTeam(&team1)
   151  	database.SaveTeam(&team2)
   152  	database.SaveTeam(&team3)
   153  
   154  	// create team membership data
   155  	database.SaveMember(user1.ID, team1.ID, RoleOwner)
   156  	database.SaveMember(user2.ID, team1.ID, RoleAdmin)
   157  	database.SaveMember(user3.ID, team1.ID, RoleWrite)
   158  	database.SaveMember(user1.ID, team2.ID, RoleOwner)
   159  	database.SaveMember(user2.ID, team2.ID, RoleAdmin)
   160  	database.SaveMember(user3.ID, team2.ID, RoleWrite)
   161  	database.SaveMember(user1.ID, team3.ID, RoleRead)
   162  
   163  	// create dummy repo data
   164  	repo1 := Repo{
   165  		Slug:       "github.com/drone/drone",
   166  		Host:       "github.com",
   167  		Owner:      "drone",
   168  		Name:       "drone",
   169  		Private:    true,
   170  		Disabled:   false,
   171  		SCM:        "git",
   172  		URL:        "git@github.com:drone/drone.git",
   173  		Username:   "no username",
   174  		Password:   "no password",
   175  		PublicKey:  pubkey,
   176  		PrivateKey: privkey,
   177  		UserID:     user1.ID,
   178  		TeamID:     team1.ID,
   179  	}
   180  	repo2 := Repo{
   181  		Slug:       "bitbucket.org/drone/test",
   182  		Host:       "bitbucket.org",
   183  		Owner:      "drone",
   184  		Name:       "test",
   185  		Private:    false,
   186  		Disabled:   false,
   187  		SCM:        "hg",
   188  		URL:        "https://bitbucket.org/drone/test",
   189  		Username:   "no username",
   190  		Password:   "no password",
   191  		PublicKey:  pubkey,
   192  		PrivateKey: privkey,
   193  		UserID:     user1.ID,
   194  		TeamID:     team1.ID,
   195  	}
   196  	repo3 := Repo{
   197  		Slug:       "bitbucket.org/brydzewski/test",
   198  		Host:       "bitbucket.org",
   199  		Owner:      "brydzewski",
   200  		Name:       "test",
   201  		Private:    false,
   202  		Disabled:   false,
   203  		SCM:        "hg",
   204  		URL:        "https://bitbucket.org/brydzewski/test",
   205  		Username:   "no username",
   206  		Password:   "no password",
   207  		PublicKey:  pubkey,
   208  		PrivateKey: privkey,
   209  		UserID:     user2.ID,
   210  	}
   211  
   212  	database.SaveRepo(&repo1)
   213  	database.SaveRepo(&repo2)
   214  	database.SaveRepo(&repo3)
   215  
   216  	commit1 := Commit{
   217  		RepoID:   repo1.ID,
   218  		Status:   "Success",
   219  		Hash:     "4f4c4594be6d6ddbc1c0dd521334f7ecba92b608",
   220  		Branch:   "master",
   221  		Author:   user1.Email,
   222  		Gravatar: user1.Gravatar,
   223  		Message:  "commit message",
   224  	}
   225  	commit2 := Commit{
   226  		RepoID:   repo1.ID,
   227  		Status:   "Failure",
   228  		Hash:     "0eb2fa13e9f4139e803b6ad37831708d4786c74a",
   229  		Branch:   "master",
   230  		Author:   user1.Email,
   231  		Gravatar: user1.Gravatar,
   232  		Message:  "commit message",
   233  	}
   234  	commit3 := Commit{
   235  		RepoID:   repo1.ID,
   236  		Status:   "Failure",
   237  		Hash:     "60a7fe87ccf01d0152e53242528399e05acaf047",
   238  		Branch:   "dev",
   239  		Author:   user1.Email,
   240  		Gravatar: user1.Gravatar,
   241  		Message:  "commit message",
   242  	}
   243  	commit4 := Commit{
   244  		RepoID:   repo2.ID,
   245  		Status:   "Success",
   246  		Hash:     "a4078d1e9a0842cdd214adbf0512578799a4f2ba",
   247  		Branch:   "master",
   248  		Author:   user1.Email,
   249  		Gravatar: user1.Gravatar,
   250  		Message:  "commit message",
   251  	}
   252  	commit5 := Commit{
   253  		RepoID:   repo2.ID,
   254  		Status:   "Success",
   255  		Hash:     "5f32ec7b08dfe3a097c1a5316de5b5069fb35ff9",
   256  		Branch:   "develop",
   257  		Author:   user1.Email,
   258  		Gravatar: user1.Gravatar,
   259  		Message:  "commit message",
   260  	}
   261  
   262  	// create dummy commit data
   263  	database.SaveCommit(&commit1)
   264  	database.SaveCommit(&commit2)
   265  	database.SaveCommit(&commit3)
   266  	database.SaveCommit(&commit4)
   267  	database.SaveCommit(&commit5)
   268  
   269  	// create dummy build data
   270  	database.SaveBuild(&Build{CommitID: commit1.ID, Slug: "node_0.10", Status: "Success", Duration: 60})
   271  	database.SaveBuild(&Build{CommitID: commit1.ID, Slug: "node_0.09", Status: "Success", Duration: 70})
   272  	database.SaveBuild(&Build{CommitID: commit2.ID, Slug: "node_0.10", Status: "Success", Duration: 10})
   273  	database.SaveBuild(&Build{CommitID: commit2.ID, Slug: "node_0.09", Status: "Failure", Duration: 65})
   274  	database.SaveBuild(&Build{CommitID: commit3.ID, Slug: "node_0.10", Status: "Failure", Duration: 50})
   275  	database.SaveBuild(&Build{CommitID: commit3.ID, Slug: "node_0.09", Status: "Failure", Duration: 55})
   276  }
   277  
   278  func Teardown() {
   279  	database.Close()
   280  	if driver == "mysql" {
   281  		db.Exec(fmt.Sprintf("DROP DATABASE %s", dbname))
   282  	}
   283  }
   284  
   285  func createDB(name, datasource string) (*sql.DB, string) {
   286  	db, err := sql.Open(driver, datasource)
   287  	if err != nil {
   288  		panic("Can't connect to database")
   289  	}
   290  	if _, err := db.Exec(fmt.Sprintf("CREATE DATABASE %s", name)); err != nil {
   291  		panic("Can't create database")
   292  	}
   293  	dsn := strings.Replace(datasource, "/", fmt.Sprintf("/%s", name), 1)
   294  	return db, dsn
   295  }