Skip to content

Commit d417f8b

Browse files
committed
Upgrade approvaltests to 7.4.0 and manage class in module
1 parent 3826552 commit d417f8b

6 files changed

+113
-32
lines changed

docker/python_libs.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
pytest==6.2.5
2-
approvaltests==2.2.0
2+
approvaltests==7.4.0
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
= ClassDemo
2+
3+
4+
The class description.
5+
6+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
= First chapter in a class
2+
3+
The description of the chapter within a class.
4+
5+
Write the expected content here.

docs/test_demo_with_approvals.approved.adoc

+2
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ This file is an example of using doc as test with pytest.
44
include::test_demo_with_approvals.test_first_chapter.approved.adoc[leveloffset=+1]
55
include::test_demo_with_approvals.test_second_chapter.approved.adoc[leveloffset=+1]
66
include::test_demo_with_approvals.test_third_chapter.approved.adoc[leveloffset=+1]
7+
include::test_demo_with_approvals.TestClassDemo.approved.adoc[leveloffset=+1]
8+
include::test_demo_with_approvals.TestClassDemo.test_first_chapter_in_a_class.approved.adoc[leveloffset=+2]

src/doc_as_test_pytest.py

+86-30
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import json
22
import os
33
import pytest
4-
from approvaltests.pytest.namer import Namer
4+
import textwrap
5+
from approvaltests.pytest.py_test_namer import PyTestNamer
56
from approvaltests.approvals import verify
67

78

@@ -12,18 +13,36 @@ def doc(request, doc_module):
1213

1314
doc_module.verify_function(request)
1415

16+
@pytest.fixture(scope="class")
17+
def doc_class(request, doc_module):
18+
19+
doc_module.verify_class(request)
20+
doc_module.increment_leveloffset()
21+
yield doc_module
22+
doc_module.decrement_leveloffset()
23+
24+
1525
@pytest.fixture(scope="module")
1626
def doc_module(request):
1727
doc = DocAsTest()
1828

29+
doc.increment_leveloffset()
1930
yield doc
2031

2132
doc.verify_module(request)
33+
doc.decrement_leveloffset()
2234

2335
class DocAsTest():
2436
def __init__(self):
2537
self.content = ""
26-
self.tests = []
38+
self.test_includes = []
39+
self.leveloffset = 0
40+
41+
def increment_leveloffset(self):
42+
self.leveloffset += 1
43+
44+
def decrement_leveloffset(self):
45+
self.leveloffset -= 1
2746

2847
def format_to_title(self, name):
2948
title = name[len("test_"):]
@@ -35,24 +54,33 @@ def module_content(self, request, description):
3554
file_base_name = os.path.splitext(os.path.basename(request.node.name))[0]
3655
title = self.format_to_title(file_base_name)
3756

38-
includes = "\n".join("include::{}[leveloffset=+1]".format(test) for test in self.tests)
57+
includes = "\n".join(test for test in self.test_includes)
3958

4059
description_to_add = description.strip() + "\n\n" if description is not None else ""
4160

4261
return "= " + title + "\n" + description_to_add + includes
4362

63+
def class_content(self, request, description):
64+
title = request.cls.__name__[len("Test"):]
65+
title = "= " + title +"\n\n"
66+
67+
description_to_add = textwrap.dedent(description) +"\n\n" if description != None else ""
68+
69+
return title + description_to_add
70+
4471
def test_content(self, request, description):
4572

4673
title = self.format_to_title(request.node.name)
4774
title = "= " + title +"\n\n"
4875

49-
description = description.strip() +"\n\n" if description != None else ""
76+
description_to_add = description.strip() +"\n\n" if description != None else ""
5077

51-
return title + description + self.content
78+
return title + description_to_add + self.content
5279

5380

5481
def register_test(self, namer):
55-
self.tests.append(namer.get_approved_filename(namer.get_file_name()))
82+
test = namer.get_approved_filename(namer.get_file_name())
83+
self.test_includes.append("include::{}[leveloffset=+{}]".format(test, self.leveloffset))
5684

5785
def write(self, text):
5886
self.content = self.content + text
@@ -61,12 +89,8 @@ def write(self, text):
6189
def verify_function(self, request):
6290

6391
namer = DocAsTestFunctionNamer(request)
64-
65-
class_name = namer.get_class_name()
66-
test_name = namer.get_method_name()
6792

68-
test_module = __import__(class_name)
69-
description = getattr(test_module, test_name).__doc__
93+
description = request.function.__doc__
7094

7195
self.register_test(namer)
7296
content_to_verify = self.test_content(request, description)
@@ -76,36 +100,43 @@ def verify_function(self, request):
76100
namer=namer
77101
)
78102

103+
104+
def verify_class(self, request):
105+
namer = DocAsTestClassNamer(request)
106+
107+
description = textwrap.dedent(request.cls.__doc__)
108+
109+
self.register_test(namer)
110+
111+
content_to_verify = self.class_content(request, description)
112+
113+
self.content = ""
114+
verify(
115+
content_to_verify,
116+
namer=namer
117+
)
118+
119+
79120
def verify_module(self, request):
80121
namer = DocAsTestModuleNamer(request)
81122

82-
class_name = namer.get_class_name()
83-
test_module = __import__(class_name)
84-
description = test_module.__doc__
123+
description = request.module.__doc__
85124

86125
verify(
87126
self.module_content(request, description),
88127
namer = namer
89128
)
90129

91-
class DocAsTestNamer(Namer):
130+
class DocAsTestNamer(PyTestNamer):
92131
Directory = ''
93-
MethodName = ''
94-
ClassName = ''
132+
ModuleName = ''
95133

96134
def __init__(self, request):
97-
Namer.__init__(self, ".adoc")
135+
PyTestNamer.__init__(self, request, ".adoc")
98136
self.config = None
99-
self.MethodName = request.node.name
100-
self.ClassName = os.path.splitext(request.fspath.basename)[0]
137+
self.ModuleName = request.module.__name__
101138
self.Directory = request.fspath.dirname
102-
103-
def get_class_name(self):
104-
return self.ClassName
105-
106-
def get_method_name(self):
107-
return self.MethodName
108-
139+
109140
def get_directory(self):
110141
return os.path.join(self.Directory, "../docs")
111142

@@ -126,12 +157,37 @@ def get_config(self):
126157

127158
class DocAsTestFunctionNamer(DocAsTestNamer):
128159

160+
MethodName = ''
161+
ClassName = ''
162+
def __init__(self, request):
163+
super().__init__(request)
164+
165+
self.MethodName = request.function.__name__
166+
self.ClassName = None if request.cls is None else request.cls.__name__
167+
129168
def get_file_name(self):
130-
class_name = "" if (self.ClassName is None) else (self.ClassName + ".")
131-
return class_name + self.MethodName
169+
class_name = "" if (self.ClassName is None) else ("." + self.ClassName)
170+
return self.ModuleName + class_name + "." + self.MethodName
171+
172+
def get_method_name(self):
173+
return self.MethodName
174+
175+
def get_class_name(self):
176+
return self.ClassName
132177

178+
class DocAsTestClassNamer(DocAsTestNamer):
179+
ClassName = ''
180+
def __init__(self, request):
181+
super().__init__(request)
133182

183+
self.ClassName = request.cls.__name__
184+
185+
def get_file_name(self):
186+
return self.ModuleName + "." + self.ClassName
187+
188+
def get_class_name(self):
189+
return self.ClassName
134190
class DocAsTestModuleNamer(DocAsTestNamer):
135191

136192
def get_file_name(self):
137-
return self.ClassName
193+
return self.ModuleName

src/test_demo_with_approvals.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""
44
import os
55
import pytest
6-
from doc_as_test_pytest import DocAsTest, doc, doc_module
6+
from doc_as_test_pytest import DocAsTest, doc, doc_class, doc_module
77

88

99

@@ -26,3 +26,15 @@ def test_second_chapter(doc):
2626
def test_third_chapter(doc):
2727

2828
doc.write("Nothing new for this third chapter")
29+
30+
@pytest.mark.usefixtures("doc_class")
31+
class TestClassDemo:
32+
"""
33+
The class description.
34+
"""
35+
def test_first_chapter_in_a_class(self, doc):
36+
"""
37+
The description of the chapter within a class.
38+
"""
39+
40+
doc.write("Write the expected content here.")

0 commit comments

Comments
 (0)