#!/usr/bin/python

import unittest
import common
from autotest_lib.frontend import setup_django_environment
import serviceHandler


class RpcMethodHolder(object):
    @staticmethod
    def service_1(x, y):
        return x + y

    @staticmethod
    def service_2(path):
        return path.split('/')[-1]


json_request1 = """
{
    "method": "service_1",
    "params": [7, 9],
    "id": null
}
"""

expected_response1 = '{"error": null, "result": 16, "id": null}'


json_request2 = """
{
    "method": "service_2",
    "params": ["http://www.some.url.com/path/to/package.rpm"],
    "id": null
}
"""

expected_response2 = '{"error": null, "result": "package.rpm", "id": null}'

json_request3 = """
{
    "method": "service_3",
    "params": ["I wonder if this works"],
    "id": null
}
"""


class TestServiceHandler(unittest.TestCase):
    def setUp(self):
        holder = RpcMethodHolder()
        self.serviceHandler = serviceHandler.ServiceHandler(holder)


    def test_handleRequest1(self):
        response = self.serviceHandler.handleRequest(json_request1)
        self.assertEquals(response, expected_response1)


    def test_handleRequest2(self):
        response = self.serviceHandler.handleRequest(json_request2)
        self.assertEquals(response, expected_response2)


    def test_handleRequest3(self):
        response = self.serviceHandler.handleRequest(json_request3)
        response_obj = eval(response.replace('null', 'None'))
        self.assertNotEquals(response_obj['error'], 'None')


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