from webtest import TestApp
from pyramid.config import Configurator
import hapic
from hapic.ext.pyramid import PyramidContext
from example.fake_api.pyramid_api import hapic
from example.fake_api.pyramid_api import PyramidController
from tests.func.fake_api.common import SWAGGER_DOC_API


def test_func_pyramid_fake_api_doc():
    configurator = Configurator(autocommit=True)
    controllers = PyramidController()
    controllers.bind(configurator)
    hapic.set_context(PyramidContext(configurator))
    app = TestApp(configurator.make_wsgi_app())
    doc = hapic.generate_doc(
        title='Fake API',
        description='just an example of hapic API'
    )

    assert doc == SWAGGER_DOC_API
    resp = app.get('/about')
    assert resp.status_int == 200
    assert resp.json == {'datetime': '2017-12-07T10:55:08.488996+00:00',
                         'version': '1.2.3'}

    resp = app.get('/users')
    assert resp.status_int == 200
    assert resp.json == {
        'items':
        [
            {
                'username': 'some_user',
                'display_name': 'Damien Accorsi',
                'company': 'Algoo', 'id': 4
            }
        ],
        'pagination': {
            'first_id': 0,
            'last_id': 5,
            'current_id': 0,
        },
        'item_nb': 1,
    }

    resp = app.get('/users/1')
    assert resp.status_int == 200
    assert resp.json == {
        'last_name': 'Accorsi',
        'username': 'some_user',
        'first_name': 'Damien',
        'id': 4,
        'display_name': 'Damien Accorsi',
        'email_address': 'some.user@hapic.com',
        'company': 'Algoo'
    }

    resp = app.post('/users/', status='*')
    assert resp.status_int == 400
    assert resp.json == {
        'code': None,
        'details': {
            'email_address': ['Missing data for required field.'],
            'username': ['Missing data for required field.'],
            'display_name': ['Missing data for required field.'],
            'last_name': ['Missing data for required field.'],
            'first_name': ['Missing data for required field.'],
            'company': ['Missing data for required field.']},
        'message': 'Validation error of input data'}

    user = {
        'email_address': 'some.user@hapic.com',
        'username': 'some_user',
        'display_name': 'Damien Accorsi',
        'last_name': 'Accorsi',
        'first_name': 'Damien',
        'company': 'Algoo',
    }

    resp = app.post_json('/users/', user)
    assert resp.status_int == 200
    assert resp.json == {
        'last_name': 'Accorsi',
        'username': 'some_user',
        'first_name': 'Damien',
        'id': 4,
        'display_name': 'Damien Accorsi',
        'email_address': 'some.user@hapic.com',
        'company': 'Algoo',
    }

    # INFO - G.M - 2017-12-07 - Test for delete desactivated(Webtest check fail)
    # Webtest check content_type. Up to know pyramid_api return json as
    # content_type with 204 NO CONTENT status code which return an error in
    # WebTest check.
    # resp = app.delete('/users/1', status='*')
    # assert resp.status_int == 204