def test_settings_contains_names_and_content_of_scripts(self): scripts = { factory.make_commissioning_script(), factory.make_commissioning_script(), } response = self.client.get(reverse('settings')) names = [script.name for script in scripts] contents = [script.content for script in scripts] self.assertThat(response.content, ContainsAll(names + contents))
def test_raises_if_duplicated_name(self): content = factory.getRandomString() name = factory.make_name('filename') factory.make_commissioning_script(name=name) uploaded_file = SimpleUploadedFile(content=content, name=name) form = CommissioningScriptForm(files={'content': uploaded_file}) self.assertEqual( (False, {'content': ["A script with that name already exists."]}), (form.is_valid(), form._errors))
def test_settings_contains_links_to_delete_scripts(self): scripts = { factory.make_commissioning_script(), factory.make_commissioning_script(), } links = get_content_links(self.client.get(reverse('settings'))) script_delete_links = [ reverse('commissioning-script-delete', args=[script.id]) for script in scripts] self.assertThat(links, ContainsAll(script_delete_links))
def test_settings_contains_links_to_delete_scripts(self): scripts = { factory.make_commissioning_script(), factory.make_commissioning_script(), } links = get_content_links(self.client.get(reverse('settings'))) script_delete_links = [ reverse('commissioning-script-delete', args=[script.id]) for script in scripts ] self.assertThat(links, ContainsAll(script_delete_links))
def test_GET_lists_commissioning_scripts(self): # Use lower-case names. The database and the test may use # different collation orders with different ideas about case # sensitivity. names = {factory.make_name('script').lower() for counter in range(5)} for name in names: factory.make_commissioning_script(name=name) response = self.client.get(self.get_url()) self.assertEqual((httplib.OK, sorted(names)), (response.status_code, json.loads(response.content)))
def test_GET_is_forbidden(self): # It's not inconceivable that commissioning scripts contain # credentials of some sort. There is no need for regular users # (consumers of the MAAS) to see these. script = factory.make_commissioning_script() response = self.client.get(self.get_url(script.name)) self.assertEqual(httplib.FORBIDDEN, response.status_code)
def test_can_delete_commissioning_script(self): script = factory.make_commissioning_script() delete_link = reverse('commissioning-script-delete', args=[script.id]) response = self.client.post(delete_link, {'post': 'yes'}) self.assertEqual((httplib.FOUND, reverse('settings')), (response.status_code, extract_redirect(response))) self.assertFalse( CommissioningScript.objects.filter(id=script.id).exists())
def test_get_archive_wraps_all_scripts(self): scripts = {factory.make_commissioning_script() for counter in range(3)} archive = open_tarfile(CommissioningScript.objects.get_archive()) self.assertThat( archive.getnames(), ContainsAll({ os.path.join(ARCHIVE_PREFIX, script.name) for script in scripts }))
def test_can_delete_commissioning_script(self): script = factory.make_commissioning_script() delete_link = reverse('commissioning-script-delete', args=[script.id]) response = self.client.post(delete_link, {'post': 'yes'}) self.assertEqual( (httplib.FOUND, reverse('settings')), (response.status_code, extract_redirect(response))) self.assertFalse( CommissioningScript.objects.filter(id=script.id).exists())
def test_PUT_updates_contents(self): old_content = b'old:%s' % factory.getRandomString().encode('ascii') script = factory.make_commissioning_script(content=old_content) new_content = b'new:%s' % factory.getRandomString().encode('ascii') response = self.client_put( self.get_url(script.name), {'content': factory.make_file_upload(content=new_content)}) self.assertEqual(httplib.OK, response.status_code) self.assertEqual(new_content, reload_object(script).content)
def test_get_archive_initializes_file_timestamps(self): # The mtime on a file inside the tarball is reasonable. # It would otherwise default to the Epoch, and GNU tar warns # annoyingly about improbably old files. start_time = floor(time.time()) script = factory.make_commissioning_script() path = os.path.join(ARCHIVE_PREFIX, script.name) archive = open_tarfile(CommissioningScript.objects.get_archive()) timestamp = archive.getmember(path).mtime end_time = ceil(time.time()) self.assertGreaterEqual(timestamp, start_time) self.assertLessEqual(timestamp, end_time)
def test_commissioning_scripts(self): script = factory.make_commissioning_script() response = make_node_client().get( reverse('commissioning-scripts', args=['latest'])) self.assertEqual( httplib.OK, response.status_code, "Unexpected response %d: %s" % (response.status_code, response.content)) self.assertIn( response['Content-Type'], { 'application/tar', 'application/x-gtar', 'application/x-tar', 'application/x-tgz', }) archive = tarfile.open(fileobj=BytesIO(response.content)) self.assertIn(os.path.join(ARCHIVE_PREFIX, script.name), archive.getnames())
def test_commissioning_scripts(self): script = factory.make_commissioning_script() response = self.make_node_client().get( reverse('commissioning-scripts', args=['latest'])) self.assertEqual( httplib.OK, response.status_code, "Unexpected response %d: %s" % (response.status_code, response.content)) self.assertIn( response['Content-Type'], { 'application/tar', 'application/x-gtar', 'application/x-tar', 'application/x-tgz', }) archive = tarfile.open(fileobj=BytesIO(response.content)) self.assertIn( os.path.join(ARCHIVE_PREFIX, script.name), archive.getnames())
def test_DELETE_deletes_script(self): script = factory.make_commissioning_script() self.client.delete(self.get_url(script.name)) self.assertItemsEqual( [], CommissioningScript.objects.filter(name=script.name))
def test_get_archive_sets_sensible_mode(self): for counter in range(3): factory.make_commissioning_script() archive = open_tarfile(CommissioningScript.objects.get_archive()) self.assertEqual({0755}, {info.mode for info in archive.getmembers()})
def test_get_archive_supports_binary_scripts(self): script = factory.make_commissioning_script(content=sample_binary_data) path = os.path.join(ARCHIVE_PREFIX, script.name) archive = open_tarfile(CommissioningScript.objects.get_archive()) self.assertEqual(script.content, archive.extractfile(path).read())
def test_get_archive_wraps_scripts_in_tar(self): script = factory.make_commissioning_script() path = os.path.join(ARCHIVE_PREFIX, script.name) archive = open_tarfile(CommissioningScript.objects.get_archive()) self.assertTrue(archive.getmember(path).isfile()) self.assertEqual(script.content, archive.extractfile(path).read())
def test_GET_returns_script_contents(self): script = factory.make_commissioning_script() response = self.client.get(self.get_url(script.name)) self.assertEqual(httplib.OK, response.status_code) self.assertEqual(script.content, response.content)
def test_DELETE_is_forbidden(self): script = factory.make_commissioning_script() response = self.client_put(self.get_url(script.name)) self.assertEqual(httplib.FORBIDDEN, response.status_code)
def test_PUT_is_forbidden(self): script = factory.make_commissioning_script() response = self.client_put(self.get_url(script.name), {'content': factory.getRandomString()}) self.assertEqual(httplib.FORBIDDEN, response.status_code)
def test_GET_preserves_binary_data(self): script = factory.make_commissioning_script(content=sample_binary_data) response = self.client.get(self.get_url(script.name)) self.assertEqual(httplib.OK, response.status_code) self.assertEqual(sample_binary_data, response.content)