github.com/blystad/deis@v0.11.0/controller/api/tests/test_release.py (about) 1 """ 2 Unit tests for the Deis api app. 3 4 Run the tests with "./manage.py test api" 5 """ 6 7 from __future__ import unicode_literals 8 9 import json 10 import mock 11 import requests 12 13 from django.test import TransactionTestCase 14 from django.test.utils import override_settings 15 16 from api.models import Release 17 18 19 def mock_import_repository_task(*args, **kwargs): 20 resp = requests.Response() 21 resp.status_code = 200 22 resp._content_consumed = True 23 return resp 24 25 26 @override_settings(CELERY_ALWAYS_EAGER=True) 27 class ReleaseTest(TransactionTestCase): 28 29 """Tests push notification from build system""" 30 31 fixtures = ['tests.json'] 32 33 def setUp(self): 34 self.assertTrue( 35 self.client.login(username='autotest', password='password')) 36 body = {'id': 'autotest', 'domain': 'autotest.local', 'type': 'mock', 37 'hosts': 'host1,host2', 'auth': 'base64string', 'options': {}} 38 response = self.client.post('/api/clusters', json.dumps(body), 39 content_type='application/json') 40 self.assertEqual(response.status_code, 201) 41 42 @mock.patch('requests.post', mock_import_repository_task) 43 def test_release(self): 44 """ 45 Test that a release is created when a cluster is created, and 46 that updating config or build or triggers a new release 47 """ 48 url = '/api/apps' 49 body = {'cluster': 'autotest'} 50 response = self.client.post(url, json.dumps(body), content_type='application/json') 51 self.assertEqual(response.status_code, 201) 52 app_id = response.data['id'] 53 # check that updating config rolls a new release 54 url = '/api/apps/{app_id}/config'.format(**locals()) 55 body = {'values': json.dumps({'NEW_URL1': 'http://localhost:8080/'})} 56 response = self.client.post( 57 url, json.dumps(body), content_type='application/json') 58 self.assertEqual(response.status_code, 201) 59 self.assertIn('NEW_URL1', json.loads(response.data['values'])) 60 # check to see that an initial release was created 61 url = '/api/apps/{app_id}/releases'.format(**locals()) 62 response = self.client.get(url) 63 self.assertEqual(response.status_code, 200) 64 # account for the config release as well 65 self.assertEqual(response.data['count'], 2) 66 url = '/api/apps/{app_id}/releases/v1'.format(**locals()) 67 response = self.client.get(url) 68 self.assertEqual(response.status_code, 200) 69 release1 = response.data 70 self.assertIn('config', response.data) 71 self.assertIn('build', response.data) 72 self.assertEquals(release1['version'], 1) 73 self.assertEquals(release1['image'], 'deis/helloworld') 74 # check to see that a new release was created 75 url = '/api/apps/{app_id}/releases/v2'.format(**locals()) 76 response = self.client.get(url) 77 self.assertEqual(response.status_code, 200) 78 release2 = response.data 79 self.assertNotEqual(release1['uuid'], release2['uuid']) 80 self.assertNotEqual(release1['config'], release2['config']) 81 self.assertEqual(release1['build'], release2['build']) 82 self.assertEquals(release2['version'], 2) 83 # check that updating the build rolls a new release 84 url = '/api/apps/{app_id}/builds'.format(**locals()) 85 build_config = json.dumps({'PATH': 'bin:/usr/local/bin:/usr/bin:/bin'}) 86 body = {'image': 'autotest/example'} 87 response = self.client.post( 88 url, json.dumps(body), content_type='application/json') 89 self.assertEqual(response.status_code, 201) 90 self.assertEqual(response.data['image'], body['image']) 91 # check to see that a new release was created 92 url = '/api/apps/{app_id}/releases/v3'.format(**locals()) 93 response = self.client.get(url) 94 self.assertEqual(response.status_code, 200) 95 release3 = response.data 96 self.assertNotEqual(release2['uuid'], release3['uuid']) 97 self.assertNotEqual(release2['build'], release3['build']) 98 self.assertEquals(release3['version'], 3) 99 # check that we can fetch a previous release 100 url = '/api/apps/{app_id}/releases/v2'.format(**locals()) 101 response = self.client.get(url) 102 self.assertEqual(response.status_code, 200) 103 release2 = response.data 104 self.assertNotEqual(release2['uuid'], release3['uuid']) 105 self.assertNotEqual(release2['build'], release3['build']) 106 self.assertEquals(release2['version'], 2) 107 # disallow post/put/patch/delete 108 url = '/api/apps/{app_id}/releases'.format(**locals()) 109 self.assertEqual(self.client.post(url).status_code, 405) 110 self.assertEqual(self.client.put(url).status_code, 405) 111 self.assertEqual(self.client.patch(url).status_code, 405) 112 self.assertEqual(self.client.delete(url).status_code, 405) 113 return release3 114 115 @mock.patch('requests.post', mock_import_repository_task) 116 def test_release_rollback(self): 117 url = '/api/apps' 118 body = {'cluster': 'autotest'} 119 response = self.client.post(url, json.dumps(body), content_type='application/json') 120 self.assertEqual(response.status_code, 201) 121 app_id = response.data['id'] 122 # try to rollback with only 1 release extant, expecting 404 123 url = "/api/apps/{app_id}/releases/rollback/".format(**locals()) 124 response = self.client.post(url, content_type='application/json') 125 self.assertEqual(response.status_code, 404) 126 # update config to roll a new release 127 url = '/api/apps/{app_id}/config'.format(**locals()) 128 body = {'values': json.dumps({'NEW_URL1': 'http://localhost:8080/'})} 129 response = self.client.post( 130 url, json.dumps(body), content_type='application/json') 131 self.assertEqual(response.status_code, 201) 132 # update the build to roll a new release 133 url = '/api/apps/{app_id}/builds'.format(**locals()) 134 build_config = json.dumps({'PATH': 'bin:/usr/local/bin:/usr/bin:/bin'}) 135 body = {'image': 'autotest/example'} 136 response = self.client.post( 137 url, json.dumps(body), content_type='application/json') 138 self.assertEqual(response.status_code, 201) 139 # rollback and check to see that a 4th release was created 140 # with the build and config of release #2 141 url = "/api/apps/{app_id}/releases/rollback/".format(**locals()) 142 response = self.client.post(url, content_type='application/json') 143 self.assertEqual(response.status_code, 201) 144 url = '/api/apps/{app_id}/releases'.format(**locals()) 145 response = self.client.get(url, content_type='application/json') 146 self.assertEqual(response.status_code, 200) 147 self.assertEqual(response.data['count'], 4) 148 url = '/api/apps/{app_id}/releases/v2'.format(**locals()) 149 response = self.client.get(url, content_type='application/json') 150 self.assertEqual(response.status_code, 200) 151 release2 = response.data 152 self.assertEquals(release2['version'], 2) 153 url = '/api/apps/{app_id}/releases/v4'.format(**locals()) 154 response = self.client.get(url, content_type='application/json') 155 self.assertEqual(response.status_code, 200) 156 release4 = response.data 157 self.assertEquals(release4['version'], 4) 158 self.assertNotEqual(release2['uuid'], release4['uuid']) 159 self.assertEqual(release2['build'], release4['build']) 160 self.assertEqual(release2['config'], release4['config']) 161 # rollback explicitly to release #1 and check that a 5th release 162 # was created with the build and config of release #1 163 url = "/api/apps/{app_id}/releases/rollback/".format(**locals()) 164 body = {'version': 1} 165 response = self.client.post( 166 url, json.dumps(body), content_type='application/json') 167 self.assertEqual(response.status_code, 201) 168 url = '/api/apps/{app_id}/releases'.format(**locals()) 169 response = self.client.get(url, content_type='application/json') 170 self.assertEqual(response.status_code, 200) 171 self.assertEqual(response.data['count'], 5) 172 url = '/api/apps/{app_id}/releases/v1'.format(**locals()) 173 response = self.client.get(url) 174 self.assertEqual(response.status_code, 200) 175 release1 = response.data 176 url = '/api/apps/{app_id}/releases/v5'.format(**locals()) 177 response = self.client.get(url) 178 self.assertEqual(response.status_code, 200) 179 release5 = response.data 180 self.assertEqual(release5['version'], 5) 181 self.assertNotEqual(release1['uuid'], release5['uuid']) 182 self.assertEqual(release1['build'], release5['build']) 183 self.assertEqual(release1['config'], release5['config']) 184 # check to see that the current config is actually the initial one 185 url = "/api/apps/{app_id}/config".format(**locals()) 186 response = self.client.get(url) 187 self.assertEqual(response.status_code, 200) 188 self.assertEqual(response.data['values'], json.dumps({})) 189 # rollback to #3 and see that it has the correct config 190 url = "/api/apps/{app_id}/releases/rollback/".format(**locals()) 191 body = {'version': 3} 192 response = self.client.post( 193 url, json.dumps(body), content_type='application/json') 194 self.assertEqual(response.status_code, 201) 195 url = "/api/apps/{app_id}/config".format(**locals()) 196 response = self.client.get(url) 197 self.assertEqual(response.status_code, 200) 198 values = json.loads(response.data['values']) 199 self.assertIn('NEW_URL1', values) 200 self.assertEqual('http://localhost:8080/', values['NEW_URL1']) 201 202 @mock.patch('requests.post', mock_import_repository_task) 203 def test_release_str(self): 204 """Test the text representation of a release.""" 205 release3 = self.test_release() 206 release = Release.objects.get(uuid=release3['uuid']) 207 self.assertEqual(str(release), "{}-v3".format(release3['app'])) 208 209 @mock.patch('requests.post', mock_import_repository_task) 210 def test_release_summary(self): 211 """Test the text summary of a release.""" 212 release3 = self.test_release() 213 release = Release.objects.get(uuid=release3['uuid']) 214 # check that the release has push and env change messages 215 self.assertIn('autotest deployed ', release.summary)