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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
import requests_mock
from exchangelib.errors import TransportError
from exchangelib.util import to_xml
from exchangelib.version import EXCHANGE_2007, Build, Version
from .common import TimedTestCase
class VersionTest(TimedTestCase):
def test_magic(self):
hash(Version(Build(15, 1, 2, 3)))
def test_invalid_version_args(self):
with self.assertRaises(TypeError) as e:
Version(build="XXX")
self.assertEqual(e.exception.args[0], "'build' 'XXX' must be of type <class 'exchangelib.version.Build'>")
with self.assertRaises(TypeError) as e:
Version(build="XXX", api_version="XXX")
self.assertEqual(e.exception.args[0], "'build' 'XXX' must be of type <class 'exchangelib.version.Build'>")
with self.assertRaises(TypeError) as e:
Version(build=Build(15, 1, 2, 3), api_version=999)
self.assertEqual(e.exception.args[0], "'api_version' 999 must be of type <class 'str'>")
def test_invalid_build_args(self):
with self.assertRaises(TypeError) as e:
Build("XXX", 2, 3, 4)
self.assertEqual(e.exception.args[0], "'major_version' 'XXX' must be of type <class 'int'>")
with self.assertRaises(TypeError) as e:
Build(1, "XXX", 3, 4)
self.assertEqual(e.exception.args[0], "'minor_version' 'XXX' must be of type <class 'int'>")
with self.assertRaises(TypeError) as e:
Build(1, 2, "XXX", 4)
self.assertEqual(e.exception.args[0], "'major_build' 'XXX' must be of type <class 'int'>")
with self.assertRaises(TypeError) as e:
Build(1, 2, 3, "XXX")
self.assertEqual(e.exception.args[0], "'minor_build' 'XXX' must be of type <class 'int'>")
def test_comparison(self):
self.assertEqual(Version(Build(15, 1, 2, 3)), Version(Build(15, 1, 2, 3)))
self.assertNotEqual(Version(Build(15, 1, 2, 3)), Version(Build(15, 1)))
self.assertNotEqual(Version(Build(15, 1, 2, 3), api_version="XXX"), Version(None, api_version="XXX"))
self.assertNotEqual(Version(None, api_version="XXX"), Version(Build(15, 1, 2), api_version="XXX"))
self.assertEqual(Version(Build(15, 1, 2, 3), "XXX"), Version(Build(15, 1, 2, 3), "XXX"))
self.assertNotEqual(Version(Build(15, 1, 2, 3), "XXX"), Version(Build(15, 1, 2, 3), "YYY"))
self.assertNotEqual(Version(Build(15, 1, 2, 3), "XXX"), Version(Build(99, 88), "XXX"))
self.assertNotEqual(Version(Build(15, 1, 2, 3), "XXX"), Version(Build(99, 88), "YYY"))
def test_default_api_version(self):
# Test that a version gets a reasonable api_version value if we don't set one explicitly
version = Version(build=Build(15, 1, 2, 3))
self.assertEqual(version.api_version, "Exchange2016")
@requests_mock.mock() # Just to make sure we don't make any requests
def test_from_response(self, m):
# Test fallback to suggested api_version value when there is a version mismatch and response version is fishy
version = Version.from_soap_header(
"Exchange2007",
to_xml(
b"""\
<s:Header>
<h:ServerVersionInfo
MajorBuildNumber="845" MajorVersion="15" MinorBuildNumber="22" MinorVersion="1" Version="V2016_10_10"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"/>
</s:Header>"""
),
)
self.assertEqual(version.api_version, EXCHANGE_2007.api_version())
self.assertEqual(version.api_version, "Exchange2007")
self.assertEqual(version.build, Build(15, 1, 845, 22))
# Test that override the suggested version if the response version is not fishy
version = Version.from_soap_header(
"Exchange2013",
to_xml(
b"""\
<s:Header>
<h:ServerVersionInfo
MajorBuildNumber="845" MajorVersion="15" MinorBuildNumber="22" MinorVersion="1" Version="HELLO_FROM_EXCHANGELIB"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"/>
</s:Header>"""
),
)
self.assertEqual(version.api_version, "HELLO_FROM_EXCHANGELIB")
# Test that we override the suggested version with the version deduced from the build number if a version is not
# present in the response
version = Version.from_soap_header(
"Exchange2013",
to_xml(
b"""\
<s:Header>
<h:ServerVersionInfo
MajorBuildNumber="845" MajorVersion="15" MinorBuildNumber="22" MinorVersion="1"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"/>
</s:Header>"""
),
)
self.assertEqual(version.api_version, "Exchange2016")
# Test that we use the version deduced from the build number when a version is not present in the response and
# there was no suggested version.
version = Version.from_soap_header(
None,
to_xml(
b"""\
<s:Header>
<h:ServerVersionInfo
MajorBuildNumber="845" MajorVersion="15" MinorBuildNumber="22" MinorVersion="1"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"/>
</s:Header>"""
),
)
self.assertEqual(version.api_version, "Exchange2016")
# Test various parse failures
with self.assertRaises(TransportError) as e:
Version.from_soap_header(
"Exchange2013",
to_xml(
b"""\
<s:Header>
<foo/>
</s:Header>"""
),
)
self.assertIn("No ServerVersionInfo in header", e.exception.args[0])
with self.assertRaises(TransportError) as e:
Version.from_soap_header(
"Exchange2013",
to_xml(
b"""\
<s:Header>
<h:ServerVersionInfo MajorBuildNumber="845" MajorVersion="15" Version="V2016_10_10"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"/>
</s:Header>"""
),
)
self.assertIn("Bad ServerVersionInfo in response", e.exception.args[0])
|