Skip to content

Commit

Permalink
Merge pull request #168 from vitkarpenko/aerospike
Browse files Browse the repository at this point in the history
Aerospike fixtures support
  • Loading branch information
vitkarpenko authored Jul 8, 2022
2 parents c46354f + 40da443 commit 79f277a
Show file tree
Hide file tree
Showing 42 changed files with 1,081 additions and 234 deletions.
84 changes: 72 additions & 12 deletions README-ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Gonkey протестирует ваши сервисы, используя их

- работает с REST/JSON API
- проверка API сервиса на соответствие OpenAPI-спеке
- заполнение БД сервиса данными из фикстур (поддерживается PostgreSQL)
- заполнение БД сервиса данными из фикстур (поддерживается PostgreSQL, MySQL, Aerospike)
- моки для имитации внешних сервисов
- можно подключить к проекту как библиотеку и запускать вместе с юнит-тестами
- запись результата тестов в виде отчета [Allure](http://allure.qatools.ru/)
Expand All @@ -32,6 +32,7 @@ Gonkey протестирует ваши сервисы, используя их
- [Наследование записей](#наследование-записей)
- [Связывание записей](#связывание-записей)
- [Выражения](#выражения)
- [Aerospike](#aerospike)
- [Моки](#моки)
- [Запуск моков при использовании gonkey как библиотеки](#запуск-моков-при-использовании-gonkey-как-библиотеки)
- [Описание моков в файле с тестом](#описание-моков-в-файле-с-тестом)
Expand All @@ -42,6 +43,7 @@ Gonkey протестирует ваши сервисы, используя их
- [Описание скрипта](#описание-скрипта)
- [Запуск скрипта с параметризацией](#запуск-скрипта-с-параметризацией)
- [Запрос в Базу данных](#запрос-в-базу-данных)
- [Формат описания запросов](#формат-описания-запросов)
- [Описание запроса](#описание-запроса)
- [Описание ответа на запрос в Базу данных](#описание-ответа-на-запрос-в-базу-данных)
- [Параметризация при запросах в Базу данных](#параметризация-при-запросах-в-базу-данных)
Expand All @@ -56,7 +58,9 @@ Gonkey протестирует ваши сервисы, используя их
- `-spec <...>` путь к файлу или URL со swagger-спецификацией сервиса
- `-host <...>` хост:порт сервиса
- `-tests <...>` файл или директория с тестами
- `-db_dsn <...>` dsn для вашей тестовой базы данных (бд будет очищена перед наполнением!), поддерживается только PostgreSQL
- `-db-type <...>` - тип базы данных. В данный момент поддерживается PostgreSQL и Aerospike.
- `-db_dsn <...>` dsn для вашей тестовой SQL базы данных (бд будет очищена перед наполнением!), поддерживается только PostgreSQL
- `-aerospike_host <...>` при использовании Aerospike - URL для подключения к нему в формате `host:port/namespace`
- `-fixtures <...>` директория с вашими фикстурами
- `-allure` генерировать allure-отчет
- `-v` подробный вывод
Expand All @@ -74,8 +78,8 @@ Gonkey протестирует ваши сервисы, используя их

```go
import (
"github.com/lamoda/gonkey/runner"
"github.com/lamoda/gonkey/mocks"
"github.com/lamoda/gonkey/runner"
"github.com/lamoda/gonkey/mocks"
)
```

Expand All @@ -86,9 +90,12 @@ func TestFuncCases(t *testing.T) {
// проинициализируйте моки, если нужно (подробнее - ниже)
//m := mocks.NewNop(...)

// проинициализирйте базу для загрузки фикстур, если нужно (подробнее - ниже)
// проинициализируйте базу для загрузки фикстур, если нужно (подробнее - ниже)
//db := ...

// проинициализируйте Aerospike для загрузки фикстур, если нужно (подробнее - ниже)
//aerospikeClient := ...

// создайте экземпляр сервера вашего приложения
srv := server.NewServer()
defer srv.Close()
Expand All @@ -99,7 +106,11 @@ func TestFuncCases(t *testing.T) {
TestsDir: "cases",
Mocks: m,
DB: db,
// Тип используемой базы данных, возможные значения fixtures.Postgres, fixtures.Mysql
Aerospike: runner.Aerospike{
Client: aerospikeClient,
Namespace: "test",
}
// Тип используемой базы данных, возможные значения fixtures.Postgres, fixtures.Mysql, fixtures.Aerospike
// Если в параметр DB не пустой, а данный параметр не назначен, будет использоваться тип бд fixtures.Postgresql
DbType: fixtures.Postgres,
FixturesDir: "fixtures",
Expand Down Expand Up @@ -592,6 +603,55 @@ tables:
- created_at: $eval(NOW())
```

### Aerospike

Для хранилища Aerospike также поддерживается заливка тестовых данных. Для этого важно не забыть при запуске gonkey как CLI-приложение использовать флаг `-db-type aerospike`, а при использовании в качестве библиотеки в конфигурации раннера: `DbType: fixtures.Aerospike`.

Формат файлов с фикстурами для аэроспайка отличается, но смысл остаётся прежним:
```yaml
sets:
set1:
key1:
bin1: "value1"
bin2: 1
key2:
bin1: "value2"
bin2: 2
bin3: 2.569947773654566473
set2:
key1:
bin4: false
bin5: null
bin1: '"'
key2:
bin1: "'"
bin5:
- 1
- '2'
```

Также поддерживаются шаблоны:
```yaml
templates:
base_tmpl:
bin1: value1
extended_tmpl:
$extend: base_tmpl
bin2: value2
sets:
set1:
key1:
$extend: base_tmpl
bin1: overwritten
set2:
key1:
$extend: extended_tmpl
bin2: overwritten
```

Связывание записей и выражения на данный момент не поддерживаются.

## Моки

Чтобы для тестов имитировать ответы от внешних сервисов, применяются моки.
Expand All @@ -605,12 +665,12 @@ tables:
```go
// создаем пустые моки сервисов
m := mocks.NewNop(
"cart",
"loyalty",
"catalog",
"madmin",
"okz",
"discounts",
"cart",
"loyalty",
"catalog",
"madmin",
"okz",
"discounts",
)
// запускаем моки
Expand Down
80 changes: 71 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Capabilities:

- works with REST/JSON API
- tests service API for compliance with OpenAPI-specs
- seeds the DB with fixtures data (supports PostgreSQL)
- seeds the DB with fixtures data (supports PostgreSQL, MySQL, Aerospike)
- provides mocks for external services
- can be used as a library and ran together with unit-tests
- stores the results as an [Allure](http://allure.qatools.ru/) report
Expand All @@ -34,6 +34,7 @@ Capabilities:
- [Record inheritance](#record-inheritance)
- [Record linking](#record-linking)
- [Expressions](#expressions)
- [Aerospike](#aerospike)
- [Mocks](#mocks)
- [Running mocks while using gonkey as a library](#running-mocks-while-using-gonkey-as-a-library)
- [Mocks definition in the test file](#mocks-definition-in-the-test-file)
Expand All @@ -44,6 +45,7 @@ Capabilities:
- [Script definition](#script-definition)
- [Running a script with parameterization](#running-a-script-with-parameterization)
- [A DB query](#a-db-query)
- [Test Format](#test-format)
- [Query definition](#query-definition)
- [Definition of DB request response](#definition-of-db-request-response)
- [DB request parameterization](#db-request-parameterization)
Expand All @@ -58,6 +60,8 @@ To test a service located on a remote host, use gonkey as a console util.
- `-spec <...>` path to a file or URL with the swagger-specs for the service
- `-host <...>` service host:port
- `-tests <...>` test file or directory
- `-db-type <...>` - database type. PostgreSQL and Aerospike are currently supported.
- `-aerospike_host <...>` when using Aerospike - connection URL in form of `host:port/namespace`
- `-db_dsn <...>` DSN for the test DB (the DB will be cleared before seeding!), supports only PostgreSQL
- `-fixtures <...>` fixtures directory
- `-allure` generate an Allure-report
Expand All @@ -76,8 +80,8 @@ Import gonkey as a dependency to your project in this file.

```go
import (
"github.com/lamoda/gonkey/runner"
"github.com/lamoda/gonkey/mocks"
"github.com/lamoda/gonkey/runner"
"github.com/lamoda/gonkey/mocks"
)
```

Expand All @@ -91,6 +95,9 @@ func TestFuncCases(t *testing.T) {
// init the DB to load the fixtures if needed (details below)
//db := ...

// init Aerospike to load the fixtures if needed (details below)
//aerospikeClient := ...

// create a server instance of your app
srv := server.NewServer()
defer srv.Close()
Expand All @@ -101,6 +108,10 @@ func TestFuncCases(t *testing.T) {
TestsDir: "cases",
Mocks: m,
DB: db,
Aerospike: runner.Aerospike{
Client: aerospikeClient,
Namespace: "test",
}
// Type of database, can be fixtures.Postgres or fixtures.Mysql
// if DB parameter present, by default uses fixtures.Postgres database type
DbType: fixtures.Postgres,
Expand Down Expand Up @@ -594,6 +605,57 @@ tables:
- created_at: $eval(NOW())
```

### Aerospike

Fixtures for Aerospike are also supported. While using gonkey as CLI application do not forget the flag `-db-type aerospike`; add `DbType: fixtures.Aerospike` to runner's configuration if gonkey is used as library.

Fixtures files format is a bit different, yet the same basic principles applies:

```yaml
sets:
set1:
key1:
bin1: "value1"
bin2: 1
key2:
bin1: "value2"
bin2: 2
bin3: 2.569947773654566473
set2:
key1:
bin4: false
bin5: null
bin1: '"'
key2:
bin1: "'"
bin5:
- 1
- '2'
```

Fixtures templates are also supported:

```yaml
templates:
base_tmpl:
bin1: value1
extended_tmpl:
$extend: base_tmpl
bin2: value2
sets:
set1:
key1:
$extend: base_tmpl
bin1: overwritten
set2:
key1:
$extend: extended_tmpl
bin2: overwritten
```

Records linking and expressions are currently not supported.

## Mocks

In order to imitate responses from external services, use mocks.
Expand All @@ -607,12 +669,12 @@ Before running tests, all planned mocks are started. It means that gonkey spins
```go
// create empty server mocks
m := mocks.NewNop(
"cart",
"loyalty",
"catalog",
"madmin",
"okz",
"discounts",
"cart",
"loyalty",
"catalog",
"madmin",
"okz",
"discounts",
)
// spin up mocks
Expand Down
2 changes: 0 additions & 2 deletions checker/addons/openapi2_compliance/checker.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ import (
)

type ResponseSchemaChecker struct {
checker.CheckerInterface

swagger *spec.Swagger
}

Expand Down
4 changes: 1 addition & 3 deletions checker/response_body/response_body.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@ import (
"github.com/lamoda/gonkey/models"
)

type ResponseBodyChecker struct {
checker.CheckerInterface
}
type ResponseBodyChecker struct{}

func NewChecker() checker.CheckerInterface {
return &ResponseBodyChecker{}
Expand Down
2 changes: 0 additions & 2 deletions checker/response_db/response_db.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ import (
)

type ResponseDbChecker struct {
checker.CheckerInterface

db *sql.DB
}

Expand Down
4 changes: 1 addition & 3 deletions checker/response_header/response_header.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@ import (
"github.com/lamoda/gonkey/models"
)

type ResponseHeaderChecker struct {
checker.CheckerInterface
}
type ResponseHeaderChecker struct{}

func NewChecker() checker.CheckerInterface {
return &ResponseHeaderChecker{}
Expand Down
4 changes: 2 additions & 2 deletions compare/compare_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3832,7 +3832,7 @@ var complexJson1 = `
"example": false
},
"is_autoreserve_allowed": {
"description": "If True, the choosen interval gets to be reserved right after the order is created",
"description": "If True, the chosen interval gets to be reserved right after the order is created",
"type": "boolean"
},
"has_horizon": {
Expand Down Expand Up @@ -8744,7 +8744,7 @@ var complexJson2 = `
"example": false
},
"is_autoreserve_allowed": {
"description": "If True, the choosen interval gets to be reserved right after the order is created",
"description": "If True, the chosen interval gets to be reserved right after the order is created",
"type": "boolean"
},
"has_horizon": {
Expand Down
13 changes: 9 additions & 4 deletions examples/with-db-example/Makefile
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
.PHONY: setup
setup:
@docker-compose -f docker-compose.yaml up --build -d
setup: teardown
@docker-compose -f docker-compose.yaml up --build --wait -d
@curl http://localhost:5000/info/10

.PHONY: teardown
teardown:
@docker-compose -f docker-compose.yaml down -v --remove-orphans

.PHONY: test
test: setup
gonkey -db_dsn "postgresql://testing_user:testing_password@localhost:5432/testing_db?sslmode=disable" -debug -host http://localhost:5000 -tests ./cases/
test-postgres: setup
./gonkey -db_dsn "postgresql://testing_user:testing_password@localhost:5432/testing_db?sslmode=disable" -debug -host http://localhost:5000 -tests ./cases/postgres
make teardown

.PHONY: test-aerospike
test-aerospike: setup
./gonkey -debug -fixtures ./fixtures/ -db-type aerospike -aerospike_host "localhost:3000/test" -host http://localhost:5000 -tests ./cases/aerospike
make teardown
7 changes: 7 additions & 0 deletions examples/with-db-example/cases/aerospike/aerospike.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
- name: Get a number from aerospike
method: GET
path: /aerospike/
fixtures:
- aerospike.yaml
response:
200: '{"data": {"bin1": "value1", "bin2": "overwritten"}}'
Loading

0 comments on commit 79f277a

Please sign in to comment.