Skip to content

Commit baf042c

Browse files
phrfpeixotop1c2u
authored andcommitted
Creating tests that comply with readOnly and writeOnly specifications
1 parent b6fdd64 commit baf042c

File tree

3 files changed

+167
-0
lines changed

3 files changed

+167
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
openapi: "3.0.0"
2+
info:
3+
title: Specification Containing readOnly
4+
version: "0.1"
5+
paths:
6+
/users:
7+
post:
8+
operationId: createUser
9+
requestBody:
10+
description: Post data for creating a user
11+
required: true
12+
content:
13+
application/json:
14+
schema:
15+
$ref: '#/components/schemas/User'
16+
responses:
17+
default:
18+
description: Create a user
19+
content:
20+
application/json:
21+
schema:
22+
$ref: '#/components/schemas/User'
23+
components:
24+
schemas:
25+
User:
26+
type: object
27+
required:
28+
- id
29+
- name
30+
properties:
31+
id:
32+
type: integer
33+
format: int32
34+
readOnly: true
35+
name:
36+
type: string
37+
hidden:
38+
type: boolean
39+
writeOnly: true

tests/integration/test_read_only.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import json
2+
3+
import pytest
4+
5+
from openapi_core.schema.media_types.exceptions import InvalidMediaTypeValue
6+
from openapi_core.schema.schemas.enums import UnmarshalContext
7+
from openapi_core.schema.schemas.exceptions import InvalidSchemaProperty
8+
from openapi_core.shortcuts import create_spec
9+
from openapi_core.validation.response.validators import ResponseValidator
10+
from openapi_core.validation.request.validators import RequestValidator
11+
from openapi_core.wrappers.mock import MockRequest, MockResponse
12+
13+
14+
@pytest.fixture
15+
def response_validator(spec):
16+
return ResponseValidator(spec)
17+
18+
19+
@pytest.fixture
20+
def request_validator(spec):
21+
return RequestValidator(spec)
22+
23+
24+
@pytest.fixture('class')
25+
def spec(factory):
26+
spec_dict = factory.spec_from_file("data/v3.0/read_only_write_only.yaml")
27+
return create_spec(spec_dict)
28+
29+
30+
class TestReadOnly(object):
31+
32+
def test_write_a_read_only_property(self, request_validator):
33+
data = json.dumps({
34+
'id': 10,
35+
'name': "Pedro"
36+
})
37+
38+
request = MockRequest(host_url='', method='POST',
39+
path='/users', data=data)
40+
41+
with pytest.raises(InvalidMediaTypeValue) as ex:
42+
request_validator.validate(request).raise_for_errors()
43+
assert isinstance(ex.value.original_exception, InvalidSchemaProperty)
44+
ex = ex.value.original_exception
45+
46+
assert ex.property_name == 'id'
47+
assert UnmarshalContext.REQUEST.value in str(ex.original_exception)
48+
49+
def test_read_only_property_response(self, response_validator):
50+
data = json.dumps({
51+
'id': 10,
52+
'name': "Pedro"
53+
})
54+
55+
request = MockRequest(host_url='', method='POST',
56+
path='/users')
57+
58+
response = MockResponse(data)
59+
60+
is_valid = response_validator.validate(request, response)
61+
is_valid.raise_for_errors()
62+
63+
assert len(is_valid.errors) == 0
64+
assert is_valid.data.id == 10
65+
assert is_valid.data.name == "Pedro"

tests/integration/test_write_only.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import json
2+
3+
import pytest
4+
5+
from openapi_core.schema.media_types.exceptions import InvalidMediaTypeValue
6+
from openapi_core.schema.schemas.enums import UnmarshalContext
7+
from openapi_core.schema.schemas.exceptions import InvalidSchemaProperty
8+
from openapi_core.shortcuts import create_spec
9+
from openapi_core.validation.response.validators import ResponseValidator
10+
from openapi_core.validation.request.validators import RequestValidator
11+
from openapi_core.wrappers.mock import MockRequest, MockResponse
12+
13+
14+
@pytest.fixture
15+
def response_validator(spec):
16+
return ResponseValidator(spec)
17+
18+
19+
@pytest.fixture
20+
def request_validator(spec):
21+
return RequestValidator(spec)
22+
23+
24+
@pytest.fixture('class')
25+
def spec(factory):
26+
spec_dict = factory.spec_from_file("data/v3.0/read_only_write_only.yaml")
27+
return create_spec(spec_dict)
28+
29+
30+
class TestWriteOnly(object):
31+
32+
def test_write_only_property(self, request_validator):
33+
data = json.dumps({
34+
'name': "Pedro",
35+
'hidden': False
36+
})
37+
38+
request = MockRequest(host_url='', method='POST',
39+
path='/users', data=data)
40+
41+
is_valid = request_validator.validate(request)
42+
is_valid.raise_for_errors()
43+
assert is_valid.body.name == "Pedro"
44+
assert is_valid.body.hidden is False
45+
46+
def test_read_a_write_only_property(self, response_validator):
47+
data = json.dumps({
48+
'id': 10,
49+
'name': "Pedro",
50+
'hidden': True
51+
})
52+
53+
request = MockRequest(host_url='', method='POST',
54+
path='/users')
55+
response = MockResponse(data)
56+
57+
with pytest.raises(InvalidMediaTypeValue) as ex:
58+
response_validator.validate(request, response).raise_for_errors()
59+
assert isinstance(ex.value.original_exception, InvalidSchemaProperty)
60+
ex = ex.value.original_exception
61+
62+
assert ex.property_name == 'hidden'
63+
assert UnmarshalContext.RESPONSE.value in str(ex.original_exception)

0 commit comments

Comments
 (0)