1
1
"""PyTest Fixtures"""
2
- import logging
3
2
import os
3
+ from typing import Type
4
4
import pytest
5
+ import jinja2
5
6
6
7
from pyodata .config import Config
8
+ from pyodata .version import ODATAVersion
7
9
from pyodata .model .builder import MetadataBuilder
8
- from pyodata .v2 import ODataV2
9
10
from pyodata .v4 import ODataV4
11
+ from pyodata .v2 import ODataV2
10
12
11
13
12
- @pytest .fixture
13
- def metadata_v2 ():
14
- return metadata ('metadata.xml' )
15
-
16
-
17
- @pytest .fixture
18
- def metadata_v4 ():
19
- return metadata ('metadata_v4.xml' )
20
-
21
-
22
- def metadata (file_name : str ):
23
- """Example OData metadata"""
14
+ def _path_to_file (file_name ):
24
15
path_to_current_file = os .path .realpath (__file__ )
25
16
current_directory = os .path .split (path_to_current_file )[0 ]
26
- path_to_file = os .path .join (current_directory , file_name )
27
-
28
- return open (path_to_file , 'rb' ).read ()
17
+ return os .path .join (current_directory , file_name )
29
18
30
19
31
20
@pytest .fixture
32
- def xml_builder_factory ():
33
- """Skeleton OData metadata"""
34
-
35
- class XMLBuilder :
36
- """Helper class for building XML metadata document"""
37
-
38
- # pylint: disable=too-many-instance-attributes,line-too-long
39
- def __init__ (self ):
40
- self .reference_is_enabled = True
41
- self .data_services_is_enabled = True
42
- self .schema_is_enabled = True
43
-
44
- self .namespaces = {
45
- 'edmx' : "http://schemas.microsoft.com/ado/2007/06/edmx" ,
46
- 'sap' : 'http://www.sap.com/Protocols/SAPData' ,
47
- 'edm' : 'http://schemas.microsoft.com/ado/2008/09/edm' ,
48
- 'm' : 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' ,
49
- 'd' : 'http://schemas.microsoft.com/ado/2007/08/dataservices' ,
50
- }
51
-
52
- self .custom_edmx_prologue = None
53
- self .custom_edmx_epilogue = None
54
-
55
- self .custom_data_services_prologue = None
56
- self .custom_data_services_epilogue = None
57
-
58
- self ._reference = '\n <edmx:Reference xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Uri="https://example.sap.corp/sap/opu/odata/IWFND/CATALOGSERVICE;v=2/Vocabularies(TechnicalName=\' %2FIWBEP%2FVOC_COMMON\' ,Version=\' 0001\' ,SAP__Origin=\' LOCAL\' )/$value">' + \
59
- '\n <edmx:Include Namespace="com.sap.vocabularies.Common.v1" Alias="Common"/>' + \
60
- '\n </edmx:Reference>'
61
-
62
- self ._schemas = ''
63
-
64
- def add_schema (self , namespace , xml_definition ):
65
- """Add schema element"""
66
- self ._schemas += f""""\n <Schema xmlns:d="{ self .namespaces ["d" ]} " xmlns:m="{ self .namespaces ["m" ]} " xmlns="{
67
- self .namespaces ["edm" ]} " Namespace="{ namespace } " xml:lang="en" sap:schema-version="1">"""
68
- self ._schemas += "\n " + xml_definition
69
- self ._schemas += '\n </Schema>'
70
-
71
- def serialize (self ):
72
- """Returns full metadata XML document"""
73
- result = self ._edmx_prologue ()
74
-
75
- if self .reference_is_enabled :
76
- result += self ._reference
77
-
78
- if self .data_services_is_enabled :
79
- result += self ._data_services_prologue ()
80
-
81
- if self .schema_is_enabled :
82
- result += self ._schemas
83
-
84
- if self .data_services_is_enabled :
85
- result += self ._data_services_epilogue ()
86
-
87
- result += self ._edmx_epilogue ()
88
-
89
- return result
90
-
91
- def _edmx_prologue (self ):
92
- if self .custom_edmx_prologue :
93
- prologue = self .custom_edmx_prologue
94
- else :
95
- prologue = f"""<edmx:Edmx xmlns:edmx="{ self .namespaces ["edmx" ]} " xmlns:m="{ self .namespaces ["m" ]} " xmlns:sap="{ self .namespaces ["sap" ]} " Version="1.0">"""
96
- return prologue
97
-
98
- def _edmx_epilogue (self ):
99
- if self .custom_edmx_epilogue :
100
- epilogue = self .custom_edmx_epilogue
101
- else :
102
- epilogue = '\n </edmx:Edmx>'
103
- return epilogue
104
-
105
- def _data_services_prologue (self ):
106
- if self .custom_data_services_prologue :
107
- prologue = self .custom_data_services_prologue
108
- else :
109
- prologue = '\n <edmx:DataServices m:DataServiceVersion="2.0">'
110
- return prologue
111
-
112
- def _data_services_epilogue (self ):
113
- if self .custom_data_services_epilogue :
114
- prologue = self .custom_data_services_epilogue
115
- else :
116
- prologue = '\n </edmx:DataServices>'
117
- return prologue
118
-
119
- return XMLBuilder
120
-
121
-
122
- @pytest .fixture
123
- def schema (metadata_v2 ):
124
- """Parsed metadata"""
125
-
126
- # pylint: disable=redefined-outer-name
127
-
128
- meta = MetadataBuilder (
129
- metadata_v2 ,
130
- config = Config (ODataV2 )
131
- )
132
-
133
- return meta .build ()
134
-
135
-
136
- @pytest .fixture
137
- def schema_v4 (metadata_v4 ):
138
- meta = MetadataBuilder (
139
- metadata_v4 ,
140
- config = Config (ODataV4 )
141
- )
142
-
143
- return meta .build ()
144
-
145
-
146
- def assert_logging_policy (mock_warning , * args ):
147
- """Assert if an warning was outputted by PolicyWarning """
148
- assert logging .Logger .warning is mock_warning
149
- mock_warning .assert_called_with ('[%s] %s' , * args )
150
-
151
-
152
- def assert_request_contains_header (headers , name , value ):
153
- assert name in headers
154
- assert headers [name ] == value
21
+ def template_builder ():
22
+ def _builder (version : Type [ODATAVersion ], ** kwargs ):
23
+ if version == ODataV4 :
24
+ config = Config (ODataV4 )
25
+ template = 'v4/metadata.template.xml'
26
+ else :
27
+ config = Config (ODataV2 )
28
+ template = 'v4/metadata.template.xml'
29
+
30
+ with open (_path_to_file (template ), 'rb' ) as metadata_file :
31
+ template = jinja2 .Template (metadata_file .read ().decode ("utf-8" ))
32
+ template = template .render (** kwargs ).encode ('ascii' )
33
+
34
+ return MetadataBuilder (template , config = config ), config
35
+
36
+ return _builder
0 commit comments