# Copyright 2012 OpenStack Foundation.
# All Rights Reserved.
#
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.

import webob

from sps.api.middleware import version_negotiation
from sps.api import versions
from sps.openstack.common import jsonutils
from sps.tests.unit import base


class VersionsTest(base.IsolatedUnitTest):

    """Test the version information returned from the API service."""

    def test_get_version_list(self):
        req = webob.Request.blank('/', base_url='http://127.0.0.1:9292/')
        req.accept = 'application/json'
        self.config(bind_host='127.0.0.1', bind_port=9292)
        res = versions.Controller().index(req)
        self.assertEqual(res.status_int, 300)
        self.assertEqual(res.content_type, 'application/json')
        results = jsonutils.loads(res.body)['versions']
        expected = [
            {
                'id': 'v2.2',
                'status': 'CURRENT',
                'links': [{'rel': 'self',
                           'href': 'http://127.0.0.1:9292/v2/'}],
            },
            {
                'id': 'v2.1',
                'status': 'SUPPORTED',
                'links': [{'rel': 'self',
                           'href': 'http://127.0.0.1:9292/v2/'}],
            },
            {
                'id': 'v2.0',
                'status': 'SUPPORTED',
                'links': [{'rel': 'self',
                           'href': 'http://127.0.0.1:9292/v2/'}],
            },
            {
                'id': 'v1.1',
                'status': 'CURRENT',
                'links': [{'rel': 'self',
                           'href': 'http://127.0.0.1:9292/v1/'}],
            },
            {
                'id': 'v1.0',
                'status': 'SUPPORTED',
                'links': [{'rel': 'self',
                           'href': 'http://127.0.0.1:9292/v1/'}],
            },
        ]
        self.assertEqual(results, expected)


class VersionNegotiationTest(base.IsolatedUnitTest):

    def setUp(self):
        super(VersionNegotiationTest, self).setUp()
        self.middleware = version_negotiation.VersionNegotiationFilter(None)

    def test_request_url_v1(self):
        request = webob.Request.blank('/v1/demos')
        self.middleware.process_request(request)
        self.assertEqual('/v1/demos', request.path_info)

    def test_request_url_v1_0(self):
        request = webob.Request.blank('/v1.0/demos')
        self.middleware.process_request(request)
        self.assertEqual('/v1/demos', request.path_info)

    def test_request_url_v1_1(self):
        request = webob.Request.blank('/v1.1/demos')
        self.middleware.process_request(request)
        self.assertEqual('/v1/demos', request.path_info)

    def test_request_accept_v1(self):
        request = webob.Request.blank('/demos')
        request.headers = {'accept': 'application/vnd.openstack.demos-v1'}
        self.middleware.process_request(request)
        self.assertEqual('/v1/demos', request.path_info)

    def test_request_url_v2(self):
        request = webob.Request.blank('/v2/demos')
        self.middleware.process_request(request)
        self.assertEqual('/v2/demos', request.path_info)

    def test_request_url_v2_0(self):
        request = webob.Request.blank('/v2.0/demos')
        self.middleware.process_request(request)
        self.assertEqual('/v2/demos', request.path_info)

    def test_request_url_v2_1(self):
        request = webob.Request.blank('/v2.1/demos')
        self.middleware.process_request(request)
        self.assertEqual('/v2/demos', request.path_info)

    def test_request_url_v2_2(self):
        request = webob.Request.blank('/v2.2/demos')
        self.middleware.process_request(request)
        self.assertEqual('/v2/demos', request.path_info)

    def test_request_url_v2_3_unsupported(self):
        request = webob.Request.blank('/v2.3/demos')
        resp = self.middleware.process_request(request)
        self.assertIsInstance(resp, versions.Controller)

    def test_request_url_v3_unsupported(self):
        request = webob.Request.blank('/v3/demos')
        resp = self.middleware.process_request(request)
        self.assertIsInstance(resp, versions.Controller)
