# Copyright 2012 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # # Copyright 2012 Nebula, Inc. # # 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. from unittest import mock from urllib import parse from django.urls import reverse from openstack_dashboard import api from openstack_dashboard.dashboards.project.key_pairs.forms \ import KEYPAIR_ERROR_MESSAGES from openstack_dashboard.test import helpers as test from openstack_dashboard.usage import quotas INDEX_URL = reverse('horizon:project:key_pairs:index') class KeyPairTests(test.TestCase): @test.create_mocks({api.nova: ('keypair_list',), quotas: ('tenant_quota_usages',)}) def test_index(self): keypairs = self.keypairs.list() quota_data = self.quota_usages.first() self.mock_tenant_quota_usages.return_value = quota_data self.mock_keypair_list.return_value = keypairs res = self.client.get(INDEX_URL) self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html') self.assertCountEqual(res.context['keypairs_table'].data, keypairs) self.assert_mock_multiple_calls_with_same_arguments( self.mock_tenant_quota_usages, 4, mock.call(test.IsHttpRequest(), targets=('key_pairs', ))) self.mock_keypair_list.assert_called_once_with(test.IsHttpRequest()) @test.create_mocks({api.nova: ('keypair_list', 'keypair_delete')}) def test_delete_keypair(self): keypair = self.keypairs.first() self.mock_keypair_list.return_value = self.keypairs.list() self.mock_keypair_delete.return_value = None keypair_name = parse.quote(keypair.name) formData = {'action': 'keypairs__delete__%s' % keypair_name} res = self.client.post(INDEX_URL, formData) self.assertRedirectsNoFollow(res, INDEX_URL) self.mock_keypair_list.assert_called_once_with(test.IsHttpRequest()) self.mock_keypair_delete.assert_called_once_with(test.IsHttpRequest(), keypair.name) @test.create_mocks({api.nova: ('keypair_list', 'keypair_delete')}) def test_delete_keypair_exception(self): keypair = self.keypairs.first() self.mock_keypair_list.return_value = self.keypairs.list() self.mock_keypair_delete.side_effect = self.exceptions.nova keypair_name = parse.quote(keypair.name) formData = {'action': 'keypairs__delete__%s' % keypair_name} res = self.client.post(INDEX_URL, formData) self.assertRedirectsNoFollow(res, INDEX_URL) self.mock_keypair_list.assert_called_once_with(test.IsHttpRequest()) self.mock_keypair_delete.assert_called_once_with(test.IsHttpRequest(), keypair.name) @test.create_mocks({api.nova: ('keypair_get',)}) def test_keypair_detail_get(self): keypair = self.keypairs.first() keypair.private_key = "secret" self.mock_keypair_get.return_value = keypair context = {'keypair_name': keypair.name} url = reverse('horizon:project:key_pairs:detail', kwargs={'keypair_name': keypair.name}) res = self.client.get(url, context) self.assertContains(res, "