import pytest

from ereuse_devicehub.devicehub import Devicehub
from ereuse_devicehub.client import Client


@pytest.mark.mvp
def test_dummy(_app: Devicehub):
    """Tests the dummy cli command."""
    runner = _app.test_cli_runner()
    runner.invoke('dummy', '--yes')
    with _app.app_context():
        _app.db.drop_all()


@pytest.mark.mvp
def test_dependencies():
    with pytest.raises(ImportError):
        # Simplejson has a different signature than stdlib json
        # should be fixed though
        # noinspection PyUnresolvedReferences
        import simplejson


# noinspection PyArgumentList
@pytest.mark.mvp
def test_api_docs(client: Client):
    """Tests /apidocs correct initialization."""
    docs, _ = client.get('/apidocs')
    assert set(docs['paths'].keys()) == {
        '/actions/',
        '/apidocs',
        '/allocates/',
        '/deallocates/',
        '/deliverynotes/',
        '/devices/',
        '/devices/static/{filename}',
        '/documents/static/{filename}',
        '/documents/actions/',
        '/documents/erasures/',
        '/documents/devices/',
        '/documents/stamps/',
        '/documents/internalstats/',
        '/documents/stock/',
        '/documents/check/',
        '/documents/lots/',
        '/versions/',
        '/manufacturers/',
        '/licences/',
        '/lives/',
        '/lots/',
        '/lots/{id}/children',
        '/lots/{id}/devices',
        '/metrics/',
        '/tags/',
        '/tags/{tag_id}/device/{device_id}',
        '/users/',
        '/users/login/'
        # '/devices/{dev1_id}/merge/{dev2_id}',
        # '/batteries/{dev1_id}/merge/{dev2_id}',
        # '/bikes/{dev1_id}/merge/{dev2_id}',
        # '/cameras/{dev1_id}/merge/{dev2_id}',
        # '/cellphones/{dev1_id}/merge/{dev2_id}',
        # '/components/{dev1_id}/merge/{dev2_id}',
        # '/computer-accessories/{dev1_id}/merge/{dev2_id}',
        # '/computer-monitors/{dev1_id}/merge/{dev2_id}',
        # '/computers/{dev1_id}/merge/{dev2_id}',
        # '/cookings/{dev1_id}/merge/{dev2_id}',
        # '/data-storages/{dev1_id}/merge/{dev2_id}',
        # '/dehumidifiers/{dev1_id}/merge/{dev2_id}',
        # '/desktops/{dev1_id}/merge/{dev2_id}',
        # '/displays/{dev1_id}/merge/{dev2_id}',
        # '/diy-and-gardenings/{dev1_id}/merge/{dev2_id}',
        # '/drills/{dev1_id}/merge/{dev2_id}',
        # '/graphic-cards/{dev1_id}/merge/{dev2_id}',
        # '/hard-drives/{dev1_id}/merge/{dev2_id}',
        # '/homes/{dev1_id}/merge/{dev2_id}',
        # '/hubs/{dev1_id}/merge/{dev2_id}',
        # '/keyboards/{dev1_id}/merge/{dev2_id}',
        # '/label-printers/{dev1_id}/merge/{dev2_id}',
        # '/laptops/{dev1_id}/merge/{dev2_id}',
        # '/memory-card-readers/{dev1_id}/merge/{dev2_id}',
        # '/mice/{dev1_id}/merge/{dev2_id}',
        # '/microphones/{dev1_id}/merge/{dev2_id}',
        # '/mixers/{dev1_id}/merge/{dev2_id}',
        # '/mobiles/{dev1_id}/merge/{dev2_id}',
        # '/monitors/{dev1_id}/merge/{dev2_id}',
        # '/motherboards/{dev1_id}/merge/{dev2_id}',
        # '/network-adapters/{dev1_id}/merge/{dev2_id}',
        # '/networkings/{dev1_id}/merge/{dev2_id}',
        # '/pack-of-screwdrivers/{dev1_id}/merge/{dev2_id}',
        # '/printers/{dev1_id}/merge/{dev2_id}',
        # '/processors/{dev1_id}/merge/{dev2_id}',
        # '/rackets/{dev1_id}/merge/{dev2_id}',
        # '/ram-modules/{dev1_id}/merge/{dev2_id}',
        # '/recreations/{dev1_id}/merge/{dev2_id}',
        # '/routers/{dev1_id}/merge/{dev2_id}',
        # '/sais/{dev1_id}/merge/{dev2_id}',
        # '/servers/{dev1_id}/merge/{dev2_id}',
        # '/smartphones/{dev1_id}/merge/{dev2_id}',
        # '/solid-state-drives/{dev1_id}/merge/{dev2_id}',
        # '/sound-cards/{dev1_id}/merge/{dev2_id}',
        # '/sounds/{dev1_id}/merge/{dev2_id}',
        # '/stairs/{dev1_id}/merge/{dev2_id}',
        # '/switches/{dev1_id}/merge/{dev2_id}',
        # '/tablets/{dev1_id}/merge/{dev2_id}',
        # '/television-sets/{dev1_id}/merge/{dev2_id}',
        # '/video-scalers/{dev1_id}/merge/{dev2_id}',
        # '/videoconferences/{dev1_id}/merge/{dev2_id}',
        # '/videos/{dev1_id}/merge/{dev2_id}',
        # '/wireless-access-points/{dev1_id}/merge/{dev2_id}',
    }
    assert docs['info'] == {'title': 'Devicehub', 'version': '0.2'}
    assert docs['components']['securitySchemes']['bearerAuth'] == {
        'description': 'Basic scheme with token.',
        'in': 'header',
        'description:': 'HTTP Basic scheme',
        'type': 'http',
        'scheme': 'basic',
        'name': 'Authorization'
    }
    assert len(docs['definitions']) == 119