Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More backward compatibility for JSON path features #25

Merged
merged 11 commits into from
Oct 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 40 additions & 20 deletions examples/backward-compatible/specs/compatible_http.cpt
Original file line number Diff line number Diff line change
Expand Up @@ -80,32 +80,52 @@
* メディアタイプ"application/json"で
* リクエストを送る

# レスポンスのJSONの<jsonPath>が<pattern>である
* レスポンスのボディが
* JSONのパス<jsonPath>に対応する値が
* 正規表現の<pattern>に完全一致している

レスポンスのJSONの<jsonPath>が<pattern>である
レスポンスのJSONの<jsonPath>がnullである
レスポンスのJSONの<jsonPath>が小数の<expected>である
レスポンスのJSONの<jsonPath>が真偽値の<expected>である
レスポンスのJSONの<jsonPath>が真偽値のfalseである
レスポンスのJSONの<jsonPath>が真偽値のtrueである
レスポンスのJSONの<jsonPath>が整数の<expected>である
レスポンスのJSONの<jsonPath>が存在しない
レスポンスのJSONの<jsonPath>が文字列の<expected>である
レスポンスのJSONの<jsonPath>の配列に、Key<key>の値が<value>である要素が存在する
レスポンスのJSONの<jsonPath>の配列の、UniqueKey<uniqueKey>の値が<filterValue>である要素の<key>が、小数値の<expected>である
レスポンスのJSONの<jsonPath>の配列の、UniqueKey<uniqueKey>の値が<filterValue>である要素の<key>が、真偽値の<expected>である
レスポンスのJSONの<jsonPath>の配列の、UniqueKey<uniqueKey>の値が<filterValue>である要素の<key>が、整数値の<expected>である
レスポンスのJSONの<jsonPath>の配列の、UniqueKey<uniqueKey>の値が<filterValue>である要素の<key>が、文字列の<expected>である
レスポンスのJSONの<jsonPath>の配列の長さが<length>である

# レスポンスのJSONの<jsonPath>が小数の<expected>である
* レスポンスのボディが
* JSONのパス<jsonPath>に対応する値が
* 小数値の<expected>である

# レスポンスのJSONの<jsonPath>が真偽値の<expected>である
* レスポンスのボディが
* JSONのパス<jsonPath>に対応する値が
* 真偽値の<expected>である

# レスポンスのJSONの<jsonPath>が真偽値のfalseである
* レスポンスのボディが
* JSONのパス<jsonPath>に対応する値が
* 偽である

# レスポンスのJSONの<jsonPath>が真偽値のtrueである
* レスポンスのボディが
* JSONのパス<jsonPath>に対応する値が
* 真である

# レスポンスのJSONの<jsonPath>が整数の<expected>である
* レスポンスのボディが
* JSONのパス<jsonPath>に対応する値が
* 整数値の<expected>である

# レスポンスのJSONの<jsonPath>が存在しない
* レスポンスのボディが
* JSONのパス<jsonPath>に対応する値が
* 存在していない

# レスポンスのJSONの<jsonPath>が文字列の<expected>である
* レスポンスのボディが
* JSONのパス<jsonPath>に対応する値が
* 文字列の<expected>である

レスポンスのJSONの配列<arrayJsonPath>が、タイムゾーン付きの日付/時間<orderKey>の降順に並んでいる
レスポンスのJSONの配列<arrayJsonPath>が、タイムゾーン付きの日付/時間<orderKey>の昇順に並んでいる
レスポンスのJSONの配列<arrayJsonPath>が、数値<orderKey>の降順に並んでいる
レスポンスのJSONの配列<arrayJsonPath>が、数値<orderKey>の昇順に並んでいる
レスポンスのJSONの配列<jsonPath>に、小数値<value>が存在しない
レスポンスのJSONの配列<jsonPath>に、小数値<value>が存在する
レスポンスのJSONの配列<jsonPath>に、整数値<value>が存在しない
レスポンスのJSONの配列<jsonPath>に、整数値<value>が存在する
レスポンスのJSONの配列<jsonPath>に、文字列<value>が存在しない
レスポンスのJSONの配列<jsonPath>に、文字列<value>が存在する

# レスポンスステータスコードが<statusCode>である
* レスポンスのステータスコードが
Expand Down
47 changes: 47 additions & 0 deletions examples/backward-compatible/specs/compatible_http.spec
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,53 @@
* URL"/dogeWithHeader"にヘッダー"name: kabosu"で、DELETEリクエストを送る
* レスポンスステータスコードが"204"である

## レスポンスのJSONの<jsonPath>が<pattern>である
* URL"/bigBallOfMud"にGETリクエストを送る
* レスポンスのJSONの"$.name"が"B\\w{2} B\\w{3} of M\\w{2}"である

レスポンスのJSONの<jsonPath>がnullである

## レスポンスのJSONの<jsonPath>が小数の<expected>である
* URL"/bigBallOfMud"にGETリクエストを送る
* レスポンスのJSONの"version"が小数の"1.3"である

## レスポンスのJSONの<jsonPath>が真偽値の<expected>である
* URL"/bigBallOfMud"にGETリクエストを送る
* レスポンスのJSONの"$.primes[0]"が真偽値の"false"である
* レスポンスのJSONの"$.primes[1]"が真偽値の"true"である

## レスポンスのJSONの<jsonPath>が真偽値のfalseである
* URL"/bigBallOfMud"にGETリクエストを送る
* レスポンスのJSONの"$.primes[0]"が真偽値のfalseである

## レスポンスのJSONの<jsonPath>が真偽値のtrueである
* URL"/bigBallOfMud"にGETリクエストを送る
* レスポンスのJSONの"$.primes[1]"が真偽値のtrueである

## レスポンスのJSONの<jsonPath>が整数の<expected>である
* URL"/bigBallOfMud"にGETリクエストを送る
* レスポンスのJSONの"$.serialNumber"が整数の"42"である

## レスポンスのJSONの<jsonPath>が存在しない
* URL"/bigBallOfMud"にGETリクエストを送る
* レスポンスのJSONの"$.__should_not_be_exist__"が存在しない

## レスポンスのJSONの<jsonPath>が文字列の<expected>である
* URL"/bigBallOfMud"にGETリクエストを送る
* レスポンスのJSONの"$.name"が文字列の"Big Ball of Mud"である

レスポンスのJSONの<jsonPath>の配列に、Key<key>の値が<value>である要素が存在する
レスポンスのJSONの<jsonPath>の配列の、UniqueKey<uniqueKey>の値が<filterValue>である要素の<key>が、小数値の<expected>である
レスポンスのJSONの<jsonPath>の配列の、UniqueKey<uniqueKey>の値が<filterValue>である要素の<key>が、真偽値の<expected>である
レスポンスのJSONの<jsonPath>の配列の、UniqueKey<uniqueKey>の値が<filterValue>である要素の<key>が、整数値の<expected>である
レスポンスのJSONの<jsonPath>の配列の、UniqueKey<uniqueKey>の値が<filterValue>である要素の<key>が、文字列の<expected>である
レスポンスのJSONの<jsonPath>の配列の長さが<length>である
レスポンスのJSONの配列<arrayJsonPath>が、タイムゾーン付きの日付/時間<orderKey>の降順に並んでいる
レスポンスのJSONの配列<arrayJsonPath>が、タイムゾーン付きの日付/時間<orderKey>の昇順に並んでいる
レスポンスのJSONの配列<arrayJsonPath>が、数値<orderKey>の降順に並んでいる
レスポンスのJSONの配列<arrayJsonPath>が、数値<orderKey>の昇順に並んでいる


## レスポンスステータスコードが<statusCode>である
* URL"/ping"にGETリクエストを送る
* レスポンスステータスコードが"200"である
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"request": {
"method": "GET",
"urlPath": "/bigBallOfMud"
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"jsonBody": {
"name": "Big Ball of Mud",
"serialNumber": 42,
"version": 1.3,
"primes": [false, true, true, true, false, true]
}
}
}
2 changes: 1 addition & 1 deletion examples/simple-api-test/specs/example.spec
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

## Assert response headers
* レスポンスのヘッダーの
* キー"Content-Length"に対応する値が
* キー"content-length"に対応する値が
* 文字列の"25"である

## Assert response headers contains some value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,22 @@ internal inline fun <reified T> assertable(f: (T) -> Unit) =
ScenarioDataStore.get(K.AssertionTarget)
.let { it as? T }
?.let(f)
?: playtestException("Assertion target is not found")
?: playtestError("Assertion target is not found")

internal fun test(message: String, assertExp: () -> Boolean) {
if (!assertExp()) throw PlaytestException(message)
if (!assertExp()) throw PlaytestAssertionError(message)
}

class AssertionSteps {

@Step("小数値の<value>である")
fun shouldBeBigDecimal(value: Double) =
assertable<ShouldBeBigDecimal> {
test("should be $value") {
it.shouldBe(value.toBigDecimal())
}
}

@Step("整数値の<value>である")
fun shouldBeLongValue(value: Long) =
assertable<ShouldBeLong> {
Expand Down Expand Up @@ -48,6 +56,22 @@ class AssertionSteps {
}
}

@Step("正規表現の<value>に完全一致している")
fun shouldBeEntireMatchStringValue(value: String) =
assertable<ShouldMatchString> {
test("should match $value") {
it.shouldMatch(value)
}
}

@Step("真偽値の<value>である")
fun shouldBeBooleanValue(value: Boolean) =
assertable<ShouldBeBoolean> {
test("should be $value") {
it.shouldBe(value)
}
}

@Step("真である")
fun shouldBeTrue() =
assertable<ShouldBeBoolean> {
Expand All @@ -63,4 +87,20 @@ class AssertionSteps {
it.shouldBe(false)
}
}

@Step("存在している")
fun shouldBeExist() =
assertable<ShouldBeExist> {
test("should be exist") {
it.shouldBeExist()
}
}

@Step("存在していない")
fun shouldNotBeExist() =
assertable<ShouldNotBeExist> {
test("should not be exist") {
it.shouldNotBeExist()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.uzabase.playtest2.core
import com.thoughtworks.gauge.datastore.ScenarioDataStore
import com.thoughtworks.gauge.datastore.SpecDataStore
import com.thoughtworks.gauge.datastore.SuiteDataStore
import com.uzabase.playtest2.core.assertion.playtestException
import com.uzabase.playtest2.core.assertion.playtestError

object AnyStore {
inline fun <reified T> getAs(key: Any): T? =
Expand All @@ -16,7 +16,7 @@ object ScenarioDataStoreExt {
try {
v as T
} catch (e: ClassCastException) {
playtestException(
playtestError(
"""
|ScenarioDataStore does not contain key `$key` as `${T::class.simpleName}`.
|Actual:
Expand All @@ -41,7 +41,7 @@ object SpecDataStoreExt {
try {
v as T
} catch (e: ClassCastException) {
playtestException(
playtestError(
"""
|SpecDataStore does not contain key `$key` as `${T::class.simpleName}`.
|Actual:
Expand All @@ -59,7 +59,7 @@ object SuiteDataStoreExt {
try {
v as T
} catch (e: ClassCastException) {
playtestException(
playtestError(
"""
|SuiteDataStore does not contain key `$key` as `${T::class.simpleName}`.
|Actual:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.uzabase.playtest2.core

import com.thoughtworks.gauge.Step
import com.thoughtworks.gauge.datastore.ScenarioDataStore
import com.uzabase.playtest2.core.zoom.AsAssociative

class ZoomAssociativeSteps {
@Step("キー<key>に対応する値が")
fun zoomAssociative(key: String) {
ScenarioDataStoreExt.ensureGet<AsAssociative>(K.AssertionTarget)
.asAssociative(key)
.also { ScenarioDataStore.put(K.AssertionTarget, it) }
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.uzabase.playtest2.core.assertion

fun interface ShouldBeBoolean {
fun shouldBe(expected: Boolean): Boolean
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
package com.uzabase.playtest2.core.assertion

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.uzabase.playtest2.core.assertion

fun interface ShouldBeExist {
fun shouldBeExist(): Boolean
}

fun interface ShouldNotBeExist {
fun shouldNotBeExist(): Boolean
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.uzabase.playtest2.core.assertion

import java.math.BigDecimal

fun interface ShouldBeLong {
fun shouldBe(expected: Long): Boolean
}

fun interface ShouldBeGreaterEqualLong {
fun shouldBeGreaterEqual(expected: Long): Boolean
}

fun interface ShouldBeBigDecimal {
fun shouldBe(expected: BigDecimal): Boolean
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.uzabase.playtest2.core.assertion

fun interface ShouldBeString {
fun shouldBe(expected: String): Boolean
}

fun interface ShouldContainsString {
fun shouldContain(expected: String): Boolean
}

fun interface ShouldMatchString {
fun shouldMatch(expected: String): Boolean
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.uzabase.playtest2.core.assertion

fun interface ShouldBe<T> {
fun shouldBe(expected: T): Boolean
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.uzabase.playtest2.core.assertion

class PlaytestAssertionError(override val message: String) : AssertionError(message)

fun playtestError(message: String): Nothing = throw PlaytestAssertionError(message)

This file was deleted.

Loading