from fixtures import *


def test_web_release_create_accept(app_admin, api):

    eg = quick_eg(api)

    rv = app_admin.get('/editgroup/{}'.format(eg.editgroup_id))
    assert rv.status_code == 200
    assert b'Release Edits (0)' in rv.data

    # bogus/bad submit
    rv = app_admin.post('/release/create',
        data={
            'editgroup_id': eg.editgroup_id,
            'release_type': 'badmojo',
            'release_stage': 'published',
            'title': 'something bogus',
        },
        follow_redirects=True)
    assert rv.status_code == 400
    # Does not insert bad choices into drop-down
    #assert b'badmojo' in rv.data
    assert b'Not a valid choice' in rv.data

    # bad wikidata QID
    rv = app_admin.post('/release/create',
        data={
            'editgroup_id': eg.editgroup_id,
            'release_type': 'article-journal',
            'release_stage': 'published',
            'title': 'something bogus',
            'wikidata_qid': '884',
        },
        follow_redirects=True)
    assert rv.status_code == 400

    # ok/valid submit
    rv = app_admin.post('/release/create',
        data={
            'editgroup_id': eg.editgroup_id,
            'release_type': 'article-journal',
            'release_stage': 'published',
            'title': 'something bogus',
            'doi': '10.1234/999999',
        },
        follow_redirects=True)
    assert rv.status_code == 200
    assert b'10.1234/999999' in rv.data

    rv = app_admin.get('/editgroup/{}'.format(eg.editgroup_id))
    assert rv.status_code == 200
    assert b'Release Edits (1)' in rv.data

    rv = app_admin.post('/editgroup/{}/submit'.format(eg.editgroup_id),
        follow_redirects=True,
    )
    assert rv.status_code == 200
    rv = app_admin.get('/editgroup/{}'.format(eg.editgroup_id))
    assert rv.status_code == 200
    assert b'Submitted' in rv.data
    assert b'None!' in rv.data

    rv = app_admin.post('/editgroup/{}/unsubmit'.format(eg.editgroup_id),
        follow_redirects=True,
    )
    assert rv.status_code == 200
    rv = app_admin.get('/editgroup/{}'.format(eg.editgroup_id))
    assert rv.status_code == 200

    rv = app_admin.post('/editgroup/{}/annotation'.format(eg.editgroup_id),
        data={
            'comment_markdown': "This is an **example** of markdown in a test annotation",
        },
        follow_redirects=True,
    )
    assert rv.status_code == 200
    rv = app_admin.get('/editgroup/{}'.format(eg.editgroup_id))
    assert rv.status_code == 200
    assert b'<p>This is an <strong>example</strong> of markdown in a test annotation' in rv.data

    rv = app_admin.post('/editgroup/{}/accept'.format(eg.editgroup_id),
        follow_redirects=True,
    )
    assert rv.status_code == 200
    rv = app_admin.get('/editgroup/{}'.format(eg.editgroup_id))
    assert rv.status_code == 200
    assert b'Merged' in rv.data


def test_web_container_create(app_admin, api):

    eg = quick_eg(api)

    # bogus/bad submit
    rv = app_admin.post('/container/create',
        data={
            'editgroup_id': eg.editgroup_id,
        },
        follow_redirects=True)
    assert rv.status_code == 400

    # ok/valid submit
    rv = app_admin.post('/container/create',
        data={
            'editgroup_id': eg.editgroup_id,
            'name': 'blah blah journal blah',
        },
        follow_redirects=True)
    assert rv.status_code == 200


def test_web_file_create(app_admin, api):

    eg = quick_eg(api)

    # bogus/bad submit
    rv = app_admin.post('/file/create',
        data={
            'editgroup_id': eg.editgroup_id,
        },
        follow_redirects=True)
    assert rv.status_code == 400

    # ok/valid submit
    rv = app_admin.post('/file/create',
        data={
            'editgroup_id': eg.editgroup_id,
            'size': '12345',
            'sha1': '45be56a396c4d03faaa41e055170c23534dec736',
        },
        follow_redirects=True)
    assert rv.status_code == 200

    # upper-case SHA-1
    rv = app_admin.post('/file/create',
        data={
            'editgroup_id': eg.editgroup_id,
            'size': '12345',
            'sha1': '45BE56A396C4D03FAAA41E055170C23534DEC736',
        },
        follow_redirects=True)
    assert rv.status_code == 200

def test_web_file_toml_create(app_admin, api):

    eg = quick_eg(api)

    # bogus/bad submit
    rv = app_admin.post('/file/create/toml',
        data={
            'editgroup_id': eg.editgroup_id,
        },
        follow_redirects=True)
    assert rv.status_code == 400

    # ok/valid submit
    rv = app_admin.post('/file/create/toml',
        data={
            'editgroup_id': eg.editgroup_id,
            'toml': """
size = 12345
sha1 = "45be56a396c4d03faaa41e055170c23534dec736"
            """,
        },
        follow_redirects=True)
    assert rv.status_code == 200

    # upper-case SHA-1
    rv = app_admin.post('/file/create/toml',
        data={
            'editgroup_id': eg.editgroup_id,
            'toml': """
size = 12345
sha1 = "45BE56A396C4D03FAAA41E055170C23534DEC736"
            """,
        },
        follow_redirects=True)
    assert rv.status_code == 400

def test_web_file_delete(app_admin, api):

    eg = quick_eg(api)

    rv = app_admin.get('/file/aaaaaaaaaaaaamztaaaaaaaaam/delete')
    assert rv.status_code == 200

    rv = app_admin.post('/file/aaaaaaaaaaaaamztaaaaaaaaam/delete',
        data={
            'editgroup_id': eg.editgroup_id,
        },
        follow_redirects=True)
    assert rv.status_code == 200
    # NOTE: did not *accept* the deletion edit

DUMMY_DEMO_ENTITIES = {
    'container': 'aaaaaaaaaaaaaeiraaaaaaaaam',
    'creator': 'aaaaaaaaaaaaaircaaaaaaaaaq',
    'file': 'aaaaaaaaaaaaamztaaaaaaaaam',
    'fileset': 'aaaaaaaaaaaaaztgaaaaaaaaai',
    'webcapture': 'aaaaaaaaaaaaa53xaaaaaaaaai',
    'release': 'aaaaaaaaaaaaarceaaaaaaaaai',
    'work': 'aaaaaaaaaaaaavkvaaaaaaaaai',
}

def test_web_edit_get(app_admin):

    # these are all existing entities
    for entity_type in ['release', 'file', 'container']:
        rv = app_admin.get(f'/{entity_type}/{DUMMY_DEMO_ENTITIES[entity_type]}/edit')
        assert rv.status_code == 200
        if entity_type == 'release':
            assert b'A bigger example' in rv.data
        elif entity_type == 'file':
            assert b'ffc1005680cb620eec4c913437dfabbf311b535cfe16cbaeb2faec1f92afc362' in rv.data
        elif entity_type == 'container':
            assert b'1549-1277' in rv.data

        rv = app_admin.get(f'/{entity_type}/{DUMMY_DEMO_ENTITIES[entity_type]}/edit/toml')
        assert rv.status_code == 200
        if entity_type == 'release':
            assert b'A bigger example' in rv.data
        elif entity_type == 'file':
            assert b'ffc1005680cb620eec4c913437dfabbf311b535cfe16cbaeb2faec1f92afc362' in rv.data
        elif entity_type == 'container':
            assert b'1549-1277' in rv.data

    # TOML-only endpoints
    for entity_type in ['creator', 'fileset', 'webcapture', 'work']:
        rv = app_admin.get(f'/{entity_type}/{DUMMY_DEMO_ENTITIES[entity_type]}/edit')
        assert rv.status_code == 302

        rv = app_admin.get(f'/{entity_type}/{DUMMY_DEMO_ENTITIES[entity_type]}/edit/toml')
        assert rv.status_code == 200


def test_web_create_get(app_admin):

    for entity_type in ['release', 'file', 'container']:
        rv = app_admin.get(f'/{entity_type}/create')
        assert rv.status_code == 200

        rv = app_admin.get(f'/{entity_type}/create/toml')
        assert rv.status_code == 200

    # these are TOML only
    for entity_type in ['creator', 'fileset', 'webcapture', 'work']:
        rv = app_admin.get(f'/{entity_type}/create')
        assert rv.status_code == 302

        rv = app_admin.get(f'/{entity_type}/create/toml')
        assert rv.status_code == 200

def test_web_edit_delete(app_admin):

    for entity_type in DUMMY_DEMO_ENTITIES.keys():
        rv = app_admin.get(f'/{entity_type}/{DUMMY_DEMO_ENTITIES[entity_type]}/delete')
        assert rv.status_code == 200