class EndpointTestCase(unittest.TestCase):

    APP_MODULE = 'http://example.com/test'
    APP_INSTANCE_NAME = 'test'
    APP_LINKS = [{}]
    HUMAN_NAME = 'Test'

    def test_response_includes_apps_list(self):
        self.assertEquals(1, len(self._get_apps_dict()))

    def test_response_includes_app_data(self):
        app = self._get_apps_dict()[0]
        self.assertEquals(self.APP_MODULE, app['self'])
        self.assertEquals(self.APP_INSTANCE_NAME, app['instance_name'])
        self.assertEquals(self.APP_LINKS, app['links'])
        self.assertEquals(self.HUMAN_NAME, app['human_name'])

    def test_response_has_correct_mime_type(self):
        with Flask(__name__).test_request_context('/', headers=[('Accept', 'application/json')]):
            response = HomepageEndpoint([]).get()
        self.assertEquals("application/json", response.headers.get('Content-Type'))

    def test_json_responses_throw_406_error(self):
        with Flask(__name__).test_request_context('/'):
            self.assertRaises(NotAcceptable, HomepageEndpoint([]).get)

    def test_response_includes_self(self):
        response = self._get_response_dict()
        self.assertEquals('http://mollyproject.org/apps/homepage', response['self'])

    def _get_response_dict(self):
        apps = [self._build_mock_app()]
        flask_app = Flask(__name__)
        with flask_app.test_request_context('/', headers=[('Accept', 'application/json')]):
            self._endpoint = HomepageEndpoint(apps)
            return json.loads(self._endpoint.get().data)

    def _get_apps_dict(self):
        return self._get_response_dict().get('applications')

    def _build_mock_app(self):
        app = Mock()
        app.module = self.APP_MODULE
        app.instance_name = self.APP_INSTANCE_NAME
        app.human_name = self.HUMAN_NAME
        app.links = self.APP_LINKS
        return app
 def _get_response_dict(self):
     apps = [self._build_mock_app()]
     flask_app = Flask(__name__)
     with flask_app.test_request_context('/', headers=[('Accept', 'application/json')]):
         self._endpoint = HomepageEndpoint(apps)
         return json.loads(self._endpoint.get().data)