Home | History | Annotate | Download | only in skylab_venv
      1 """Tests for sso_discovery."""
      2 
      3 import mock
      4 import unittest
      5 import subprocess
      6 
      7 from skylab_venv import sso_discovery
      8 
      9 
     10 class SsoDiscoveryTest(unittest.TestCase):
     11   """Test sso_discovery."""
     12 
     13   URL = 'https://TEST_URL.com'
     14 
     15   def setUp(self):
     16     super(SsoDiscoveryTest, self).setUp()
     17     patcher = mock.patch.object(subprocess, 'check_output')
     18     self.mock_run_cmd = patcher.start()
     19     self.addCleanup(patcher.stop)
     20 
     21   def testSsoRequestWhenFailToRunSsoClientCmd(self):
     22     """Test sso_request when fail to run the sso_client command."""
     23     self.mock_run_cmd.side_effect = subprocess.CalledProcessError(
     24         returncode=1, cmd='test_cmd')
     25 
     26     with self.assertRaises(sso_discovery.BadHttpRequestException):
     27        sso_discovery.sso_request(self.URL)
     28 
     29   def testSsoRequestWithAcceptEncodingHeader(self):
     30     """Test sso_request when accept-encoding header is given."""
     31     self.mock_run_cmd.return_value = '''HTTP/1.1 200 OK
     32 content-type: application/json
     33 \r\n\r\n
     34 {"test": "test"}'''
     35 
     36     sso_discovery.sso_request(self.URL, headers={'accept-encoding': 'test'})
     37 
     38     self.mock_run_cmd.assert_called_with(
     39         ['sso_client', '--url', self.URL, '-dump_header'])
     40 
     41   def testSsoRequestWhenFailToParseStatusFromHttpResponse(self):
     42     """Test sso_request when fail to parse status from the http response."""
     43     self.mock_run_cmd.return_value = 'invalid response'
     44     with self.assertRaises(sso_discovery.BadHttpResponseException) as e:
     45       sso_discovery.sso_request(self.URL)
     46 
     47   def testSsoRequestWhenNoBodyContentInHttpResponse(self):
     48     """Test sso_request when body is missing from the http response."""
     49     http_response = '''HTTP/1.1 404 Not Found
     50 fake_header: fake_value'''
     51 
     52     self.mock_run_cmd.return_value = http_response
     53     resp, body = sso_discovery.sso_request(self.URL)
     54 
     55     self.mock_run_cmd.assert_called_with(
     56         ['sso_client', '--url', self.URL, '-dump_header'])
     57     self.assertEqual(resp.status, 404)
     58     self.assertEqual(resp['body'], '')
     59     self.assertEqual(resp['headers'], http_response)
     60     self.assertEqual(body, '')
     61 
     62   def testSsoRequestWithSuccessfulHttpResponse(self):
     63     """Test sso_request with 200 http response."""
     64     http_response = '''HTTP/1.1 200 OK
     65 content-type: application/json
     66 \r\n\r\n
     67 {"test": "test"}'''
     68 
     69     self.mock_run_cmd.return_value = http_response
     70     resp, body = sso_discovery.sso_request(self.URL)
     71 
     72     self.mock_run_cmd.assert_called_with(
     73         ['sso_client', '--url', self.URL, '-dump_header'])
     74     self.assertEqual(resp.status, 200)
     75     self.assertEqual(resp['body'], '{"test": "test"}')
     76     self.assertEqual(resp['headers'],
     77                      'HTTP/1.1 200 OK\ncontent-type: application/json')
     78     self.assertEqual(body, '{"test": "test"}')
     79 
     80 
     81 if __name__ == '__main__':
     82   unittest.main()
     83