diff --git a/README.md b/README.md
index 52524b17..8f8235a3 100644
--- a/README.md
+++ b/README.md
@@ -214,7 +214,7 @@ Manifest is loaded as **template**, so you can use variables, Go **range** and *
| `response.statuscode` | Expected http [status code](#statuscode). See api documentation for the endpoint to decide which code to expect |
| `response.header` | If you expect certain response headers, you can define them here. A single key can have multiple headers |
| `response.cookie` | Cookies will be under this key, in a map `name => cookie` |
-| `response.format` | Optionally, the expected format of the response can be specified or [preprocessed](#preprocessing-responses) so that it can be converted into json and can be checked. Formats are: [`binary`](#binary-data-comparison), [`xml`](#xml-data-comparison), [`html`](#html-data-comparison), [`csv`](#csv-data-comparison) |
+| `response.format` | Optionally, the expected format of the response can be specified or [preprocessed](#preprocessing-responses) so that it can be converted into json and can be checked. Formats are: [`binary`](#binary-data-comparison), [`xml`](#xml-data-comparison), [`html`](#html-data-comparison), [`csv`](#csv-data-comparison), [`text`](#text-data-comparison) |
| `response.body` | The body we want to assert on |
| `store_response_gjson` | Store parts of the response into the datastore |
| `store_response_gjson.sess_cookie` | Cookies are stored in `cookie` map |
@@ -617,6 +617,44 @@ You can also specify the delimiter (`comma`) for the CSV format (default: `,`):
}
```
+## Text Data comparison
+
+If the response format is specified as `"type": "text"`, the content of the response is returned in a JSON object.
+
+The object contains the following keys:
+
+* `text`: the response text without any changes
+* `text_trimmed`: the response text, leading and trailing whitespaces have been trimmed
+* `lines`: the response text, split into lines
+* `float64`: if the text can be parsed into a float64 value, the numerical value is returned, else `null`
+* `int64`: if the text can be parsed into a int64 value, the numerical value is returned, else `null`
+
+Assume we get the content of this text file in the response, including whitespaces and newlines:
+
+```
+ 42.35
+
+```
+
+```json
+{
+ "name": "Text comparison",
+ "request": {
+ "endpoint": "export/1/files/number.txt",
+ "method": "GET"
+ },
+ "response": {
+ "text": " 42.35\n",
+ "text_trimmed": "42.35",
+ "lines": [
+ " 42"
+ ],
+ "float64": 42.35,
+ "int64": 42,
+ }
+}
+```
+
## Preprocessing responses
Responses in arbitrary formats can be preprocessed by calling any command line tool that can produce JSON, XML, CSV or binary output. In combination with the `type` parameter in `format`, non-JSON output can be [formatted after preprocessing](#reading-metadata-from-a-file-xml-format). If the result is already in JSON format, it can be [checked directly](#reading-metadata-from-a-file-json-format).
diff --git a/api_testcase_test.go b/api_testcase_test.go
index e9b016c5..1a216f9d 100644
--- a/api_testcase_test.go
+++ b/api_testcase_test.go
@@ -73,7 +73,7 @@ func TestCollectResponseShouldWork(t *testing.T) {
`)
filesystem.Fs = afero.NewMemMapFs()
- afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 644)
+ afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 0644)
r := report.NewReport()
@@ -124,8 +124,8 @@ func TestCollectLoadExternalFile(t *testing.T) {
}`)
filesystem.Fs = afero.NewMemMapFs()
- afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 644)
- afero.WriteFile(filesystem.Fs, "collect.json", []byte(externalFile), 644)
+ afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 0644)
+ afero.WriteFile(filesystem.Fs, "collect.json", []byte(externalFile), 0644)
r := report.NewReport()
@@ -184,8 +184,8 @@ func TestCollectLoadExternalCollect(t *testing.T) {
}`)
filesystem.Fs = afero.NewMemMapFs()
- afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 644)
- afero.WriteFile(filesystem.Fs, "collect.json", []byte(externalFile), 644)
+ afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 0644)
+ afero.WriteFile(filesystem.Fs, "collect.json", []byte(externalFile), 0644)
r := report.NewReport()
@@ -283,8 +283,8 @@ func TestCollectEvents(t *testing.T) {
}`)
filesystem.Fs = afero.NewMemMapFs()
- afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 644)
- afero.WriteFile(filesystem.Fs, "collect.json", []byte(externalFile), 644)
+ afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 0644)
+ afero.WriteFile(filesystem.Fs, "collect.json", []byte(externalFile), 0644)
r := report.NewReport()
@@ -336,7 +336,7 @@ func TestCollectResponseShouldFail(t *testing.T) {
`)
filesystem.Fs = afero.NewMemMapFs()
- afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 644)
+ afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 0644)
r := report.NewReport()
r.Root().NoLogTime = true
@@ -398,7 +398,7 @@ func TestHeaderFromDatastoreWithMap(t *testing.T) {
`)
filesystem.Fs = afero.NewMemMapFs()
- afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 644)
+ afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 0644)
r := report.NewReport()
r.Root().NoLogTime = true
@@ -449,7 +449,7 @@ func TestHeaderFromDatastoreWithSlice(t *testing.T) {
`)
filesystem.Fs = afero.NewMemMapFs()
- afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 644)
+ afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 0644)
r := report.NewReport()
r.Root().NoLogTime = true
@@ -507,7 +507,7 @@ func TestCookieSetInDatastore(t *testing.T) {
`)
filesystem.Fs = afero.NewMemMapFs()
- afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 644)
+ afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 0644)
r := report.NewReport()
r.Root().NoLogTime = true
@@ -603,7 +603,7 @@ func TestCookiesReceivedFromRequest(t *testing.T) {
`)
filesystem.Fs = afero.NewMemMapFs()
- afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 644)
+ afero.WriteFile(filesystem.Fs, "manifest.json", []byte(testManifest), 0644)
r := report.NewReport()
r.Root().NoLogTime = true
diff --git a/api_testsuite_test.go b/api_testsuite_test.go
index 192ec910..5fcbf8e4 100644
--- a/api_testsuite_test.go
+++ b/api_testsuite_test.go
@@ -10,9 +10,9 @@ import (
func TestLoadManifest(t *testing.T) {
filesystem.Fs = afero.NewMemMapFs()
- afero.WriteFile(filesystem.Fs, "externalFile", []byte(`{"load":{"me":"loaded"}}`), 644)
+ afero.WriteFile(filesystem.Fs, "externalFile", []byte(`{"load":{"me":"loaded"}}`), 0644)
- afero.WriteFile(filesystem.Fs, "testManifest.json", []byte(`{"testload": {{ file "externalFile" | gjson "load.me"}}}`), 644)
+ afero.WriteFile(filesystem.Fs, "testManifest.json", []byte(`{"testload": {{ file "externalFile" | gjson "load.me"}}}`), 0644)
s := Suite{manifestPath: "testManifest.json"}
diff --git a/config_test.go b/config_test.go
index 140413e4..586ea220 100644
--- a/config_test.go
+++ b/config_test.go
@@ -34,18 +34,18 @@ func SetupFS() {
//Setup test filesystem
filesystem.Fs = afero.NewMemMapFs()
- filesystem.Fs.MkdirAll(filepath.Dir(manifestPath1), 755)
- filesystem.Fs.MkdirAll(filepath.Dir(manifestPath2), 755)
- filesystem.Fs.MkdirAll(filepath.Dir(manifestPath3), 755)
- filesystem.Fs.MkdirAll(filepath.Dir(manifestPath4), 755)
- filesystem.Fs.MkdirAll(filepath.Dir(manifestPath5), 755)
- filesystem.Fs.MkdirAll(filepath.Join("path", "empty"), 755)
+ filesystem.Fs.MkdirAll(filepath.Dir(manifestPath1), 0755)
+ filesystem.Fs.MkdirAll(filepath.Dir(manifestPath2), 0755)
+ filesystem.Fs.MkdirAll(filepath.Dir(manifestPath3), 0755)
+ filesystem.Fs.MkdirAll(filepath.Dir(manifestPath4), 0755)
+ filesystem.Fs.MkdirAll(filepath.Dir(manifestPath5), 0755)
+ filesystem.Fs.MkdirAll(filepath.Join("path", "empty"), 0755)
- afero.WriteFile(filesystem.Fs, manifestPath1, []byte(""), 644)
- afero.WriteFile(filesystem.Fs, manifestPath2, []byte(""), 644)
- afero.WriteFile(filesystem.Fs, manifestPath3, []byte(""), 644)
- afero.WriteFile(filesystem.Fs, manifestPath4, []byte(""), 644)
- afero.WriteFile(filesystem.Fs, manifestPath5, []byte(""), 644)
+ afero.WriteFile(filesystem.Fs, manifestPath1, []byte(""), 0644)
+ afero.WriteFile(filesystem.Fs, manifestPath2, []byte(""), 0644)
+ afero.WriteFile(filesystem.Fs, manifestPath3, []byte(""), 0644)
+ afero.WriteFile(filesystem.Fs, manifestPath4, []byte(""), 0644)
+ afero.WriteFile(filesystem.Fs, manifestPath5, []byte(""), 0644)
}
diff --git a/pkg/lib/api/build_policies_test.go b/pkg/lib/api/build_policies_test.go
index be94ef7a..3384178e 100644
--- a/pkg/lib/api/build_policies_test.go
+++ b/pkg/lib/api/build_policies_test.go
@@ -44,7 +44,7 @@ func TestBuildMultipart(t *testing.T) {
func TestBuildMultipart_ErrPathSpec(t *testing.T) {
testRequest := Request{
Body: map[string]any{
- "somekey": fmt.Sprintf("noPathspec"),
+ "somekey": "noPathspec",
},
ManifestDir: "test/path/",
}
diff --git a/pkg/lib/api/response.go b/pkg/lib/api/response.go
index d54efcff..512f3c9e 100755
--- a/pkg/lib/api/response.go
+++ b/pkg/lib/api/response.go
@@ -1,6 +1,7 @@
package api
import (
+ "bufio"
"bytes"
"crypto/md5"
"encoding/hex"
@@ -8,6 +9,7 @@ import (
"fmt"
"io"
"net/http"
+ "strconv"
"strings"
"time"
"unicode/utf8"
@@ -62,12 +64,12 @@ type ResponseSerialization struct {
type responseSerializationInternal struct {
ResponseSerialization
- HeaderFlat map[string]any `json:"header_flat,omitemty"`
+ HeaderFlat map[string]any `json:"header_flat,omitempty"`
}
type ResponseFormat struct {
IgnoreBody bool `json:"-"` // if true, do not try to parse the body (since it is not expected in the response)
- Type string `json:"type"` // default "json", allowed: "csv", "json", "xml", "xml2", "html", "xhtml", "binary"
+ Type string `json:"type"` // default "json", allowed: "csv", "json", "xml", "xml2", "html", "xhtml", "binary", "text"
CSV struct {
Comma string `json:"comma,omitempty"`
} `json:"csv,omitempty"`
@@ -168,6 +170,16 @@ func NewResponseFromSpec(spec ResponseSerialization) (res Response, err error) {
return NewResponse(spec.StatusCode, spec.Headers, cookies, body, spec.BodyControl, spec.Format)
}
+// splitLines is a helper function needed for format "text"
+func splitLines(s string) (lines util.JsonArray) {
+ lines = util.JsonArray{}
+ sc := bufio.NewScanner(strings.NewReader(s))
+ for sc.Scan() {
+ lines = append(lines, sc.Text())
+ }
+ return lines
+}
+
// ServerResponseToGenericJSON parse response from server. convert xml, csv, binary to json if necessary
func (response Response) ServerResponseToGenericJSON(responseFormat ResponseFormat, bodyOnly bool) (any, error) {
var (
@@ -226,13 +238,36 @@ func (response Response) ServerResponseToGenericJSON(responseFormat ResponseForm
// We have another file format (binary). We thereby take the md5 Hash of the body and compare that one
hasher := md5.New()
hasher.Write([]byte(resp.Body))
- JsonObject := util.JsonObject{
+ jsonObject := util.JsonObject{
"md5sum": util.JsonString(hex.EncodeToString(hasher.Sum(nil))),
}
- bodyData, err = json.Marshal(JsonObject)
+ bodyData, err = json.Marshal(jsonObject)
if err != nil {
return res, fmt.Errorf("Could not marshal body with md5sum to json: %w", err)
}
+ case "text":
+ // render the content as text
+ bodyText := string(resp.Body)
+ bodyTextTrimmed := strings.TrimSpace(bodyText)
+ jsonObject := util.JsonObject{
+ "text": util.JsonString(bodyText),
+ "text_trimmed": util.JsonString(bodyTextTrimmed),
+ "lines": splitLines(bodyText),
+ "float64": nil,
+ "int64": nil,
+ }
+ // try to parse the string as float and int
+ // ignore errors silently in case the text is not numerical
+ n, err2 := strconv.ParseFloat(bodyTextTrimmed, 64)
+ if err2 == nil {
+ jsonObject["float64"] = util.JsonNumber(n)
+ jsonObject["int64"] = util.JsonNumber(int64(n))
+ }
+
+ bodyData, err = json.Marshal(jsonObject)
+ if err != nil {
+ return res, fmt.Errorf("Could not marshal body to text (string): %w", err)
+ }
case "":
// no specific format, we assume a json, and thereby try to unmarshal it into our body
bodyData = resp.Body
@@ -395,28 +430,21 @@ func (response Response) ToString() string {
}
}
- if response.Format.PreProcess != nil {
- resp, err = response.Format.PreProcess.RunPreProcess(response)
- if err != nil {
- resp = response
- }
- } else {
- resp = response
- }
+ resp = response
// for logging, always show the body
resp.Format.IgnoreBody = false
body := resp.Body
switch resp.Format.Type {
- case "xml", "xml2", "csv", "html", "xhtml":
+ case "xml", "xml2", "csv", "html", "xhtml", "text":
if utf8.Valid(body) {
bodyString, err = resp.ServerResponseToJsonString(true)
if err != nil {
bodyString = string(body)
}
} else {
- bodyString = fmt.Sprintf("[BINARY DATA NOT DISPLAYED]\n\n")
+ bodyString = "[BINARY DATA NOT DISPLAYED]\n\n"
}
case "binary":
resp.Format.IgnoreBody = false
@@ -428,7 +456,7 @@ func (response Response) ToString() string {
if utf8.Valid(body) {
bodyString = string(body)
} else {
- bodyString = fmt.Sprintf("[BINARY DATA NOT DISPLAYED]\n\n")
+ bodyString = "[BINARY DATA NOT DISPLAYED]\n\n"
}
}
diff --git a/pkg/lib/csv/csv.go b/pkg/lib/csv/csv.go
index 663b2ba4..016fa39c 100644
--- a/pkg/lib/csv/csv.go
+++ b/pkg/lib/csv/csv.go
@@ -173,9 +173,7 @@ func renderCSV(read io.Reader, comma rune) ([][]string, error) {
}
func isValidFormat(format string) bool {
- if strings.HasPrefix(format, "*") {
- format = format[1:]
- }
+ format = strings.TrimPrefix(format, "*")
validFormats := []string{"string", "int64", "int", "float64", "bool"}
for _, v := range validFormats {
if format == v || format == v+",array" || format == "json" {
diff --git a/pkg/lib/filesystem/util_test.go b/pkg/lib/filesystem/util_test.go
index be27ada8..d58f7446 100644
--- a/pkg/lib/filesystem/util_test.go
+++ b/pkg/lib/filesystem/util_test.go
@@ -11,10 +11,10 @@ import (
func TestMemFS(t *testing.T) {
Fs = afero.NewMemMapFs()
- for i := 0; i < 1000; i++ {
- Fs.MkdirAll(filepath.Join("store", "test1", "data", strconv.Itoa(i)), 755)
+ for i := range 1000 {
+ Fs.MkdirAll(filepath.Join("store", "test1", "data", strconv.Itoa(i)), 0755)
}
- for i := 0; i < 1000; i++ {
+ for i := range 1000 {
_, err := Fs.Open(filepath.Join("store", "test1", "data", strconv.Itoa(i)))
if err != nil {
t.Error(err)
diff --git a/pkg/lib/report/parsing_functions.go b/pkg/lib/report/parsing_functions.go
index 2cd885d8..637eb4a6 100755
--- a/pkg/lib/report/parsing_functions.go
+++ b/pkg/lib/report/parsing_functions.go
@@ -114,7 +114,7 @@ func ParseJSONStatsResult(baseResult *ReportElement) []byte {
}
stats.Groups = make([]statsGroup, baseResult.report.StatsGroups)
- for i := 0; i < baseResult.report.StatsGroups; i++ {
+ for i := range baseResult.report.StatsGroups {
stats.Groups[i] = statsGroup{
Number: i,
Runtime: 0,
diff --git a/pkg/lib/template/template_loader_test.go b/pkg/lib/template/template_loader_test.go
index 25446f96..eb2bf6d8 100644
--- a/pkg/lib/template/template_loader_test.go
+++ b/pkg/lib/template/template_loader_test.go
@@ -207,7 +207,7 @@ int64,string,"stringer,array","int64,array"`, ``, true},
}
for i, testCase := range testCases {
t.Run(fmt.Sprintf("case_%d", i), func(t *testing.T) {
- root := []byte(fmt.Sprintf(`{{ file_csv "somefile.json" ',' | marshal }}`))
+ root := []byte(`{{ file_csv "somefile.json" ',' | marshal }}`)
target := []byte(testCase.csv)
@@ -253,7 +253,7 @@ int64,string,"string,array","int64,array"
}
for i, testCase := range testCases {
t.Run(fmt.Sprintf("case_%d", i), func(t *testing.T) {
- root := []byte(fmt.Sprintf(`{{ file_csv "somefile.json" ',' | rows_to_map "name" "ages" | marshal }}`))
+ root := []byte(`{{ file_csv "somefile.json" ',' | rows_to_map "name" "ages" | marshal }}`)
target := []byte(testCase.csv)
diff --git a/test/_res/assets/dummy.xml b/test/_res/assets/dummy.xml
new file mode 100644
index 00000000..e8077875
--- /dev/null
+++ b/test/_res/assets/dummy.xml
@@ -0,0 +1,12 @@
+
+
+ yo
+ pdf
+ 50
+
+
+ jo
+ png
+ 11500
+
+
diff --git a/test/_res/assets/number.txt b/test/_res/assets/number.txt
new file mode 100644
index 00000000..9b4c81a7
--- /dev/null
+++ b/test/_res/assets/number.txt
@@ -0,0 +1 @@
+ 42.35
diff --git a/test/proxy/read_from_proxies.json b/test/proxy/read_from_proxies.json
index bab82a6b..e964a4c0 100644
--- a/test/proxy/read_from_proxies.json
+++ b/test/proxy/read_from_proxies.json
@@ -4,7 +4,7 @@
{
"name": "Poll 'test' proxy store, offset {{ $offset }}",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "proxyread/test",
"method": "GET",
"query_params": {
@@ -32,12 +32,12 @@
,{
"name": "Poll 'test' proxy store for binary content (image)",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "proxyread/test",
"method": "GET",
"query_params": {
- "offset": "{{ datastore "max_entries" }}"
- }
+ "offset": "{{ datastore `max_entries` }}"
+ }
},
"response": {
"header": {
@@ -59,7 +59,7 @@
{
"name": "Poll 'test2' proxy store, offset {{ $offset }}",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "proxyread/test2",
"method": "GET",
"query_params": {
@@ -72,7 +72,7 @@
"X-Apitest-Proxy-Request-Path": ["/proxywrite/test2"],
"X-Apitest-Proxy-Request-Query": ["is=here&my=data_{{ $offset }}&some=value"],
"X-Some": ["x-header"],
- "X-Apitest-Proxy-Store-Count": ["{{ datastore "max_entries" }}"],
+ "X-Apitest-Proxy-Store-Count": ["{{ datastore `max_entries` }}"],
{{ $nextOffset := add $offset 1 }}
{{ if gt $nextOffset (subtract 1 (datastore "max_entries")) }}
{{ $nextOffset = 0 }}
diff --git a/test/proxy/write_to_proxies.json b/test/proxy/write_to_proxies.json
index 0c05d843..27347528 100644
--- a/test/proxy/write_to_proxies.json
+++ b/test/proxy/write_to_proxies.json
@@ -4,7 +4,7 @@
{
"name": "Add some JSON requests to proxy 'test'",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "proxywrite/test",
"method": "POST",
"query_params": {
@@ -31,7 +31,7 @@
,{
"name": "post image to proxy 'test'",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "proxywrite/test",
"method": "POST",
"body_file": "@../_res/assets/camera.jpg",
@@ -51,7 +51,7 @@
,{
"name": "Add some JSON requests to proxy 'test2'",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "proxywrite/test2",
"method": "GET",
"query_params": {
diff --git a/test/response/format/csv/check_store_values.json b/test/response/format/csv/check_store_values.json
index bef04791..5cbb4a0f 100644
--- a/test/response/format/csv/check_store_values.json
+++ b/test/response/format/csv/check_store_values.json
@@ -2,7 +2,7 @@
{
"name": "Get existing CSV file, checking response with previously stored data",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "dummy.csv",
"method": "GET"
},
@@ -13,8 +13,8 @@
},
"body": [
{
- "name": "{{ datastore "name" }}",
- "extension": "{{ datastore "ext" }}"
+ "name": {{ datastore "name" | marshal }},
+ "extension": {{ datastore "ext" | marshal }}
}
]
}
diff --git a/test/response/format/csv/csv_requests.json b/test/response/format/csv/csv_requests.json
index 1502d434..50e7936e 100644
--- a/test/response/format/csv/csv_requests.json
+++ b/test/response/format/csv/csv_requests.json
@@ -2,7 +2,7 @@
{
"name": "Get non-existing CSV file (expecting statuscode)",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "wrong/path.jpg",
"method": "GET"
},
@@ -13,7 +13,7 @@
{
"name": "Get non-existing CSV file (not expecting statuscode, so should fail)",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "wrong/path.jpg",
"method": "GET"
},
@@ -22,7 +22,7 @@
{
"name": "Get existing CSV file",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "dummy.csv",
"method": "GET"
},
@@ -33,7 +33,7 @@
{
"name": "Get existing CSV file, without checking response",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "dummy.csv",
"method": "GET"
}
@@ -41,7 +41,7 @@
{
"name": "Get existing CSV file, checking response and storing data (fail - no format)",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "dummy.csv",
"method": "GET"
},
@@ -56,7 +56,7 @@
{
"name": "Get existing CSV file, checking response and storing data (success)",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "dummy.csv",
"method": "GET"
},
@@ -73,7 +73,7 @@
{
"name": "Get existing CSV file, only storing data (fail - no format)",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "dummy.csv",
"method": "GET"
},
@@ -85,7 +85,7 @@
{
"name": "Get existing CSV file, only storing data (success)",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "dummy.csv",
"method": "GET"
},
diff --git a/test/response/format/csv/preserve_trailing_spaces.json b/test/response/format/csv/preserve_trailing_spaces.json
index 8af36368..b21edf6f 100644
--- a/test/response/format/csv/preserve_trailing_spaces.json
+++ b/test/response/format/csv/preserve_trailing_spaces.json
@@ -1,7 +1,7 @@
{
"name": "Get existing CSV file with trailing spaces in values of type \"string,array\"",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "bounce-json",
"method": "POST",
"body": {{ file_csv "trailing_spaces.csv" ',' | marshal }}
diff --git a/test/response/format/html/check_local_file_against_response.json b/test/response/format/html/check_local_file_against_response.json
index 144ec2fc..519eed3a 100644
--- a/test/response/format/html/check_local_file_against_response.json
+++ b/test/response/format/html/check_local_file_against_response.json
@@ -2,7 +2,7 @@
{
"name": "Get existing HTML file",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "bounce-json",
"method": "POST",
"body": {{ file_html2json "sample.html" }}
diff --git a/test/response/format/html/check_response_format_html.json b/test/response/format/html/check_response_format_html.json
index 84f4fa85..021c6126 100644
--- a/test/response/format/html/check_response_format_html.json
+++ b/test/response/format/html/check_response_format_html.json
@@ -1,7 +1,7 @@
{
"name": "get sample.html from test server, use response format \"html\"",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "sample.html",
"method": "GET"
},
diff --git a/test/response/format/text/csv_requests.json b/test/response/format/text/csv_requests.json
new file mode 100644
index 00000000..57ab9520
--- /dev/null
+++ b/test/response/format/text/csv_requests.json
@@ -0,0 +1,53 @@
+[
+ {
+ "name": "Get existing CSV file, check content in csv format",
+ "request": {
+ "server_url": {{ datastore "req_base_url" | marshal }},
+ "endpoint": "dummy.csv",
+ "method": "GET"
+ },
+ "response": {
+ "statuscode": 200,
+ "format": {
+ "type": "csv"
+ },
+ "body": [
+ {
+ "extension": "pdf",
+ "name": "yo",
+ "size": "50"
+ },
+ {
+ "extension": "png",
+ "name": "jo",
+ "size": "11500"
+ }
+ ]
+ }
+ },
+ {
+ "name": "Get existing CSV file, check content in text format",
+ "request": {
+ "server_url": {{ datastore "req_base_url" | marshal }},
+ "endpoint": "dummy.csv",
+ "method": "GET"
+ },
+ "response": {
+ "statuscode": 200,
+ "format": {
+ "type": "text"
+ },
+ "body": {
+ "text": "name,extension,size\nyo,pdf,50\njo,png,11500\n",
+ "text_trimmed": "name,extension,size\nyo,pdf,50\njo,png,11500",
+ "lines": [
+ "name,extension,size",
+ "yo,pdf,50",
+ "jo,png,11500"
+ ],
+ "int64": null,
+ "float64": null,
+ }
+ }
+ }
+]
\ No newline at end of file
diff --git a/test/response/format/text/csv_requests_pre_process.json b/test/response/format/text/csv_requests_pre_process.json
new file mode 100644
index 00000000..031433bc
--- /dev/null
+++ b/test/response/format/text/csv_requests_pre_process.json
@@ -0,0 +1,28 @@
+{
+ "name": "Get existing CSV file, check content in text format",
+ "request": {
+ "server_url": {{ datastore "req_base_url" | marshal }},
+ "endpoint": "dummy.csv",
+ "method": "GET"
+ },
+ "response": {
+ "statuscode": 200,
+ "format": {
+ "type": "text",
+ "pre_process": {
+ "cmd": {
+ "name": "wc",
+ "args": [
+ "-c"
+ ]
+ }
+ }
+ },
+ "body": {
+ "text": "43\n",
+ "text_trimmed": "43",
+ "float64": 43,
+ "int64": 43,
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/response/format/text/manifest.json b/test/response/format/text/manifest.json
new file mode 100644
index 00000000..a48b7106
--- /dev/null
+++ b/test/response/format/text/manifest.json
@@ -0,0 +1,19 @@
+{{ $local_port:=":9999"}}
+{
+ "http_server": {
+ "addr": "{{ $local_port }}",
+ "dir": "../../../_res/assets",
+ "testmode": false
+ },
+ "store": {
+ "req_base_url": "http://localhost{{ $local_port }}"
+ },
+ "name": "Text format tests",
+ "tests": [
+ "@csv_requests.json"
+ ,"@xml_requests.json"
+ ,"@num_requests.json"
+ // format "text" with pre process
+ ,"@csv_requests_pre_process.json"
+ ]
+}
\ No newline at end of file
diff --git a/test/response/format/text/num_requests.json b/test/response/format/text/num_requests.json
new file mode 100644
index 00000000..c36dc9aa
--- /dev/null
+++ b/test/response/format/text/num_requests.json
@@ -0,0 +1,25 @@
+[
+ {
+ "name": "Get existing text file with numerical content, check content in text and parsed number format",
+ "request": {
+ "server_url": {{ datastore "req_base_url" | marshal }},
+ "endpoint": "number.txt",
+ "method": "GET"
+ },
+ "response": {
+ "statuscode": 200,
+ "format": {
+ "type": "text"
+ },
+ "body": {
+ "text": " 42.35\n",
+ "text_trimmed": "42.35",
+ "lines": [
+ " 42.35"
+ ],
+ "float64": 42.35,
+ "int64": 42,
+ }
+ }
+ }
+]
\ No newline at end of file
diff --git a/test/response/format/text/xml_requests.json b/test/response/format/text/xml_requests.json
new file mode 100644
index 00000000..2ae58bf2
--- /dev/null
+++ b/test/response/format/text/xml_requests.json
@@ -0,0 +1,66 @@
+[
+ {
+ "name": "Get existing xml file, check content in xml format",
+ "request": {
+ "server_url": {{ datastore "req_base_url" | marshal }},
+ "endpoint": "dummy.xml",
+ "method": "GET"
+ },
+ "response": {
+ "statuscode": 200,
+ "format": {
+ "type": "xml2"
+ },
+ "body": {
+ "files": {
+ "file": [
+ {
+ "extension": "pdf",
+ "name": "yo",
+ "size": "50"
+ },
+ {
+ "extension": "png",
+ "name": "jo",
+ "size": "11500"
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "name": "Get existing xml file, check content in text format",
+ "request": {
+ "server_url": {{ datastore "req_base_url" | marshal }},
+ "endpoint": "dummy.xml",
+ "method": "GET"
+ },
+ "response": {
+ "statuscode": 200,
+ "format": {
+ "type": "text"
+ },
+ "body": {
+ "text": "\n \n yo\n pdf\n 50\n \n \n jo\n png\n 11500\n \n\n",
+ "text_trimmed": "\n \n yo\n pdf\n 50\n \n \n jo\n png\n 11500\n \n",
+ "lines": [
+ "",
+ " ",
+ " yo",
+ " pdf",
+ " 50",
+ " ",
+ " ",
+ " jo",
+ " png",
+ " 11500",
+ " ",
+ ""
+ ],
+ "int64": null,
+ "float64": null,
+ }
+ }
+ }
+]
\ No newline at end of file
diff --git a/test/response/format/xhtml/check_local_file_against_response.json b/test/response/format/xhtml/check_local_file_against_response.json
index 0e6e1e79..7df4c673 100644
--- a/test/response/format/xhtml/check_local_file_against_response.json
+++ b/test/response/format/xhtml/check_local_file_against_response.json
@@ -2,7 +2,7 @@
{
"name": "Get existing XHTML file",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "bounce-json",
"method": "POST",
"body": {{ file_xhtml2json "sample.xhtml" }}
diff --git a/test/response/format/xhtml/check_response_format_xhtml.json b/test/response/format/xhtml/check_response_format_xhtml.json
index e8660d93..c8b01818 100644
--- a/test/response/format/xhtml/check_response_format_xhtml.json
+++ b/test/response/format/xhtml/check_response_format_xhtml.json
@@ -1,7 +1,7 @@
{
"name": "bounce XHTML file, use response format \"xhtml\"",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "bounce",
"method": "POST",
"body": {
diff --git a/test/response/format/xml/check_local_file_against_response.json b/test/response/format/xml/check_local_file_against_response.json
index 72bc8a65..b370304f 100644
--- a/test/response/format/xml/check_local_file_against_response.json
+++ b/test/response/format/xml/check_local_file_against_response.json
@@ -1,7 +1,7 @@
{
"name": "Get existing XML file",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "bounce-json",
"method": "POST",
"body": {{ file_xml2json "sample.xml" }}
diff --git a/test/response/format/xml/check_response_against_local_file.json b/test/response/format/xml/check_response_against_local_file.json
index b1012048..a93eb10f 100644
--- a/test/response/format/xml/check_response_against_local_file.json
+++ b/test/response/format/xml/check_response_against_local_file.json
@@ -1,7 +1,7 @@
{
"name": "Get existing XML file",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "bounce-json",
"method": "POST",
"body": {{ file "result_xml2.json" }}
diff --git a/test/response/format/xml/check_response_format_xml.json b/test/response/format/xml/check_response_format_xml.json
index 7a0a9eaf..caec4415 100644
--- a/test/response/format/xml/check_response_format_xml.json
+++ b/test/response/format/xml/check_response_format_xml.json
@@ -1,7 +1,7 @@
{
"name": "bounce xml file, use response format \"xml\"",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "bounce",
"method": "POST",
"body": {
diff --git a/test/response/format/xml/check_response_format_xml2.json b/test/response/format/xml/check_response_format_xml2.json
index 3066137d..2f368700 100644
--- a/test/response/format/xml/check_response_format_xml2.json
+++ b/test/response/format/xml/check_response_format_xml2.json
@@ -1,7 +1,7 @@
{
"name": "bounce xml file, use response format \"xml2\"",
"request": {
- "server_url": "{{ datastore "req_base_url" }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "bounce",
"method": "POST",
"body": {
diff --git a/test/response/format/xml/compare_exiftool_with_xml.json b/test/response/format/xml/compare_exiftool_with_xml.json
index 3e90d494..910035a4 100644
--- a/test/response/format/xml/compare_exiftool_with_xml.json
+++ b/test/response/format/xml/compare_exiftool_with_xml.json
@@ -2,7 +2,7 @@
"name": "preprocess asset berlin.jpg with exiftool in xml format, compare \"exiftool_result.xml\"",
"request": {
// load static file
- "server_url": "{{ datastore `req_base_url` }}",
+ "server_url": {{ datastore "req_base_url" | marshal }},
"endpoint": "berlin.jpg",
"method": "GET"
},
diff --git a/test/response/preprocess/load_static_files.json b/test/response/preprocess/load_static_files.json
index d0619094..4474cee9 100644
--- a/test/response/preprocess/load_static_files.json
+++ b/test/response/preprocess/load_static_files.json
@@ -2,7 +2,7 @@
{
"name": "test static endpoint (invalid file path)",
"request": {
- "server_url": "{{ datastore "local_url" }}",
+ "server_url": {{ datastore "local_url" | marshal }},
"endpoint": "wrong/path.jpg",
"method": "GET"
},
@@ -13,7 +13,7 @@
{
"name": "test static endpoint (serve static file relative to server directory)",
"request": {
- "server_url": "{{ datastore "local_url" }}",
+ "server_url": {{ datastore "local_url" | marshal }},
"endpoint": "camera.jpg",
"method": "GET"
},
diff --git a/test/response/preprocess/preprocess_bounce_exiftool_json.json b/test/response/preprocess/preprocess_bounce_exiftool_json.json
index 3beaf795..afe077eb 100644
--- a/test/response/preprocess/preprocess_bounce_exiftool_json.json
+++ b/test/response/preprocess/preprocess_bounce_exiftool_json.json
@@ -2,7 +2,7 @@
{
"name": "bounce (binary), pre_process exiftool",
"request": {
- "server_url": "{{ datastore "local_url" }}",
+ "server_url": {{ datastore "local_url" | marshal }},
"endpoint": "bounce",
"method": "POST",
"query_params": {
diff --git a/test/response/preprocess/preprocess_file_exiftool_json.json b/test/response/preprocess/preprocess_file_exiftool_json.json
index 8c99224e..42abe634 100644
--- a/test/response/preprocess/preprocess_file_exiftool_json.json
+++ b/test/response/preprocess/preprocess_file_exiftool_json.json
@@ -3,7 +3,7 @@
"name": "preprocess asset camera.jpg with exiftool in json format",
"request": {
// load static file
- "server_url": "{{ datastore "local_url" }}",
+ "server_url": {{ datastore "local_url" | marshal }},
"endpoint": "camera.jpg",
"method": "GET"
},
diff --git a/test/response/preprocess/preprocess_file_exiftool_xml.json b/test/response/preprocess/preprocess_file_exiftool_xml.json
index 55c58499..95b21187 100644
--- a/test/response/preprocess/preprocess_file_exiftool_xml.json
+++ b/test/response/preprocess/preprocess_file_exiftool_xml.json
@@ -3,7 +3,7 @@
"name": "preprocess asset camera.jpg with exiftool in xml format",
"request": {
// load static file
- "server_url": "{{ datastore "local_url" }}",
+ "server_url": {{ datastore "local_url" | marshal }},
"endpoint": "camera.jpg",
"method": "GET"
},