Skip to content

Commit

Permalink
Add MariaDB preset
Browse files Browse the repository at this point in the history
  • Loading branch information
dusansimic authored and orlangure committed Oct 6, 2020
1 parent fad47b8 commit 7f976aa
Show file tree
Hide file tree
Showing 12 changed files with 535 additions and 16 deletions.
25 changes: 12 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,21 +180,20 @@ listed below:

| Preset | Go package | HTTP API | Go API | Latest stable image |
|--------|------------|----------|--------|---------------------|
Localstack | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/localstack) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.4#/presets/startLocalstack) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/localstack?tab=doc) | 0.11.0
Splunk | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/splunk) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.4#/presets/startSplunk) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/splunk?tab=doc) | 8.0.2
Redis | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/redis) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.4#/presets/startRedis) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/redis?tab=doc) | 5
Memcached | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/memcached) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.4#/presets/startMemcached) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/memcached?tab=doc) | 1.6.6-alpine
MySQL | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/mysql) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.4#/presets/startMysql) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/mysql?tab=doc) | 8
MariaDB | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/mariadb) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.4#/presets/) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/mariadb?tab=doc) | 10
PostgreSQL | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/postgres) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.4#/presets/startPostgres) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/postgres?tab=doc) | 12
Microsoft SQL Server | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/mssql) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.4#/presets/startMssql) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/mssql?tab=doc) | 2019-latest
MongoDB | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/mongo) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.4#/presets/startMongo) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/mongo?tab=doc) | 4
RabbitMQ | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/rabbitmq) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.4#/presets/startRabbitMq) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/rabbitmq?tab=doc) | 3.8.5-alpine
Kafka | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/kafka) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.4#/presets/startKafka) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/kafka?tab=doc) | 2.5.1-L0
Elasticsearch | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/elastic) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.4#/presets/startElastic) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/elastic?tab=doc) | 7.9.2
Localstack | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/localstack) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.5#/presets/startLocalstack) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/localstack?tab=doc) | 0.11.0
Splunk | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/splunk) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.5#/presets/startSplunk) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/splunk?tab=doc) | 8.0.2
Redis | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/redis) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.5#/presets/startRedis) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/redis?tab=doc) | 5
Memcached | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/memcached) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.5#/presets/startMemcached) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/memcached?tab=doc) | 1.6.6-alpine
MySQL | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/mysql) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.5#/presets/startMysql) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/mysql?tab=doc) | 8
MariaDB | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/mariadb) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.5#/presets/startMariadb) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/mariadb?tab=doc) | 10
PostgreSQL | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/postgres) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.5#/presets/startPostgres) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/postgres?tab=doc) | 12
Microsoft SQL Server | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/mssql) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.5#/presets/startMssql) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/mssql?tab=doc) | 2019-latest
MongoDB | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/mongo) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.5#/presets/startMongo) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/mongo?tab=doc) | 4
RabbitMQ | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/rabbitmq) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.5#/presets/startRabbitMq) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/rabbitmq?tab=doc) | 3.8.5-alpine
Kafka | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/kafka) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.5#/presets/startKafka) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/kafka?tab=doc) | 2.5.1-L0
Elasticsearch | [Go package](https://github.com/orlangure/gnomock/tree/master/preset/elastic) | [Docs](https://app.swaggerhub.com/apis/orlangure/gnomock/1.4.5#/presets/startElastic) | [Reference](https://pkg.go.dev/github.com/orlangure/gnomock/preset/elastic?tab=doc) | 7.9.2
DynamoDB | |
Cassandra | |
MariaDB | |

It is possible to use Gnomock directly from Go code without any presets. HTTP
API only allows to setup containers using presets that exist in this
Expand Down
74 changes: 74 additions & 0 deletions gnomockd/mariadb_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
// +build !noserver

package gnomockd_test

import (
"bytes"
"database/sql"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"

"github.com/orlangure/gnomock"
"github.com/orlangure/gnomock/gnomockd"
"github.com/stretchr/testify/require"
)

//nolint:bodyclose
func TestMariaDB(t *testing.T) {
t.Parallel()

h := gnomockd.Handler()
bs, err := ioutil.ReadFile("./testdata/mariadb.json")
require.NoError(t, err)

buf := bytes.NewBuffer(bs)
w, r := httptest.NewRecorder(), httptest.NewRequest(http.MethodPost, "/start/mariadb", buf)
h.ServeHTTP(w, r)

res := w.Result()

defer func() { require.NoError(t, res.Body.Close()) }()

body, err := ioutil.ReadAll(res.Body)
require.NoError(t, err)

require.Equalf(t, http.StatusOK, res.StatusCode, string(body))

var c *gnomock.Container

err = json.Unmarshal(body, &c)
require.NoError(t, err)

addr := c.DefaultAddress()
connStr := fmt.Sprintf(
"%s:%s@tcp(%s)/%s",
"gnomock", "foobar", addr, "gnomockd_db",
)

db, err := sql.Open("mysql", connStr)
require.NoError(t, err)

row := db.QueryRow(`select count(distinct ip_address) from customers`)
count := 0
require.NoError(t, row.Scan(&count))
require.Equal(t, 1000, count)

row = db.QueryRow(`select a from tbl`)
value := 0
require.NoError(t, row.Scan(&value))
require.Equal(t, 42, value)

bs, err = json.Marshal(c)
require.NoError(t, err)

buf = bytes.NewBuffer(bs)
w, r = httptest.NewRecorder(), httptest.NewRequest(http.MethodPost, "/stop", buf)
h.ServeHTTP(w, r)

res = w.Result()
require.Equal(t, http.StatusOK, res.StatusCode)
}
18 changes: 18 additions & 0 deletions gnomockd/testdata/mariadb.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"preset": {
"queries_files": [
"./testdata/mysql/customers.sql"
],
"queries": [
"create table tbl(a int)",
"insert into tbl(a) values (42)"
],
"user": "gnomock",
"password": "foobar",
"db": "gnomockd_db",
"version": "10"
},
"options": {
"debug": true
}
}
69 changes: 69 additions & 0 deletions preset/mariadb/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Gnomock MariaDB

Gnomock MariaDB is a [Gnomock](https://github.com/orlangure/gnomock) preset for
running tests against a real MariaDB database, without mocks.

```go
package mariadb_test

import (
"database/sql"
"fmt"

"github.com/orlangure/gnomock"
"github.com/orlangure/gnomock/preset/mariadb"
)

func ExamplePreset() {
queries := `
create table t(a int);
insert into t (a) values (1);
insert into t (a) values (2);
`
query := `insert into t (a) values (3);`
p := mariadb.Preset(
mariadb.WithUser("Sherlock", "Holmes"),
mariadb.WithDatabase("books"),
mariadb.WithQueries(queries, query),
)

container, err := gnomock.Start(p)

defer func() { _ = gnomock.Stop(container) }()

if err != nil {
panic(err)
}

addr := container.DefaultAddress()
connStr := fmt.Sprintf(
"%s:%s@tcp(%s)/%s",
"Sherlock", "Holmes", addr, "books",
)

db, err := sql.Open("mysql", connStr)
if err != nil {
panic(err)
}

var max, avg, min, count float64

rows := db.QueryRow("select max(a), avg(a), min(a), count(a) from t")

err = rows.Scan(&max, &avg, &min, &count)
if err != nil {
panic("can't query the database: " + err.Error())
}

fmt.Println("max", 3)
fmt.Println("avg", 2)
fmt.Println("min", 1)
fmt.Println("count", 3)

// Output:
// max 3
// avg 2
// min 1
// count 3
}
```
46 changes: 46 additions & 0 deletions preset/mariadb/options.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package mariadb

// Option is an optional configuration of this Gnomock preset. Use available
// Options to configure the container
type Option func(*P)

// WithUser creates a new superuser with the provided credentials in the
// container. If not used, the default credentials are gnomock:gnoria
func WithUser(user, password string) Option {
return func(p *P) {
p.User = user
p.Password = password
}
}

// WithDatabase creates a database with the provided name in the container. If
// not provided, "mydb" is used by default. WithQueries, if provided, runs
// against the new database
func WithDatabase(db string) Option {
return func(p *P) {
p.DB = db
}
}

// WithQueries executes the provided queries against the database created with
// WithDatabase, or against default "mydb" database
func WithQueries(queries ...string) Option {
return func(p *P) {
p.Queries = append(p.Queries, queries...)
}
}

// WithQueriesFile sets a file name to read initial queries from. Queries from
// this file are executed before any other queries provided in WithQueries
func WithQueriesFile(file string) Option {
return func(p *P) {
p.QueriesFiles = append(p.QueriesFiles, file)
}
}

// WithVersion sets image version.
func WithVersion(version string) Option {
return func(o *P) {
o.Version = version
}
}

0 comments on commit 7f976aa

Please sign in to comment.