Skip to content

Commit 9fab69f

Browse files
authored
Add multipart form request (#254)
* add: multipart form-data basic support * add: form definition into gonkey.json schema * fix: clear todo
1 parent 17d8a5c commit 9fab69f

File tree

10 files changed

+413
-122
lines changed

10 files changed

+413
-122
lines changed

README-ru.md

+115-43
Original file line numberDiff line numberDiff line change
@@ -14,46 +14,69 @@ Gonkey протестирует ваши сервисы, используя их
1414

1515
## Содержание
1616

17-
- [Использование консольной утилиты](#использование-консольной-утилиты)
18-
- [Использование gonkey как библиотеки](#использование-gonkey-как-библиотеки)
19-
- [Пример тестового сценария](#пример-тестового-сценария)
20-
- [Статус теста](#статус-теста)
21-
- [HTTP-запрос](#http-запрос)
22-
- [HTTP-ответ](#http-ответ)
23-
- [Переменные](#переменные)
24-
- [Способы присвоения](#способы-присвоения)
25-
- [В описании самого теста](#в-описании-самого-теста)
26-
- [Из результатов предыдущего запроса](#из-результатов-предыдущего-запроса)
27-
- [Из результата текущего запроса](#из-результата-текущего-запроса)
28-
- [В переменных окружения или в env-файле](#в-переменных-окружения-или-в-env-файле)
29-
- [В cases](#в-cases)
30-
- [Загрузка файлов](#загрузка-файлов)
31-
- [Фикстуры](#фикстуры)
32-
- [Удаление данных из таблиц](#удаление-данных-из-таблиц)
33-
- [Шаблоны записей](#шаблоны-записей)
34-
- [Наследование записей](#наследование-записей)
35-
- [Связывание записей](#связывание-записей)
36-
- [Выражения](#выражения)
37-
- [Aerospike](#aerospike)
38-
- [Redis](#redis)
39-
- [Моки](#моки)
40-
- [Запуск моков при использовании gonkey как библиотеки](#запуск-моков-при-использовании-gonkey-как-библиотеки)
41-
- [Описание моков в файле с тестом](#описание-моков-в-файле-с-тестом)
42-
- [Проверки запросов (requestConstraints)](#проверки-запросов-requestconstraints)
43-
- [Стратегии ответов (strategy)](#стратегии-ответов-strategy)
44-
- [Подсчет количества вызовов](#подсчет-количества-вызовов)
45-
- [Использование shell скриптов](#использование-shell-скриптов)
46-
- [Описание скрипта](#описание-скрипта)
47-
- [Запуск скрипта с параметризацией](#запуск-скрипта-с-параметризацией)
48-
- [Запрос в Базу данных](#запрос-в-базу-данных)
49-
- [Формат описания запросов](#формат-описания-запросов)
50-
- [Описание запроса](#описание-запроса)
51-
- [Описание ответа на запрос в Базу данных](#описание-ответа-на-запрос-в-базу-данных)
52-
- [Параметризация при запросах в Базу данных](#параметризация-при-запросах-в-базу-данных)
53-
- [Игнорирование порядка записей в ответе на запрос в базу данных](#игнорирование-порядка-записей-в-ответе-на-запрос-в-базу-данных)
54-
- [JSON-schema](#json-schema)
55-
- [Настройка на IDE Jetbrains](#настройка-на-ide-jetbrains)
56-
- [Настройка на IDE VSCode](#настройка-на-ide-vscode)
17+
- [Gonkey: инструмент автоматизации тестирования](#gonkey-инструмент-автоматизации-тестирования)
18+
- [Содержание](#содержание)
19+
- [Использование консольной утилиты](#использование-консольной-утилиты)
20+
- [Использование gonkey как библиотеки](#использование-gonkey-как-библиотеки)
21+
- [Пример тестового сценария](#пример-тестового-сценария)
22+
- [Статус теста](#статус-теста)
23+
- [HTTP-запрос](#http-запрос)
24+
- [HTTP-ответ](#http-ответ)
25+
- [Переменные](#переменные)
26+
- [Способы присвоения](#способы-присвоения)
27+
- [В описании самого теста](#в-описании-самого-теста)
28+
- [Из результатов предыдущего запроса](#из-результатов-предыдущего-запроса)
29+
- [Из результата текущего запроса](#из-результата-текущего-запроса)
30+
- [В переменных окружения или в env-файле](#в-переменных-окружения-или-в-env-файле)
31+
- [В cases](#в-cases)
32+
- [Запросы с multipart/form-data](#запросы-с-multipartform-data)
33+
- [Данные полей формы](#данные-полей-формы)
34+
- [Загрузка файлов](#загрузка-файлов)
35+
- [Фикстуры](#фикстуры)
36+
- [Удаление данных из таблиц](#удаление-данных-из-таблиц)
37+
- [Шаблоны записей](#шаблоны-записей)
38+
- [Наследование записей](#наследование-записей)
39+
- [Связывание записей](#связывание-записей)
40+
- [Выражения](#выражения)
41+
- [Aerospike](#aerospike)
42+
- [Redis](#redis)
43+
- [Моки](#моки)
44+
- [Запуск моков при использовании gonkey как библиотеки](#запуск-моков-при-использовании-gonkey-как-библиотеки)
45+
- [Описание моков в файле с тестом](#описание-моков-в-файле-с-тестом)
46+
- [Проверки запросов (requestConstraints)](#проверки-запросов-requestconstraints)
47+
- [nop](#nop)
48+
- [bodyMatchesJSON](#bodymatchesjson)
49+
- [bodyJSONFieldMatchesJSON](#bodyjsonfieldmatchesjson)
50+
- [pathMatches](#pathmatches)
51+
- [queryMatches](#querymatches)
52+
- [queryMatchesRegexp](#querymatchesregexp)
53+
- [methodIs](#methodis)
54+
- [headerIs](#headeris)
55+
- [bodyMatchesText](#bodymatchestext)
56+
- [bodyMatchesXML](#bodymatchesxml)
57+
- [Стратегии ответов (strategy)](#стратегии-ответов-strategy)
58+
- [nop](#nop-1)
59+
- [file](#file)
60+
- [constant](#constant)
61+
- [template](#template)
62+
- [uriVary](#urivary)
63+
- [methodVary](#methodvary)
64+
- [sequence](#sequence)
65+
- [basedOnRequest](#basedonrequest)
66+
- [dropRequest](#droprequest)
67+
- [Подсчет количества вызовов](#подсчет-количества-вызовов)
68+
- [Использование shell скриптов](#использование-shell-скриптов)
69+
- [Описание скрипта](#описание-скрипта)
70+
- [Запуск скрипта с параметризацией](#запуск-скрипта-с-параметризацией)
71+
- [Запрос в Базу данных](#запрос-в-базу-данных)
72+
- [Формат описания запросов](#формат-описания-запросов)
73+
- [Описание запроса](#описание-запроса)
74+
- [Описание ответа на запрос в Базу данных](#описание-ответа-на-запрос-в-базу-данных)
75+
- [Параметризация при запросах в Базу данных](#параметризация-при-запросах-в-базу-данных)
76+
- [Игнорирование порядка записей в ответе на запрос в базу данных](#игнорирование-порядка-записей-в-ответе-на-запрос-в-базу-данных)
77+
- [JSON-schema](#json-schema)
78+
- [Настройка на IDE Jetbrains](#настройка-на-ide-jetbrains)
79+
- [Настройка на IDE VSCode](#настройка-на-ide-vscode)
5780

5881
## Использование консольной утилиты
5982

@@ -346,6 +369,7 @@ responseHeaders:
346369
- body для моков
347370
- headers для моков
348371
- requestConstraints для моков
372+
- form для multipart/form-data
349373

350374
Пример использования:
351375

@@ -487,12 +511,41 @@ env-файл, например, удобно использовать, когд
487511

488512
Такие переменные будут доступны и в других кейсах, если не будут переопределены.
489513

490-
## Загрузка файлов
491-
492-
В тестовом запросе можно загружать файлы. Для этого нужно указать тип запроса - POST и заголовок:
514+
## Запросы с multipart/form-data
515+
Нужно указать тип запроса
516+
- POST
493517

518+
Заголовок (необязательно):
494519
> Content-Type: multipart/form-data
495520

521+
или с указанием _boundary_ (необязательно):
522+
> Content-Type: multipart/form-data; boundary=--some-boundary
523+
524+
### Данные полей формы
525+
Пример:
526+
527+
```yaml
528+
- name: "upload-form"
529+
method: POST
530+
form:
531+
fields:
532+
field_name1: "field_name1 value"
533+
name2: "name2 value"
534+
"custom_struct_field[0]": "custom_struct_field 0"
535+
"custom_struct_field[1]": "custom_struct_field 1"
536+
"custom_struct_field[inner_obj][field]": "inner_obj field value"
537+
headers:
538+
Content-Type: multipart/form-data # case-sensitive, can be omitted
539+
response:
540+
200: |
541+
{
542+
"status": "OK"
543+
}
544+
```
545+
546+
### Загрузка файлов
547+
*по пути с файловой системы
548+
496549
Пример:
497550

498551
```yaml
@@ -502,6 +555,25 @@ env-файл, например, удобно использовать, когд
502555
files:
503556
file1: "testdata/upload-files/file1.txt"
504557
file2: "testdata/upload-files/file2.log"
558+
headers:
559+
Content-Type: multipart/form-data
560+
response:
561+
200: |
562+
{
563+
"status": "OK"
564+
}
565+
```
566+
567+
с данными формы:
568+
```yaml
569+
- name: "upload-multipart-form-data"
570+
method: POST
571+
form:
572+
fields:
573+
field_name1: "field_name1 value"
574+
files:
575+
file1: "testdata/upload-files/file1.txt"
576+
file2: "testdata/upload-files/file2.log"
505577
headers:
506578
Content-Type: multipart/form-data # case-sensitive, can be omitted
507579
response:

README.md

+117-43
Original file line numberDiff line numberDiff line change
@@ -16,46 +16,69 @@ Capabilities:
1616

1717
## Table of contents
1818

19-
- [Using the CLI](#using-the-cli)
20-
- [Using gonkey as a library](#using-gonkey-as-a-library)
21-
- [Test scenario example](#test-scenario-example)
22-
- [Test status](#test-status)
23-
- [HTTP-request](#http-request)
24-
- [HTTP-response](#http-response)
25-
- [Variables](#variables)
26-
- [Assignment](#assignment)
27-
- [In the description of the test](#in-the-description-of-the-test)
28-
- [From the response of the previous test](#from-the-response-of-the-previous-test)
29-
- [From the response of currently running test](#from-the-response-of-currently-running-test)
30-
- [From environment variables or from env-file](#from-environment-variables-or-from-env-file)
31-
- [From cases](#from-cases)
32-
- [Files uploading](#files-uploading)
33-
- [Fixtures](#fixtures)
34-
- [Deleting data from tables](#deleting-data-from-tables)
35-
- [Record templates](#record-templates)
36-
- [Record inheritance](#record-inheritance)
37-
- [Record linking](#record-linking)
38-
- [Expressions](#expressions)
39-
- [Aerospike](#aerospike)
40-
- [Redis](#redis)
41-
- [Mocks](#mocks)
42-
- [Running mocks while using gonkey as a library](#running-mocks-while-using-gonkey-as-a-library)
43-
- [Mocks definition in the test file](#mocks-definition-in-the-test-file)
44-
- [Request constraints (requestConstraints)](#request-constraints-requestconstraints)
45-
- [Response strategies (strategy)](#response-strategies-strategy)
46-
- [Calls count](#calls-count)
47-
- [Shell scripts usage](#shell-scripts-usage)
48-
- [Script definition](#script-definition)
49-
- [Running a script with parameterization](#running-a-script-with-parameterization)
50-
- [A DB query](#a-db-query)
51-
- [Test Format](#test-format)
52-
- [Query definition](#query-definition)
53-
- [Definition of DB request response](#definition-of-db-request-response)
54-
- [DB request parameterization](#db-request-parameterization)
55-
- [Ignoring ordering in DB response](#ignoring-ordering-in-db-response)
56-
- [JSON-schema](#json-schema)
57-
- [Setup in Jetbrains IDE](#setup-in-jetbrains-ide)
58-
- [Setup is VSCode IDE](#setup-is-vscode-ide)
19+
- [Gonkey: testing automation tool](#gonkey-testing-automation-tool)
20+
- [Table of contents](#table-of-contents)
21+
- [Using the CLI](#using-the-cli)
22+
- [Using gonkey as a library](#using-gonkey-as-a-library)
23+
- [Test scenario example](#test-scenario-example)
24+
- [Test status](#test-status)
25+
- [HTTP-request](#http-request)
26+
- [HTTP-response](#http-response)
27+
- [Variables](#variables)
28+
- [Assignment](#assignment)
29+
- [In the description of the test](#in-the-description-of-the-test)
30+
- [From the response of the previous test](#from-the-response-of-the-previous-test)
31+
- [From the response of currently running test](#from-the-response-of-currently-running-test)
32+
- [From environment variables or from env-file](#from-environment-variables-or-from-env-file)
33+
- [From cases](#from-cases)
34+
- [multipart/form-data requests](#multipartform-data-requests)
35+
- [Form](#form)
36+
- [File upload](#file-upload)
37+
- [Fixtures](#fixtures)
38+
- [Deleting data from tables](#deleting-data-from-tables)
39+
- [Record templates](#record-templates)
40+
- [Record inheritance](#record-inheritance)
41+
- [Record linking](#record-linking)
42+
- [Expressions](#expressions)
43+
- [Aerospike](#aerospike)
44+
- [Redis](#redis)
45+
- [Mocks](#mocks)
46+
- [Running mocks while using gonkey as a library](#running-mocks-while-using-gonkey-as-a-library)
47+
- [Mocks definition in the test file](#mocks-definition-in-the-test-file)
48+
- [Request constraints (requestConstraints)](#request-constraints-requestconstraints)
49+
- [nop](#nop)
50+
- [bodyMatchesJSON](#bodymatchesjson)
51+
- [bodyJSONFieldMatchesJSON](#bodyjsonfieldmatchesjson)
52+
- [pathMatches](#pathmatches)
53+
- [queryMatches](#querymatches)
54+
- [queryMatchesRegexp](#querymatchesregexp)
55+
- [methodIs](#methodis)
56+
- [headerIs](#headeris)
57+
- [bodyMatchesText](#bodymatchestext)
58+
- [bodyMatchesXML](#bodymatchesxml)
59+
- [Response strategies (strategy)](#response-strategies-strategy)
60+
- [nop](#nop-1)
61+
- [file](#file)
62+
- [constant](#constant)
63+
- [template](#template)
64+
- [uriVary](#urivary)
65+
- [methodVary](#methodvary)
66+
- [sequence](#sequence)
67+
- [basedOnRequest](#basedonrequest)
68+
- [dropRequest](#droprequest)
69+
- [Calls count](#calls-count)
70+
- [Shell scripts usage](#shell-scripts-usage)
71+
- [Script definition](#script-definition)
72+
- [Running a script with parameterization](#running-a-script-with-parameterization)
73+
- [A DB query](#a-db-query)
74+
- [Test Format](#test-format)
75+
- [Query definition](#query-definition)
76+
- [Definition of DB request response](#definition-of-db-request-response)
77+
- [DB request parameterization](#db-request-parameterization)
78+
- [Ignoring ordering in DB response](#ignoring-ordering-in-db-response)
79+
- [JSON-schema](#json-schema)
80+
- [Setup in Jetbrains IDE](#setup-in-jetbrains-ide)
81+
- [Setup is VSCode IDE](#setup-is-vscode-ide)
5982

6083
## Using the CLI
6184

@@ -349,6 +372,7 @@ You can use variables in the description of the test, the following fields are s
349372
- mocks body
350373
- mocks headers
351374
- mocks requestConstraints
375+
- form
352376

353377
Example:
354378

@@ -487,12 +511,43 @@ Example:
487511

488512
Variables like these will be available through another cases if not redefined.
489513

490-
## Files uploading
491-
492-
You can upload files in test request. For this you must specify the type of request - POST and header:
514+
## multipart/form-data requests
515+
You must specify the type of request:
516+
- POST
493517

518+
Header (optional):
494519
> Content-Type: multipart/form-data
495520

521+
with _boundary_ (optional):
522+
> Content-Type: multipart/form-data; boundary=--some-boundary
523+
524+
525+
### Form
526+
Example:
527+
528+
```yaml
529+
- name: "upload-form"
530+
method: POST
531+
form:
532+
fields:
533+
field_name1: "field_name1 value"
534+
name2: "name2 value"
535+
"custom_struct_field[0]": "custom_struct_field 0"
536+
"custom_struct_field[1]": "custom_struct_field 1"
537+
"custom_struct_field[inner_obj][field]": "inner_obj field value"
538+
headers:
539+
Content-Type: multipart/form-data # case-sensitive, can be omitted
540+
response:
541+
200: |
542+
{
543+
"status": "OK"
544+
}
545+
```
546+
547+
### File upload
548+
You can upload files in test request.
549+
Example:
550+
496551
Example:
497552

498553
```yaml
@@ -502,6 +557,25 @@ Example:
502557
files:
503558
file1: "testdata/upload-files/file1.txt"
504559
file2: "testdata/upload-files/file2.log"
560+
headers:
561+
Content-Type: multipart/form-data
562+
response:
563+
200: |
564+
{
565+
"status": "OK"
566+
}
567+
```
568+
569+
with form:
570+
```yaml
571+
- name: "upload-multipart-form-data"
572+
method: POST
573+
form:
574+
fields:
575+
field_name1: "field_name1 value"
576+
files:
577+
file1: "testdata/upload-files/file1.txt"
578+
file2: "testdata/upload-files/file2.log"
505579
headers:
506580
Content-Type: multipart/form-data # case-sensitive, can be omitted
507581
response:

0 commit comments

Comments
 (0)