test suds.mx.typer.Typer.getprefix()

Added basic unit tests for this function, together with some new cleanup todo
items related to the function's current implementation and test code details.
This commit is contained in:
Jurko Gospodnetić 2015-07-14 11:27:40 +02:00
parent f0ba96e23e
commit 4458125828
2 changed files with 138 additions and 4 deletions

View File

@ -1517,6 +1517,10 @@ PRIORITIZED:
(+) * Add todo note to improve test coverage that managed to miss this
(+) problem.
(+) * Fix.
(+) * (Jurko) Add basic unit tests for Typer.genprefix().
(+) * Got broken in commit 103efca86cd07e9d7205ffb2735748f275a4b35f and
(+) fixed as part of issue https://bitbucket.org/jurko/suds/issues/90 but
(+) the bug was missed by the existing test suite.
(15.07.2015.)
@ -1936,10 +1940,23 @@ PRIORITIZED:
NON PRIORITIZED:
=================================================
* Add tests for Typer.genprefix().
* Got broken in commit 103efca86cd07e9d7205ffb2735748f275a4b35f and
fixed as part of issue https://bitbucket.org/jurko/suds/issues/90 but
the bug was missed by the existing test suite.
* Find and use a good spy/mock framework for our tests instead of rolling
our our own every time we need one.
* Add a functional test parsing a WSDL and running all the way down to the
Typer.genprefix() function.
* Useful to help see what else got missed in the test suite when the
suite missed this function and let through a bug reported as
https://bitbucket.org/jurko/suds/issues/90.
* Improve Typer.genprefix() implementation.
* See whether, when we have the same namespace already mapped, we should
return its existing prefix here.
* Current implementation already does that but only in some cases -
if ns1, ns2, ... ns# are # all already mapped to a different
namespace and ns#+1 is mapped to the one we want, it returns
ns#+1, making it seem like this was tacked on only as an
afterthought.
* suds.sudsobject.footprint() does some fancy recursive counting while all
it is actually used for is for detecting objects with footprint 0. This

117
tests/test_mx.py Normal file
View File

@ -0,0 +1,117 @@
# -*- coding: utf-8 -*-
# This program is free software; you can redistribute it and/or modify it under
# the terms of the (LGPL) GNU Lesser General Public License as published by the
# Free Software Foundation; either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Library Lesser General Public License
# for more details at ( http://www.gnu.org/licenses/lgpl.html ).
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# written by: Jurko Gospodnetić ( jurko.gospodnetic@pke.hr )
"""
Suds MX system unit tests.
Implemented using the 'pytest' testing framework.
"""
if __name__ == "__main__":
import testutils
testutils.run_using_pytest(globals())
from suds.mx.typer import Typer
import pytest
def _prefix(i):
"""Prefixes expected to be constructed by Typer.getprefix()."""
return "ns%d" % (i,)
class TestTyper:
class Test_genprefix:
class MockNode:
def __init__(self, namespace_mapping):
self.mock_call_params = []
self.__namespace_mapping = namespace_mapping
def resolvePrefix(self, prefix, default):
self.mock_call_params.append((prefix, default))
return self.__namespace_mapping.get(prefix, default)
def test_no_mapped_prefixes(self):
node = self.__class__.MockNode({})
test_namespace = "test namespace"
result = Typer.genprefix(node, ("unused-prefix", test_namespace))
assert result == (_prefix(1), test_namespace)
assert node.mock_call_params == [(_prefix(1), None)]
def test_several_already_mapped_prefixes(self):
test_namespace = "test namespace"
node = self.__class__.MockNode({
_prefix(1): "another namespace",
_prefix(2): "another namespace"})
result = Typer.genprefix(node, ("unused-prefix", test_namespace))
assert result == (_prefix(3), test_namespace)
assert node.mock_call_params == [
(_prefix(i), None) for i in [1, 2, 3]]
def test_last_free_namespace(self):
test_namespace = "test namespace"
node = self.__class__.MockNode(dict(
(_prefix(i), "another namespace")
for i in range(1, 1023)))
result = Typer.genprefix(node, ("unused-prefix", test_namespace))
assert result == (_prefix(1023), test_namespace)
expected_calls = [(_prefix(i), None) for i in range(1, 1024)]
assert node.mock_call_params == expected_calls
def test_no_free_namespace(self):
test_namespace = "test namespace"
node = self.__class__.MockNode(dict(
(_prefix(i), "another namespace") for i in range(1, 1024)))
e = pytest.raises(Exception,
Typer.genprefix, node, ("unused-prefix", test_namespace)).value
try:
assert str(e) == "auto prefix, exhausted"
finally:
del e # explicitly break circular reference chain in Python 3
expected_calls = [(_prefix(i), None) for i in range(1, 1024)]
assert node.mock_call_params == expected_calls
def test_already_mapped_namespace_with_no_unused_prefix_before(self):
test_prefix_index = 2
test_namespace = "test namespace"
node = self.__class__.MockNode({
_prefix(1): "another namespace",
_prefix(test_prefix_index): test_namespace,
_prefix(3): "another namespace"})
result = Typer.genprefix(node, ("unused-prefix", test_namespace))
assert result == (_prefix(test_prefix_index), test_namespace)
expected_calls = [(_prefix(i), None)
for i in range(1, test_prefix_index + 1)]
assert node.mock_call_params == expected_calls
def test_already_mapped_namespace_with_unused_prefix_before(self):
unused_prefix_index = 2
test_namespace = "test namespace"
node = self.__class__.MockNode({
_prefix(1): "another namespace",
_prefix(3): test_namespace,
_prefix(4): "another namespace"})
result = Typer.genprefix(node, ("unused-prefix", test_namespace))
assert result == (_prefix(unused_prefix_index), test_namespace)
expected_calls = [(_prefix(i), None)
for i in range(1, unused_prefix_index + 1)]
assert node.mock_call_params == expected_calls