def test_try_assign_hostname_category_without_code(self): bo_asset_2 = BackOfficeAssetFactory(model=self.model_without_code, hostname='abcd') bo_asset_2._try_assign_hostname(commit=True) self.assertEqual(bo_asset_2.hostname, 'abcd')
class TestBackOfficeAssetTransitions(TransitionTestCase, RalphTestCase): @classmethod def setUpClass(cls): super().setUpClass() cls.user_pl = UserFactory(country=Country.pl) cls.region_pl = RegionFactory(name='PL', country=Country.pl) cls.region_us = RegionFactory(name='US', country=Country.us) cls.region_us_2 = RegionFactory(name='US', country=Country.us) cls.category = CategoryFactory(code='PC') cls.model = BackOfficeAssetModelFactory(category=cls.category) def setUp(self): super().setUp() AssetLastHostname.objects.create(prefix='POLPC', counter=1000) self.bo_asset = BackOfficeAssetFactory( model=self.model, hostname='abc', region=self.region_us, ) self.bo_asset._try_assign_hostname(commit=True, force=True) self.request = RequestFactory().get('/assets/') self.request.user = self.user_pl # ugly hack from https://code.djangoproject.com/ticket/17971 setattr(self.request, 'session', 'session') messages = FallbackStorage(self.request) setattr(self.request, '_messages', messages) def test_convert_to_data_center_asset(self): bo_asset = BackOfficeAssetFactory() transition = Transition.objects.create( name='transition', model=TransitionModel.get_for_field(bo_asset, 'status'), source=0, target=0, ) bo_asset_pk = bo_asset.pk hostname = bo_asset.hostname rack = RackFactory() BackOfficeAsset.convert_to_data_center_asset( instances=[bo_asset], rack=rack.id, service_env=ServiceEnvironmentFactory().id, position=1, model=DataCenterAssetModelFactory().id, request=None, transition_id=transition.pk, ) dc_asset = DataCenterAsset.objects.get(pk=bo_asset_pk) self.assertEqual(dc_asset.rack.id, rack.id) self.assertFalse( BackOfficeAsset.objects.filter(pk=bo_asset_pk).exists()) self.assertEqual(dc_asset.hostname, hostname) def test_convert_to_data_center_asset_preserves_status_name(self): bo_asset = BackOfficeAssetFactory( status=BackOfficeAssetStatus.from_name('damaged')) transition = Transition.objects.create( name='transition', model=TransitionModel.get_for_field(bo_asset, 'status'), source=0, target=0, ) bo_asset_pk = bo_asset.pk bo_asset_status_name = BackOfficeAssetStatus.from_id( bo_asset.status).name rack = RackFactory() BackOfficeAsset.convert_to_data_center_asset( instances=[bo_asset], rack=rack.id, service_env=ServiceEnvironmentFactory().id, position=1, model=DataCenterAssetModelFactory().id, request=None, transition_id=transition.pk, ) dc_asset = DataCenterAsset.objects.get(pk=bo_asset_pk) dc_asset_status_name = DataCenterAssetStatus.from_id( dc_asset.status).name self.assertEqual(bo_asset_status_name, dc_asset_status_name) def test_convert_to_data_center_asset_uses_default_from_transition(self): target_status_id = DataCenterAssetStatus.from_name( "new" # status name common for dc_asset and bo_asset ).id bo_asset = BackOfficeAssetFactory( status=BackOfficeAssetStatus.from_name('damaged')) transition = Transition.objects.create( name='transition', model=TransitionModel.get_for_field(bo_asset, 'status'), source=0, target=target_status_id, ) bo_asset_pk = bo_asset.pk target_status_name = BackOfficeAssetStatus.from_id( target_status_id).name rack = RackFactory() BackOfficeAsset.convert_to_data_center_asset( instances=[bo_asset], rack=rack.id, service_env=ServiceEnvironmentFactory().id, position=1, model=DataCenterAssetModelFactory().id, request=None, transition_id=transition.pk, ) dc_asset = DataCenterAsset.objects.get(pk=bo_asset_pk) dc_asset_status_name = DataCenterAssetStatus.from_id( dc_asset.status).name self.assertEqual(target_status_name, dc_asset_status_name) def test_convert_to_data_center_asset_uses_default_from_settings(self): target_status_id = DataCenterAssetStatus.from_id( settings.CONVERT_TO_DATACENTER_ASSET_DEFAULT_STATUS_ID).id bo_asset = BackOfficeAssetFactory( status=BackOfficeAssetStatus.from_name('damaged')) transition = Transition.objects.create( name='transition', model=TransitionModel.get_for_field(bo_asset, 'status'), source=0, target=target_status_id, ) bo_asset_pk = bo_asset.pk target_status_name = BackOfficeAssetStatus.from_id( target_status_id).name rack = RackFactory() BackOfficeAsset.convert_to_data_center_asset( instances=[bo_asset], rack=rack.id, service_env=ServiceEnvironmentFactory().id, position=1, model=DataCenterAssetModelFactory().id, request=None, transition_id=transition.pk, ) dc_asset = DataCenterAsset.objects.get(pk=bo_asset_pk) dc_asset_status_name = DataCenterAssetStatus.from_id( dc_asset.status).name self.assertEqual(target_status_name, dc_asset_status_name) def test_assign_many_licences(self): asset = BackOfficeAssetFactory() licences = [LicenceFactory() for i in range(2)] self.assertFalse(asset.licences.all()) BackOfficeAsset.assign_licence( instances=[asset], request=None, licences=licences, ) self.assertCountEqual( [base_obj_lic.licence.id for base_obj_lic in asset.licences.all()], [licence.id for licence in licences], ) def test_change_hostname(self): _, transition, _ = self._create_transition( model=self.bo_asset, name='test', source=[BackOfficeAssetStatus.new.id], target=BackOfficeAssetStatus.used.id, actions=['change_hostname']) run_field_transition([self.bo_asset], field='status', transition_obj_or_name=transition, data={'change_hostname__country': Country.pl}, requester=self.request.user) self.assertEqual(self.bo_asset.hostname, 'POLPC01001') def test_assign_owner(self): _, transition, _ = self._create_transition( model=self.bo_asset, name='test', source=[BackOfficeAssetStatus.new.id], target=BackOfficeAssetStatus.used.id, actions=['assign_owner']) run_field_transition([self.bo_asset], field='status', transition_obj_or_name=transition, data={'assign_owner__owner': self.user_pl.id}, requester=self.request.user) def test_assign_hostname_assigns_hostname_when_its_empty(self): hostname = '' self.bo_asset = BackOfficeAssetFactory( model=self.model, hostname=hostname, region=self.region_us, ) _, transition, _ = self._create_transition( model=self.bo_asset, name='assign_hostname_if_empty_or_country_not_match', source=[BackOfficeAssetStatus.new.id], target=BackOfficeAssetStatus.used.id, actions=['assign_hostname_if_empty_or_country_not_match']) self.assertEquals(self.bo_asset.hostname, hostname) run_field_transition([self.bo_asset], field='status', transition_obj_or_name=transition, data={}, requester=self.request.user) self.assertNotEquals(self.bo_asset.hostname, hostname) def test_assign_hostname_skips_hostname_when_its_already_set(self): # hostname must include country-code to be skipped during assigning hostname = 'the-same-hostname-across-transitions-{}'.format('USA') self.bo_asset = BackOfficeAssetFactory( model=self.model, hostname=hostname, region=self.region_us, ) _, transition, _ = self._create_transition( model=self.bo_asset, name='assign_hostname_if_empty_or_country_not_match', source=[BackOfficeAssetStatus.new.id], target=BackOfficeAssetStatus.used.id, actions=['assign_hostname_if_empty_or_country_not_match']) self.assertEquals(self.bo_asset.hostname, hostname) run_field_transition([self.bo_asset], field='status', transition_obj_or_name=transition, data={}, requester=self.request.user) self.assertEquals(self.bo_asset.hostname, hostname) def test_return_report_when_user_not_assigned(self): _, transition, _ = self._create_transition( model=self.bo_asset, name='test', source=[BackOfficeAssetStatus.new.id], target=BackOfficeAssetStatus.used.id, actions=['return_report']) with self.assertRaises(TransitionNotAllowedError): _check_instances_for_transition(instances=[self.bo_asset], transition=transition, requester=self.user_pl) def test_return_report_when_requester_is_not_assets_owner(self): _, transition, _ = self._create_transition( model=self.bo_asset, name='test', source=[BackOfficeAssetStatus.new.id], target=BackOfficeAssetStatus.used.id, actions=['must_be_owner_of_asset']) with self.assertRaises(TransitionNotAllowedError): _check_instances_for_transition(instances=[self.bo_asset], transition=transition, requester=self.user_pl) @patch.object(ExternalService, "run") def test_a_report_is_generated(self, mock_method): GENERATED_FILE_CONTENT = REPORT_TEMPLATE = b'some-content' mock_method.return_value = GENERATED_FILE_CONTENT report_template = ReportTemplateFactory(template__data=REPORT_TEMPLATE) user = UserFactory() instances = [ BackOfficeAssetFactory( user=UserFactory(first_name="James", last_name="Bond")) ] attachment = BackOfficeAsset._generate_report(report_template.name, user, instances, report_template.language) correct_filename = '{}_{}-{}_{}.pdf'.format( timezone.now().isoformat()[:10], 'james', 'bond', report_template.report.name, ) self.assertEqual(attachment.original_filename, correct_filename) self.assertEqual(attachment.file.read(), GENERATED_FILE_CONTENT) @patch('ralph.back_office.helpers.get_email_context_for_transition') def test_send_attachments_to_user_action_sends_email(self, mockemctx): mockemctx.return_value = EmailContext(from_email="*****@*****.**", subject="sub", body="bod") bo_asset = BackOfficeAssetFactory(model=self.model) _, transition, _ = self._create_transition( model=bo_asset, name='transition name', source=[BackOfficeAssetStatus.new.id], target=BackOfficeAssetStatus.used.id, actions=['return_report']) attachment = Attachment.objects.create( file=SimpleUploadedFile('test_file.pdf', b'some content', content_type='application/pdf'), uploaded_by=self.user_pl, ) bo_asset.send_attachments_to_user(self.user_pl, transition.id, attachments=[attachment]) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].from_email, "*****@*****.**") def test_send_attachments_to_user_action_dont_send_email_without_attachments( self): # noqa: E501 bo_asset = BackOfficeAssetFactory(model=self.model) _, transition, _ = self._create_transition( model=self.bo_asset, name='transition name', source=[BackOfficeAssetStatus.new.id], target=BackOfficeAssetStatus.used.id, actions=['return_report']) bo_asset.send_attachments_to_user(self.user_pl, transition.id) self.assertEqual(len(mail.outbox), 0)
class TestBackOfficeAsset(RalphTestCase): @classmethod def setUpClass(cls): super().setUpClass() cls.region_pl = RegionFactory(name='PL', country=Country.pl) cls.region_us = RegionFactory(name='US', country=Country.us) cls.category = CategoryFactory(code='PC') cls.category_without_code = CategoryFactory() cls.model = BackOfficeAssetModelFactory(category=cls.category) cls.model_without_code = BackOfficeAssetModelFactory( category=cls.category_without_code) def setUp(self): super().setUp() AssetLastHostname.objects.create(prefix='POLPC', counter=1000) self.bo_asset = BackOfficeAssetFactory( model=self.model, hostname='abc', region=self.region_pl, ) self.bo_asset_2 = BackOfficeAssetFactory( model=self.model, hostname='abc2', region=self.region_pl, status=BackOfficeAssetStatus.liquidated.id, invoice_date=None) self.bo_asset_3 = BackOfficeAssetFactory( model=self.model, hostname='abc3', region=self.region_pl, status=BackOfficeAssetStatus.liquidated.id, invoice_date=datetime(2016, 1, 11).date(), depreciation_rate=50) self.bo_asset_4 = BackOfficeAssetFactory( model=self.model, hostname='abc3', region=self.region_pl, status=BackOfficeAssetStatus.liquidated.id, invoice_date=datetime(2016, 1, 11).date(), depreciation_end_date=datetime(2015, 1, 11).date(), depreciation_rate=50) self.category_parent = CategoryFactory(code='Mob1', default_depreciation_rate=30) self.category_2 = CategoryFactory(code='Mob2', default_depreciation_rate=25) self.category_3 = CategoryFactory(code='Mob3', parent=self.category_parent, default_depreciation_rate=0) def test_try_assign_hostname(self): self.bo_asset._try_assign_hostname(commit=True) self.assertEqual(self.bo_asset.hostname, 'POLPC01001') def test_try_assign_hostname_no_change(self): self.bo_asset.hostname = 'POLPC01001' self.bo_asset.save() self.bo_asset._try_assign_hostname(commit=True) self.assertEqual(self.bo_asset.hostname, 'POLPC01001') def test_try_assign_hostname_no_hostname(self): self.bo_asset.hostname = '' self.bo_asset.save() self.bo_asset._try_assign_hostname(commit=True) self.assertEqual(self.bo_asset.hostname, 'POLPC01001') def test_try_assign_hostname_forced(self): self.bo_asset.hostname = 'POLPC001010' self.bo_asset.save() self.bo_asset._try_assign_hostname(commit=True, force=True) self.assertEqual(self.bo_asset.hostname, 'POLPC01001') def test_try_assign_hostname_with_country(self): self.bo_asset._try_assign_hostname(country='US', commit=True) self.assertEqual(self.bo_asset.hostname, 'USPC00001') def test_try_assign_hostname_category_without_code(self): bo_asset_2 = BackOfficeAssetFactory(model=self.model_without_code, hostname='abcd') bo_asset_2._try_assign_hostname(commit=True) self.assertEqual(bo_asset_2.hostname, 'abcd') def test_get_autocomplete_queryset(self): queryset = BackOfficeAsset.get_autocomplete_queryset() self.assertEquals(1, queryset.count()) def test_buyout_date(self): self.assertEqual(self.bo_asset_3.buyout_date, datetime(2018, 2, 11).date()) self.assertEqual(self.bo_asset_2.buyout_date, None) def test_butout_date_with_depreciation_end_date(self): self.assertEqual(self.bo_asset_4.buyout_date, datetime(2015, 1, 11).date()) def test_get_depreciation_rate(self): self.assertEqual(self.category_2.get_default_depreciation_rate(), 25) self.assertEqual(self.category_3.get_default_depreciation_rate(), 30)