Skip to content

Commit b160d07

Browse files
committed
Test both Swagger and OpenAPI on precommit
1 parent c0cdc6b commit b160d07

2 files changed

Lines changed: 45 additions & 2 deletions

File tree

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,14 @@ repos:
4545

4646
- id: test-swagger-2
4747
name: Test Swagger 2.0 Petstore
48-
entry: cargo run -p cdd-cli -- from_openapi to_sdk -i ../petstore.json -o ./target/petstore2
48+
entry: bash scripts/test_sdk.sh ../petstore.json ./target/petstore2
4949
language: system
5050
pass_filenames: false
5151
types: [rust]
5252

5353
- id: test-openapi-3
5454
name: Test OpenAPI 3.2.0 Petstore
55-
entry: cargo run -p cdd-cli -- from_openapi to_sdk -i ../petstore_oas3.json -o ./target/petstore3
55+
entry: bash scripts/test_sdk.sh ../petstore_oas3.json ./target/petstore3
5656
language: system
5757
pass_filenames: false
5858
types: [rust]

scripts/test_sdk.sh

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#!/bin/bash
2+
set -e
3+
SPEC_FILE=$1
4+
OUTPUT_DIR=$2
5+
if [ -z "$SPEC_FILE" ] || [ -z "$OUTPUT_DIR" ]; then exit 1; fi
6+
export DOCKER_HOST="unix:///Users/samuel/.colima/default/docker.sock"
7+
PORT=`python3 -c "import random; print(random.randint(8000, 9000))"`
8+
CONTAINER_NAME="python-mock-$PORT"
9+
cleanup() { /opt/homebrew/bin/docker rm -f $CONTAINER_NAME >/dev/null 2>&1 || true; rm -f $PWD/mock_server_$PORT.py; }
10+
trap cleanup EXIT
11+
cat << "PYEOF" > $PWD/mock_server_$PORT.py
12+
from http.server import HTTPServer, BaseHTTPRequestHandler
13+
import sys
14+
port = int(sys.argv[1])
15+
class MockHandler(BaseHTTPRequestHandler):
16+
def log_message(self, format, *args): pass
17+
def do_GET(self): self.mock()
18+
def do_POST(self): self.mock()
19+
def do_PUT(self): self.mock()
20+
def do_DELETE(self): self.mock()
21+
def mock(self):
22+
self.send_response(200)
23+
self.send_header("Content-Type", "application/json")
24+
self.end_headers()
25+
path = self.path
26+
if "findByStatus" in path or "findByTags" in path or "createWithList" in path or "createWithArray" in path:
27+
if "pet" in path: self.wfile.write(b"[{\"name\": \"mocked\", \"photoUrls\": []}]")
28+
else: self.wfile.write(b"[]")
29+
else:
30+
if "pet" in path: self.wfile.write(b"{\"name\": \"mocked\", \"photoUrls\": []}")
31+
elif "user/login" in path: self.wfile.write(b"\"token\"")
32+
else: self.wfile.write(b"{}")
33+
if __name__ == "__main__": HTTPServer(("", port), MockHandler).serve_forever()
34+
PYEOF
35+
/opt/homebrew/bin/docker run -d --name $CONTAINER_NAME -p $PORT:$PORT -v "$PWD/mock_server_$PORT.py:/mock_server.py" python:3 python /mock_server.py $PORT >/dev/null
36+
sleep 3
37+
rm -rf $OUTPUT_DIR
38+
cargo run -p cdd-cli -- from_openapi to_sdk -i $SPEC_FILE -o $OUTPUT_DIR --target client-reqwest --tests >/dev/null 2>&1
39+
echo "[workspace]" >> $OUTPUT_DIR/Cargo.toml
40+
sed -i "" "s/localhost:8080/localhost:$PORT/g" $OUTPUT_DIR/tests/api_contracts.rs
41+
cd $OUTPUT_DIR
42+
if ! cargo test >/dev/null 2>&1; then echo "Test failed for $SPEC_FILE"; cargo test; exit 1; fi
43+
cd - >/dev/null

0 commit comments

Comments
 (0)