# * coding: utf8 *
import os
import unittest
import app
import manager
import flask_migrate


class TestApp(unittest.TestCase):

    def setUp(self):
        app_ctx = manager.app.app_context()
        app_ctx.push()
        flask_migrate.init()
        flask_migrate.migrate()
        flask_migrate.upgrade()
        app_ctx.pop()
        manager.app.config['TESTING'] = True
        self.client = manager.app.test_client()

    def tearDown(self):
        os.system('rm -rf ./migrations')
        os.system('rm -f ./example.db')

    def test_profiles(self):
        # post '/api/v1/profiles'
        req_route = '/api/v1/profiles'
        req_json = {'nickname': 'test', 'signature': 'test'}
        resp_json = {'code': 0, 'msg': 'ok', 'data': None}
        resp = self.client.post(req_route, json=req_json)
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(resp.content_type, 'application/json')
        self.assertEqual(resp.get_json(), resp_json)

        # get '/api/v1/profiles'
        req_route = '/api/v1/profiles'
        resp_json = {
            'code': 0,
            'msg': 'ok',
            'data': {'items': [{'id': app.hash_ids.encode(1),
                                'nickname': 'test',
                                'signature': 'test'}],
                     'page_num': 1,
                     'page_size': 10,
                     'total': 1}
        }
        resp = self.client.get(req_route)
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(resp.content_type, 'application/json')
        self.assertEqual(resp.get_json(), resp_json)

        # put '/api/v1/profiles/<id>'
        req_route = '/api/v1/profiles/{0}'.format(app.hash_ids.encode(1))
        req_json = {'nickname': 'hello', 'signature': 'hello'}
        resp_json = {'code': 0, 'msg': 'ok', 'data': None}
        resp = self.client.put(req_route, json=req_json)
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(resp.content_type, 'application/json')
        self.assertEqual(resp.get_json(), resp_json)

        # get '/api/v1/profiles/<id>'
        req_route = '/api/v1/profiles/{0}'.format(app.hash_ids.encode(1))
        resp_json = {'code': 0,
                     'msg': 'ok',
                     'data': {'id': app.hash_ids.encode(1),
                              'nickname': 'hello',
                              'signature': 'hello'}
                     }
        resp = self.client.get(req_route)
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(resp.content_type, 'application/json')
        self.assertEqual(resp.get_json(), resp_json)

        # delete '/api/v1/profiles/<id>'
        req_route = '/api/v1/profiles/{0}'.format(app.hash_ids.encode(1))
        resp_json = {'code': 0, 'msg': 'ok', 'data': None}
        resp = self.client.delete(req_route)
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(resp.content_type, 'application/json')
        self.assertEqual(resp.get_json(), resp_json)


if __name__ == '__main__':
    unittest.main()