from stevedore import named

import mock


def test_named():
    em = named.NamedExtensionManager(
        'stevedore.test.extension',
        names=['t1'],
        invoke_on_load=True,
        invoke_args=('a',),
        invoke_kwds={'b': 'B'},
    )
    actual = em.names()
    assert actual == ['t1']


def test_enabled_before_load():
    # Set up the constructor for the FauxExtension to cause an
    # AssertionError so the test fails if the class is instantiated,
    # which should only happen if it is loaded before the name of the
    # extension is compared against the names that should be loaded by
    # the manager.
    init_name = 'stevedore.tests.test_extension.FauxExtension.__init__'
    with mock.patch(init_name) as m:
        m.side_effect = AssertionError
        em = named.NamedExtensionManager(
            'stevedore.test.extension',
            # Look for an extension that does not exist so the
            # __init__ we mocked should never be invoked.
            names=['no-such-extension'],
            invoke_on_load=True,
            invoke_args=('a',),
            invoke_kwds={'b': 'B'},
        )
        actual = em.names()
        assert actual == []


def test_extensions_listed_in_name_order():
    # Since we don't know the "natural" order of the extensions, run
    # the test both ways: if the sorting is broken, one of them will
    # fail
    em = named.NamedExtensionManager(
        'stevedore.test.extension',
        names='t1 t2',
        name_order=True
    )
    actual = em.names()
    assert actual == ['t1', 't2']

    em = named.NamedExtensionManager(
        'stevedore.test.extension',
        names='t2 t1',
        name_order=True
    )
    actual = em.names()
    assert actual == ['t2', 't1']

@@ -1469,15 +1469,20 @@
 mes=
+%5B
 't1
- 
+', '
 t2'
+%5D
 ,%0A  
@@ -1660,15 +1660,20 @@
 mes=
+%5B
 't2
- 
+', '
 t1'
+%5D
 ,%0A  

Correct argument types in name sort tests