import StringIO
from nose.tools import assert_equal
from fakeserver import FakeServer
from utils import assert_isinstance
from novaclient import Zone

os = FakeServer()


def test_list_zones():
    sl = os.zones.list()
    os.assert_called('GET', '/zones/detail')
    [assert_isinstance(s, Zone) for s in sl]


def test_list_zones_undetailed():
    sl = os.zones.list(detailed=False)
    os.assert_called('GET', '/zones')
    [assert_isinstance(s, Zone) for s in sl]


def test_get_zone_details():
    s = os.zones.get(1)
    os.assert_called('GET', '/zones/1')
    assert_isinstance(s, Zone)
    assert_equal(s.id, 1)
    assert_equal(s.api_url, 'http://foo.com')


def test_create_zone():
    s = os.zones.create(api_url="http://foo.com", username='bob',
                        password='xxx')
    os.assert_called('POST', '/zones')
    assert_isinstance(s, Zone)


def test_update_zone():
    s = os.zones.get(1)

    # Update via instance
    s.update(api_url='http://blah.com')
    os.assert_called('PUT', '/zones/1')
    s.update(api_url='http://blah.com', username='alice', password='xxx')
    os.assert_called('PUT', '/zones/1')

    # Silly, but not an error
    s.update()

    # Update via manager
    os.zones.update(s, api_url='http://blah.com')
    os.assert_called('PUT', '/zones/1')
    os.zones.update(1, api_url= 'http://blah.com')
    os.assert_called('PUT', '/zones/1')
    os.zones.update(s, api_url='http://blah.com', username='fred',
                       password='zip')
    os.assert_called('PUT', '/zones/1')


def test_delete_zone():
    s = os.zones.get(1)
    s.delete()
    os.assert_called('DELETE', '/zones/1')
    os.zones.delete(1)
    os.assert_called('DELETE', '/zones/1')
    os.zones.delete(s)
    os.assert_called('DELETE', '/zones/1')


def test_find_zone():
    s = os.zones.find(password='qwerty')
    os.assert_called('GET', '/zones/detail')
    assert_equal(s.username, 'bob')

    # Find with multiple results returns the first item
    s = os.zones.find(api_url='http://foo.com')
    sl = os.zones.findall(api_url='http://foo.com')
    assert_equal(sl[0], s)
    assert_equal([s.id for s in sl], [1, 2])