-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathtest_api_fuzzing.py
85 lines (71 loc) · 2.19 KB
/
test_api_fuzzing.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from typing import List
from urllib.parse import urljoin
import pytest
import schemathesis
from hypothesis import settings
from schemathesis import Case, DataGenerationMethod
@pytest.fixture
def run_test_server(live_server, settings):
settings.ROOT_URLCONF = "tests.fuzzing_urls"
schema_url = urljoin(live_server.url, "/schema/")
return schemathesis.from_uri(schema_url)
schema = schemathesis.from_pytest_fixture("run_test_server")
@schemathesis.hook
def before_add_examples(
context: schemathesis.hooks.HookContext,
examples: List[Case],
) -> None:
if context.operation.path == "/fuzzing/list_field/":
case = Case(
context.operation,
0.01,
body={"field1": [None]},
media_type="application/json",
)
examples.append(case)
if context.operation.path == "/fuzzing/dict_field/":
case = Case(
context.operation,
0.01,
body={"field1": {"my_int": "non_integer_value"}},
media_type="application/json",
)
examples.append(case)
if context.operation.path == "/fuzzing/list_serializer/":
case = Case(
context.operation,
0.01,
body={"field1": [{"field2": None}]},
media_type="application/json",
)
examples.append(case)
@schema.parametrize(
endpoint="fuzzing/list_field/",
data_generation_methods=[
DataGenerationMethod.negative,
DataGenerationMethod.positive,
],
)
@settings(max_examples=100)
def test_compliance_to_api_schema_for_list_field(case):
case.call_and_validate()
@schema.parametrize(
endpoint="fuzzing/list_serializer/",
data_generation_methods=[
DataGenerationMethod.negative,
DataGenerationMethod.positive,
],
)
@settings(max_examples=100)
def test_compliance_to_api_schema_for_list_serializer(case):
case.call_and_validate()
@schema.parametrize(
endpoint="fuzzing/dict_field/",
data_generation_methods=[
DataGenerationMethod.negative,
DataGenerationMethod.positive,
],
)
@settings(max_examples=100)
def test_compliance_to_api_schema_for_dict_field(case):
case.call_and_validate()