test_controller.py (9692B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\skins\test\test_controller.py 2 import __builtin__ 3 import contextlib 4 import mock 5 import unittest 6 import signals 7 from testhelpers.evemocks import SMMock 8 from testsuites.testcases import ClientTestCase 9 10 class MockSkin(object): 11 12 def __init__(self, materialID, skinID = None, licensed = False): 13 self.materialID = materialID 14 self.skinID = skinID 15 self.licensed = licensed 16 17 @property 18 def material(self): 19 return str(self.materialID) 20 21 def __eq__(self, other): 22 if other is None: 23 return False 24 return self.materialID == other.materialID and self.skinID == other.skinID and self.licensed == other.licensed 25 26 def __repr__(self): 27 return '<MockSkin materialID=%s skinID=%s licensed=%s>' % (self.materialID, self.skinID, self.licensed) 28 29 30 class MockFittingController(object): 31 32 def __init__(self, itemID, typeID): 33 self.itemID = itemID 34 self.typeID = typeID 35 self.on_new_itemID = signals.Signal(signalName='on_new_itemID') 36 self.material = None 37 38 def GetItemID(self): 39 return self.itemID 40 41 def GetTypeID(self): 42 return self.typeID 43 44 def UpdateItem(self, itemID, typeID): 45 oldItemID = self.itemID 46 oldTypeID = self.typeID 47 self.itemID = itemID 48 self.typeID = typeID 49 self.on_new_itemID(self.itemID, oldItemID, self.typeID, oldTypeID) 50 51 def SetSkinMaterial(self, material): 52 self.material = material 53 54 55 class MockLock(object): 56 57 def __init__(self, lock): 58 self._lock = lock 59 60 def __enter__(self): 61 self._lock.acquire() 62 63 def __exit__(self, ex_type, ex_value, traceback): 64 self._lock.release() 65 return ex_type is None 66 67 @property 68 def acquire(self): 69 return self._lock.acquire 70 71 @property 72 def release(self): 73 return self._lock.release 74 75 76 TYPE_ID = 1 77 OTHER_TYPE_ID = 2 78 SKIN_ID = 10 79 SKIN = MockSkin(materialID=1) 80 OTHER_SKIN = MockSkin(materialID=2) 81 LICENSED_SKIN = MockSkin(materialID=1, skinID=20, licensed=True) 82 OTHER_LICENSED_SKIN = MockSkin(materialID=2, skinID=30, licensed=True) 83 UNLICENSED_SKIN = MockSkin(materialID=3, licensed=False) 84 OTHER_UNLICENSED_SKIN = MockSkin(materialID=4, licensed=False) 85 ITEM_ID = 100 86 OTHER_ITEM_ID = 200 87 88 class SkinPanelControllerBase(ClientTestCase): 89 90 @classmethod 91 def setUpClass(cls): 92 super(SkinPanelControllerBase, cls).setUpClass() 93 cls.locks_module = mock.Mock() 94 mock_modules = {'uthread': mock.Mock(), 95 'locks': cls.locks_module, 96 'trinity': mock.Mock()} 97 cls.import_patcher = mock.patch.dict('sys.modules', mock_modules) 98 cls.import_patcher.start() 99 from eve.client.script.ui.shared.skins import controller 100 cls.module = controller 101 102 @classmethod 103 def tearDownClass(cls): 104 super(SkinPanelControllerBase, cls).tearDownClass() 105 cls.import_patcher.stop() 106 107 def setUp(self): 108 super(SkinPanelControllerBase, self).setUp() 109 self.lock = MockLock(mock.MagicMock()) 110 self.locks_module.Lock.return_value = self.lock 111 112 def prime_skins_cache(self, cached = None, fresh = None): 113 cached = cached or [] 114 fresh = fresh or [] 115 self.adapter.GetSkins.return_value = cached 116 self.controller.skins 117 self.adapter.GetSkins.return_value = fresh 118 119 def assertSkinState(self, applied = None, pending = None, previewed = None): 120 if applied is None: 121 self.assertIsNone(self.controller.applied) 122 else: 123 self.assertEqual(self.controller.applied, applied) 124 if pending is None: 125 self.assertIsNone(self.controller.pending) 126 else: 127 self.assertEqual(self.controller.pending, pending) 128 if previewed is None: 129 self.assertIsNone(self.controller.previewed) 130 else: 131 self.assertEqual(self.controller.previewed, previewed) 132 133 @contextlib.contextmanager 134 def assertLockedTransaction(self): 135 self.lock.acquire.reset_mock() 136 self.lock.release.reset_mock() 137 try: 138 yield 139 finally: 140 self.lock.acquire.assert_called_once_with() 141 self.lock.release.assert_called_once_with() 142 143 @contextlib.contextmanager 144 def assertNotLockedTransaction(self): 145 self.lock.acquire.reset_mock() 146 self.lock.release.reset_mock() 147 try: 148 yield 149 finally: 150 self.assertFalse(self.lock.acquire.called) 151 self.assertFalse(self.lock.release.called) 152 153 154 class TestSkinPanelController(SkinPanelControllerBase): 155 SKIN_LIST = [SKIN, OTHER_SKIN] 156 157 def setUp(self): 158 super(TestSkinPanelController, self).setUp() 159 self.adapter = mock.Mock(spec=self.module.SkinPanelAdapter) 160 self.adapter.GetSkins.return_value = self.SKIN_LIST 161 self.adapter.GetTypesForSkin.return_value = [TYPE_ID] 162 __builtin__.sm = SMMock() 163 self.controller = self.module.SkinPanelController(adapter=self.adapter, hullTypeID=TYPE_ID) 164 self.events = mock.Mock() 165 self.controller.onChange.connect(self.events.onChange) 166 self.controller.onSkinsChange.connect(self.events.onSkinsChange) 167 168 def test_initial_state(self): 169 self.assertEqual(self.controller.typeID, TYPE_ID) 170 self.assertSkinState(applied=None, previewed=None, pending=None) 171 172 @unittest.skip('test is failing and needs fixing') 173 def test_change_type(self): 174 with self.assertLockedTransaction(): 175 self.controller.typeID = OTHER_TYPE_ID 176 self.events.onChange.assert_called_once_with() 177 self.events.onSkinsChange.assert_called_once_with() 178 self.assertEqual(self.controller.typeID, OTHER_TYPE_ID) 179 self.assertSkinState(applied=None, previewed=None, pending=None) 180 181 @unittest.skip('test is failing and needs fixing') 182 def test_pick_skin(self): 183 with self.assertLockedTransaction(): 184 self.controller.PickSkin(SKIN) 185 self.events.onChange.assert_called_once_with() 186 self.assertSkinState(previewed=SKIN) 187 188 def test_change_type_resets_picked_skin(self): 189 self.controller.PickSkin(SKIN) 190 self.controller.typeID = OTHER_TYPE_ID 191 self.assertSkinState(applied=None, previewed=None, pending=None) 192 193 def test_pick_same_skin_again(self): 194 self.controller.PickSkin(SKIN) 195 self.controller.PickSkin(SKIN) 196 self.assertSkinState(applied=None, previewed=None, pending=None) 197 198 def test_pick_none_skin_after_another_skin(self): 199 self.controller.PickSkin(SKIN) 200 self.controller.PickSkin(None) 201 self.assertSkinState(applied=None, previewed=None, pending=None) 202 203 def test_pick_another_skin(self): 204 self.controller.PickSkin(SKIN) 205 self.controller.PickSkin(OTHER_SKIN) 206 self.assertSkinState(previewed=OTHER_SKIN) 207 208 def test_change_type_with_picked_skin(self): 209 self.controller.PickSkin(SKIN) 210 self.controller.typeID = OTHER_TYPE_ID 211 self.assertEqual(self.controller.typeID, OTHER_TYPE_ID) 212 self.assertSkinState(previewed=None) 213 214 def test_get_skins(self): 215 self.adapter.GetSkins.return_value = self.SKIN_LIST 216 skins = self.controller.skins 217 self.assertItemsEqual(skins, self.SKIN_LIST) 218 219 def test_skins_are_cached(self): 220 self.prime_skins_cache(cached=self.SKIN_LIST) 221 with self.assertNotLockedTransaction(): 222 skins = self.controller.skins 223 self.assertItemsEqual(skins, self.SKIN_LIST) 224 225 def test_changing_type_resets_skins_cache(self): 226 self.prime_skins_cache(fresh=self.SKIN_LIST) 227 self.controller.typeID = OTHER_TYPE_ID 228 self.assertItemsEqual(self.controller.skins, self.SKIN_LIST) 229 230 @unittest.skip('test is failing and needs fixing') 231 def test_controller_registers_for_events(self): 232 self.assertIn('OnSkinLicenseActivated', self.controller.__notifyevents__) 233 self.adapter.RegisterNotify.assert_called_once_with(self.controller) 234 235 @unittest.skip('test is failing and needs fixing') 236 def test_skin_license_activated_event(self): 237 with self.assertLockedTransaction(): 238 self.controller.OnSkinLicenseActivated(SKIN_ID) 239 self.events.onChange.assert_called_once_with() 240 self.events.onSkinsChange.assert_called_once_with() 241 242 @unittest.skip('test is failing and needs fixing') 243 def test_skins_cache_is_reset_on_license_activated_for_relevant_type(self): 244 self.prime_skins_cache(fresh=self.SKIN_LIST) 245 self.controller.OnSkinLicenseActivated(SKIN_ID) 246 self.assertItemsEqual(self.controller.skins, self.SKIN_LIST) 247 248 @unittest.skip('test is failing and needs fixing') 249 def test_skins_cache_is_not_reset_on_license_activated_for_irrelevant_type(self): 250 self.adapter.GetTypesForSkin.return_value = [OTHER_TYPE_ID] 251 self.prime_skins_cache(cached=self.SKIN_LIST) 252 self.controller.OnSkinLicenseActivated(SKIN_ID) 253 self.assertItemsEqual(self.controller.skins, self.SKIN_LIST) 254 255 @unittest.skip('test is failing and needs fixing') 256 def test_license_activated_does_not_change_preview_state(self): 257 self.controller.PickSkin(SKIN) 258 self.adapter.GetSkins.return_value = [LICENSED_SKIN] 259 self.events.onChange.reset_mock() 260 self.controller.OnSkinLicenseActivated(LICENSED_SKIN.skinID) 261 self.events.onChange.assert_called_once_with() 262 self.events.onSkinsChange.assert_called_once_with() 263 self.assertSkinState(previewed=LICENSED_SKIN) 264 265 266 if __name__ == '__main__': 267 unittest.main()