17db96d56Sopenharmony_ciimport math 27db96d56Sopenharmony_ciimport unittest 37db96d56Sopenharmony_ciimport os 47db96d56Sopenharmony_cifrom asyncio import iscoroutinefunction 57db96d56Sopenharmony_cifrom unittest.mock import AsyncMock, Mock, MagicMock, _magics 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ciclass TestMockingMagicMethods(unittest.TestCase): 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci def test_deleting_magic_methods(self): 127db96d56Sopenharmony_ci mock = Mock() 137db96d56Sopenharmony_ci self.assertFalse(hasattr(mock, '__getitem__')) 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ci mock.__getitem__ = Mock() 167db96d56Sopenharmony_ci self.assertTrue(hasattr(mock, '__getitem__')) 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ci del mock.__getitem__ 197db96d56Sopenharmony_ci self.assertFalse(hasattr(mock, '__getitem__')) 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci def test_magicmock_del(self): 237db96d56Sopenharmony_ci mock = MagicMock() 247db96d56Sopenharmony_ci # before using getitem 257db96d56Sopenharmony_ci del mock.__getitem__ 267db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: mock['foo']) 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ci mock = MagicMock() 297db96d56Sopenharmony_ci # this time use it first 307db96d56Sopenharmony_ci mock['foo'] 317db96d56Sopenharmony_ci del mock.__getitem__ 327db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: mock['foo']) 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ci def test_magic_method_wrapping(self): 367db96d56Sopenharmony_ci mock = Mock() 377db96d56Sopenharmony_ci def f(self, name): 387db96d56Sopenharmony_ci return self, 'fish' 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci mock.__getitem__ = f 417db96d56Sopenharmony_ci self.assertIsNot(mock.__getitem__, f) 427db96d56Sopenharmony_ci self.assertEqual(mock['foo'], (mock, 'fish')) 437db96d56Sopenharmony_ci self.assertEqual(mock.__getitem__('foo'), (mock, 'fish')) 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ci mock.__getitem__ = mock 467db96d56Sopenharmony_ci self.assertIs(mock.__getitem__, mock) 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci def test_magic_methods_isolated_between_mocks(self): 507db96d56Sopenharmony_ci mock1 = Mock() 517db96d56Sopenharmony_ci mock2 = Mock() 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_ci mock1.__iter__ = Mock(return_value=iter([])) 547db96d56Sopenharmony_ci self.assertEqual(list(mock1), []) 557db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: list(mock2)) 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci def test_repr(self): 597db96d56Sopenharmony_ci mock = Mock() 607db96d56Sopenharmony_ci self.assertEqual(repr(mock), "<Mock id='%s'>" % id(mock)) 617db96d56Sopenharmony_ci mock.__repr__ = lambda s: 'foo' 627db96d56Sopenharmony_ci self.assertEqual(repr(mock), 'foo') 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_ci def test_str(self): 667db96d56Sopenharmony_ci mock = Mock() 677db96d56Sopenharmony_ci self.assertEqual(str(mock), object.__str__(mock)) 687db96d56Sopenharmony_ci mock.__str__ = lambda s: 'foo' 697db96d56Sopenharmony_ci self.assertEqual(str(mock), 'foo') 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ci def test_dict_methods(self): 737db96d56Sopenharmony_ci mock = Mock() 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: mock['foo']) 767db96d56Sopenharmony_ci def _del(): 777db96d56Sopenharmony_ci del mock['foo'] 787db96d56Sopenharmony_ci def _set(): 797db96d56Sopenharmony_ci mock['foo'] = 3 807db96d56Sopenharmony_ci self.assertRaises(TypeError, _del) 817db96d56Sopenharmony_ci self.assertRaises(TypeError, _set) 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci _dict = {} 847db96d56Sopenharmony_ci def getitem(s, name): 857db96d56Sopenharmony_ci return _dict[name] 867db96d56Sopenharmony_ci def setitem(s, name, value): 877db96d56Sopenharmony_ci _dict[name] = value 887db96d56Sopenharmony_ci def delitem(s, name): 897db96d56Sopenharmony_ci del _dict[name] 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ci mock.__setitem__ = setitem 927db96d56Sopenharmony_ci mock.__getitem__ = getitem 937db96d56Sopenharmony_ci mock.__delitem__ = delitem 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ci self.assertRaises(KeyError, lambda: mock['foo']) 967db96d56Sopenharmony_ci mock['foo'] = 'bar' 977db96d56Sopenharmony_ci self.assertEqual(_dict, {'foo': 'bar'}) 987db96d56Sopenharmony_ci self.assertEqual(mock['foo'], 'bar') 997db96d56Sopenharmony_ci del mock['foo'] 1007db96d56Sopenharmony_ci self.assertEqual(_dict, {}) 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci def test_numeric(self): 1047db96d56Sopenharmony_ci original = mock = Mock() 1057db96d56Sopenharmony_ci mock.value = 0 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: mock + 3) 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci def add(self, other): 1107db96d56Sopenharmony_ci mock.value += other 1117db96d56Sopenharmony_ci return self 1127db96d56Sopenharmony_ci mock.__add__ = add 1137db96d56Sopenharmony_ci self.assertEqual(mock + 3, mock) 1147db96d56Sopenharmony_ci self.assertEqual(mock.value, 3) 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci del mock.__add__ 1177db96d56Sopenharmony_ci def iadd(mock): 1187db96d56Sopenharmony_ci mock += 3 1197db96d56Sopenharmony_ci self.assertRaises(TypeError, iadd, mock) 1207db96d56Sopenharmony_ci mock.__iadd__ = add 1217db96d56Sopenharmony_ci mock += 6 1227db96d56Sopenharmony_ci self.assertEqual(mock, original) 1237db96d56Sopenharmony_ci self.assertEqual(mock.value, 9) 1247db96d56Sopenharmony_ci 1257db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: 3 + mock) 1267db96d56Sopenharmony_ci mock.__radd__ = add 1277db96d56Sopenharmony_ci self.assertEqual(7 + mock, mock) 1287db96d56Sopenharmony_ci self.assertEqual(mock.value, 16) 1297db96d56Sopenharmony_ci 1307db96d56Sopenharmony_ci def test_division(self): 1317db96d56Sopenharmony_ci original = mock = Mock() 1327db96d56Sopenharmony_ci mock.value = 32 1337db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: mock / 2) 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_ci def truediv(self, other): 1367db96d56Sopenharmony_ci mock.value /= other 1377db96d56Sopenharmony_ci return self 1387db96d56Sopenharmony_ci mock.__truediv__ = truediv 1397db96d56Sopenharmony_ci self.assertEqual(mock / 2, mock) 1407db96d56Sopenharmony_ci self.assertEqual(mock.value, 16) 1417db96d56Sopenharmony_ci 1427db96d56Sopenharmony_ci del mock.__truediv__ 1437db96d56Sopenharmony_ci def itruediv(mock): 1447db96d56Sopenharmony_ci mock /= 4 1457db96d56Sopenharmony_ci self.assertRaises(TypeError, itruediv, mock) 1467db96d56Sopenharmony_ci mock.__itruediv__ = truediv 1477db96d56Sopenharmony_ci mock /= 8 1487db96d56Sopenharmony_ci self.assertEqual(mock, original) 1497db96d56Sopenharmony_ci self.assertEqual(mock.value, 2) 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: 8 / mock) 1527db96d56Sopenharmony_ci mock.__rtruediv__ = truediv 1537db96d56Sopenharmony_ci self.assertEqual(0.5 / mock, mock) 1547db96d56Sopenharmony_ci self.assertEqual(mock.value, 4) 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_ci def test_hash(self): 1577db96d56Sopenharmony_ci mock = Mock() 1587db96d56Sopenharmony_ci # test delegation 1597db96d56Sopenharmony_ci self.assertEqual(hash(mock), Mock.__hash__(mock)) 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_ci def _hash(s): 1627db96d56Sopenharmony_ci return 3 1637db96d56Sopenharmony_ci mock.__hash__ = _hash 1647db96d56Sopenharmony_ci self.assertEqual(hash(mock), 3) 1657db96d56Sopenharmony_ci 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci def test_nonzero(self): 1687db96d56Sopenharmony_ci m = Mock() 1697db96d56Sopenharmony_ci self.assertTrue(bool(m)) 1707db96d56Sopenharmony_ci 1717db96d56Sopenharmony_ci m.__bool__ = lambda s: False 1727db96d56Sopenharmony_ci self.assertFalse(bool(m)) 1737db96d56Sopenharmony_ci 1747db96d56Sopenharmony_ci 1757db96d56Sopenharmony_ci def test_comparison(self): 1767db96d56Sopenharmony_ci mock = Mock() 1777db96d56Sopenharmony_ci def comp(s, o): 1787db96d56Sopenharmony_ci return True 1797db96d56Sopenharmony_ci mock.__lt__ = mock.__gt__ = mock.__le__ = mock.__ge__ = comp 1807db96d56Sopenharmony_ci self. assertTrue(mock < 3) 1817db96d56Sopenharmony_ci self. assertTrue(mock > 3) 1827db96d56Sopenharmony_ci self. assertTrue(mock <= 3) 1837db96d56Sopenharmony_ci self. assertTrue(mock >= 3) 1847db96d56Sopenharmony_ci 1857db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: MagicMock() < object()) 1867db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: object() < MagicMock()) 1877db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: MagicMock() < MagicMock()) 1887db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: MagicMock() > object()) 1897db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: object() > MagicMock()) 1907db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: MagicMock() > MagicMock()) 1917db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: MagicMock() <= object()) 1927db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: object() <= MagicMock()) 1937db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: MagicMock() <= MagicMock()) 1947db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: MagicMock() >= object()) 1957db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: object() >= MagicMock()) 1967db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: MagicMock() >= MagicMock()) 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci 1997db96d56Sopenharmony_ci def test_equality(self): 2007db96d56Sopenharmony_ci for mock in Mock(), MagicMock(): 2017db96d56Sopenharmony_ci self.assertEqual(mock == mock, True) 2027db96d56Sopenharmony_ci self.assertIsInstance(mock == mock, bool) 2037db96d56Sopenharmony_ci self.assertEqual(mock != mock, False) 2047db96d56Sopenharmony_ci self.assertIsInstance(mock != mock, bool) 2057db96d56Sopenharmony_ci self.assertEqual(mock == object(), False) 2067db96d56Sopenharmony_ci self.assertEqual(mock != object(), True) 2077db96d56Sopenharmony_ci 2087db96d56Sopenharmony_ci def eq(self, other): 2097db96d56Sopenharmony_ci return other == 3 2107db96d56Sopenharmony_ci mock.__eq__ = eq 2117db96d56Sopenharmony_ci self.assertTrue(mock == 3) 2127db96d56Sopenharmony_ci self.assertFalse(mock == 4) 2137db96d56Sopenharmony_ci 2147db96d56Sopenharmony_ci def ne(self, other): 2157db96d56Sopenharmony_ci return other == 3 2167db96d56Sopenharmony_ci mock.__ne__ = ne 2177db96d56Sopenharmony_ci self.assertTrue(mock != 3) 2187db96d56Sopenharmony_ci self.assertFalse(mock != 4) 2197db96d56Sopenharmony_ci 2207db96d56Sopenharmony_ci mock = MagicMock() 2217db96d56Sopenharmony_ci mock.__eq__.return_value = True 2227db96d56Sopenharmony_ci self.assertIsInstance(mock == 3, bool) 2237db96d56Sopenharmony_ci self.assertEqual(mock == 3, True) 2247db96d56Sopenharmony_ci 2257db96d56Sopenharmony_ci mock.__ne__.return_value = False 2267db96d56Sopenharmony_ci self.assertIsInstance(mock != 3, bool) 2277db96d56Sopenharmony_ci self.assertEqual(mock != 3, False) 2287db96d56Sopenharmony_ci 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ci def test_len_contains_iter(self): 2317db96d56Sopenharmony_ci mock = Mock() 2327db96d56Sopenharmony_ci 2337db96d56Sopenharmony_ci self.assertRaises(TypeError, len, mock) 2347db96d56Sopenharmony_ci self.assertRaises(TypeError, iter, mock) 2357db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: 'foo' in mock) 2367db96d56Sopenharmony_ci 2377db96d56Sopenharmony_ci mock.__len__ = lambda s: 6 2387db96d56Sopenharmony_ci self.assertEqual(len(mock), 6) 2397db96d56Sopenharmony_ci 2407db96d56Sopenharmony_ci mock.__contains__ = lambda s, o: o == 3 2417db96d56Sopenharmony_ci self.assertIn(3, mock) 2427db96d56Sopenharmony_ci self.assertNotIn(6, mock) 2437db96d56Sopenharmony_ci 2447db96d56Sopenharmony_ci mock.__iter__ = lambda s: iter('foobarbaz') 2457db96d56Sopenharmony_ci self.assertEqual(list(mock), list('foobarbaz')) 2467db96d56Sopenharmony_ci 2477db96d56Sopenharmony_ci 2487db96d56Sopenharmony_ci def test_magicmock(self): 2497db96d56Sopenharmony_ci mock = MagicMock() 2507db96d56Sopenharmony_ci 2517db96d56Sopenharmony_ci mock.__iter__.return_value = iter([1, 2, 3]) 2527db96d56Sopenharmony_ci self.assertEqual(list(mock), [1, 2, 3]) 2537db96d56Sopenharmony_ci 2547db96d56Sopenharmony_ci getattr(mock, '__bool__').return_value = False 2557db96d56Sopenharmony_ci self.assertFalse(hasattr(mock, '__nonzero__')) 2567db96d56Sopenharmony_ci self.assertFalse(bool(mock)) 2577db96d56Sopenharmony_ci 2587db96d56Sopenharmony_ci for entry in _magics: 2597db96d56Sopenharmony_ci self.assertTrue(hasattr(mock, entry)) 2607db96d56Sopenharmony_ci self.assertFalse(hasattr(mock, '__imaginary__')) 2617db96d56Sopenharmony_ci 2627db96d56Sopenharmony_ci 2637db96d56Sopenharmony_ci def test_magic_mock_equality(self): 2647db96d56Sopenharmony_ci mock = MagicMock() 2657db96d56Sopenharmony_ci self.assertIsInstance(mock == object(), bool) 2667db96d56Sopenharmony_ci self.assertIsInstance(mock != object(), bool) 2677db96d56Sopenharmony_ci 2687db96d56Sopenharmony_ci self.assertEqual(mock == object(), False) 2697db96d56Sopenharmony_ci self.assertEqual(mock != object(), True) 2707db96d56Sopenharmony_ci self.assertEqual(mock == mock, True) 2717db96d56Sopenharmony_ci self.assertEqual(mock != mock, False) 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci def test_asyncmock_defaults(self): 2747db96d56Sopenharmony_ci mock = AsyncMock() 2757db96d56Sopenharmony_ci self.assertEqual(int(mock), 1) 2767db96d56Sopenharmony_ci self.assertEqual(complex(mock), 1j) 2777db96d56Sopenharmony_ci self.assertEqual(float(mock), 1.0) 2787db96d56Sopenharmony_ci self.assertNotIn(object(), mock) 2797db96d56Sopenharmony_ci self.assertEqual(len(mock), 0) 2807db96d56Sopenharmony_ci self.assertEqual(list(mock), []) 2817db96d56Sopenharmony_ci self.assertEqual(hash(mock), object.__hash__(mock)) 2827db96d56Sopenharmony_ci self.assertEqual(str(mock), object.__str__(mock)) 2837db96d56Sopenharmony_ci self.assertTrue(bool(mock)) 2847db96d56Sopenharmony_ci self.assertEqual(round(mock), mock.__round__()) 2857db96d56Sopenharmony_ci self.assertEqual(math.trunc(mock), mock.__trunc__()) 2867db96d56Sopenharmony_ci self.assertEqual(math.floor(mock), mock.__floor__()) 2877db96d56Sopenharmony_ci self.assertEqual(math.ceil(mock), mock.__ceil__()) 2887db96d56Sopenharmony_ci self.assertTrue(iscoroutinefunction(mock.__aexit__)) 2897db96d56Sopenharmony_ci self.assertTrue(iscoroutinefunction(mock.__aenter__)) 2907db96d56Sopenharmony_ci self.assertIsInstance(mock.__aenter__, AsyncMock) 2917db96d56Sopenharmony_ci self.assertIsInstance(mock.__aexit__, AsyncMock) 2927db96d56Sopenharmony_ci 2937db96d56Sopenharmony_ci # in Python 3 oct and hex use __index__ 2947db96d56Sopenharmony_ci # so these tests are for __index__ in py3k 2957db96d56Sopenharmony_ci self.assertEqual(oct(mock), '0o1') 2967db96d56Sopenharmony_ci self.assertEqual(hex(mock), '0x1') 2977db96d56Sopenharmony_ci # how to test __sizeof__ ? 2987db96d56Sopenharmony_ci 2997db96d56Sopenharmony_ci def test_magicmock_defaults(self): 3007db96d56Sopenharmony_ci mock = MagicMock() 3017db96d56Sopenharmony_ci self.assertEqual(int(mock), 1) 3027db96d56Sopenharmony_ci self.assertEqual(complex(mock), 1j) 3037db96d56Sopenharmony_ci self.assertEqual(float(mock), 1.0) 3047db96d56Sopenharmony_ci self.assertNotIn(object(), mock) 3057db96d56Sopenharmony_ci self.assertEqual(len(mock), 0) 3067db96d56Sopenharmony_ci self.assertEqual(list(mock), []) 3077db96d56Sopenharmony_ci self.assertEqual(hash(mock), object.__hash__(mock)) 3087db96d56Sopenharmony_ci self.assertEqual(str(mock), object.__str__(mock)) 3097db96d56Sopenharmony_ci self.assertTrue(bool(mock)) 3107db96d56Sopenharmony_ci self.assertEqual(round(mock), mock.__round__()) 3117db96d56Sopenharmony_ci self.assertEqual(math.trunc(mock), mock.__trunc__()) 3127db96d56Sopenharmony_ci self.assertEqual(math.floor(mock), mock.__floor__()) 3137db96d56Sopenharmony_ci self.assertEqual(math.ceil(mock), mock.__ceil__()) 3147db96d56Sopenharmony_ci self.assertTrue(iscoroutinefunction(mock.__aexit__)) 3157db96d56Sopenharmony_ci self.assertTrue(iscoroutinefunction(mock.__aenter__)) 3167db96d56Sopenharmony_ci self.assertIsInstance(mock.__aenter__, AsyncMock) 3177db96d56Sopenharmony_ci self.assertIsInstance(mock.__aexit__, AsyncMock) 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ci # in Python 3 oct and hex use __index__ 3207db96d56Sopenharmony_ci # so these tests are for __index__ in py3k 3217db96d56Sopenharmony_ci self.assertEqual(oct(mock), '0o1') 3227db96d56Sopenharmony_ci self.assertEqual(hex(mock), '0x1') 3237db96d56Sopenharmony_ci # how to test __sizeof__ ? 3247db96d56Sopenharmony_ci 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ci def test_magic_methods_fspath(self): 3277db96d56Sopenharmony_ci mock = MagicMock() 3287db96d56Sopenharmony_ci expected_path = mock.__fspath__() 3297db96d56Sopenharmony_ci mock.reset_mock() 3307db96d56Sopenharmony_ci 3317db96d56Sopenharmony_ci self.assertEqual(os.fspath(mock), expected_path) 3327db96d56Sopenharmony_ci mock.__fspath__.assert_called_once() 3337db96d56Sopenharmony_ci 3347db96d56Sopenharmony_ci 3357db96d56Sopenharmony_ci def test_magic_methods_and_spec(self): 3367db96d56Sopenharmony_ci class Iterable(object): 3377db96d56Sopenharmony_ci def __iter__(self): pass 3387db96d56Sopenharmony_ci 3397db96d56Sopenharmony_ci mock = Mock(spec=Iterable) 3407db96d56Sopenharmony_ci self.assertRaises(AttributeError, lambda: mock.__iter__) 3417db96d56Sopenharmony_ci 3427db96d56Sopenharmony_ci mock.__iter__ = Mock(return_value=iter([])) 3437db96d56Sopenharmony_ci self.assertEqual(list(mock), []) 3447db96d56Sopenharmony_ci 3457db96d56Sopenharmony_ci class NonIterable(object): 3467db96d56Sopenharmony_ci pass 3477db96d56Sopenharmony_ci mock = Mock(spec=NonIterable) 3487db96d56Sopenharmony_ci self.assertRaises(AttributeError, lambda: mock.__iter__) 3497db96d56Sopenharmony_ci 3507db96d56Sopenharmony_ci def set_int(): 3517db96d56Sopenharmony_ci mock.__int__ = Mock(return_value=iter([])) 3527db96d56Sopenharmony_ci self.assertRaises(AttributeError, set_int) 3537db96d56Sopenharmony_ci 3547db96d56Sopenharmony_ci mock = MagicMock(spec=Iterable) 3557db96d56Sopenharmony_ci self.assertEqual(list(mock), []) 3567db96d56Sopenharmony_ci self.assertRaises(AttributeError, set_int) 3577db96d56Sopenharmony_ci 3587db96d56Sopenharmony_ci 3597db96d56Sopenharmony_ci def test_magic_methods_and_spec_set(self): 3607db96d56Sopenharmony_ci class Iterable(object): 3617db96d56Sopenharmony_ci def __iter__(self): pass 3627db96d56Sopenharmony_ci 3637db96d56Sopenharmony_ci mock = Mock(spec_set=Iterable) 3647db96d56Sopenharmony_ci self.assertRaises(AttributeError, lambda: mock.__iter__) 3657db96d56Sopenharmony_ci 3667db96d56Sopenharmony_ci mock.__iter__ = Mock(return_value=iter([])) 3677db96d56Sopenharmony_ci self.assertEqual(list(mock), []) 3687db96d56Sopenharmony_ci 3697db96d56Sopenharmony_ci class NonIterable(object): 3707db96d56Sopenharmony_ci pass 3717db96d56Sopenharmony_ci mock = Mock(spec_set=NonIterable) 3727db96d56Sopenharmony_ci self.assertRaises(AttributeError, lambda: mock.__iter__) 3737db96d56Sopenharmony_ci 3747db96d56Sopenharmony_ci def set_int(): 3757db96d56Sopenharmony_ci mock.__int__ = Mock(return_value=iter([])) 3767db96d56Sopenharmony_ci self.assertRaises(AttributeError, set_int) 3777db96d56Sopenharmony_ci 3787db96d56Sopenharmony_ci mock = MagicMock(spec_set=Iterable) 3797db96d56Sopenharmony_ci self.assertEqual(list(mock), []) 3807db96d56Sopenharmony_ci self.assertRaises(AttributeError, set_int) 3817db96d56Sopenharmony_ci 3827db96d56Sopenharmony_ci 3837db96d56Sopenharmony_ci def test_setting_unsupported_magic_method(self): 3847db96d56Sopenharmony_ci mock = MagicMock() 3857db96d56Sopenharmony_ci def set_setattr(): 3867db96d56Sopenharmony_ci mock.__setattr__ = lambda self, name: None 3877db96d56Sopenharmony_ci self.assertRaisesRegex(AttributeError, 3887db96d56Sopenharmony_ci "Attempting to set unsupported magic method '__setattr__'.", 3897db96d56Sopenharmony_ci set_setattr 3907db96d56Sopenharmony_ci ) 3917db96d56Sopenharmony_ci 3927db96d56Sopenharmony_ci 3937db96d56Sopenharmony_ci def test_attributes_and_return_value(self): 3947db96d56Sopenharmony_ci mock = MagicMock() 3957db96d56Sopenharmony_ci attr = mock.foo 3967db96d56Sopenharmony_ci def _get_type(obj): 3977db96d56Sopenharmony_ci # the type of every mock (or magicmock) is a custom subclass 3987db96d56Sopenharmony_ci # so the real type is the second in the mro 3997db96d56Sopenharmony_ci return type(obj).__mro__[1] 4007db96d56Sopenharmony_ci self.assertEqual(_get_type(attr), MagicMock) 4017db96d56Sopenharmony_ci 4027db96d56Sopenharmony_ci returned = mock() 4037db96d56Sopenharmony_ci self.assertEqual(_get_type(returned), MagicMock) 4047db96d56Sopenharmony_ci 4057db96d56Sopenharmony_ci 4067db96d56Sopenharmony_ci def test_magic_methods_are_magic_mocks(self): 4077db96d56Sopenharmony_ci mock = MagicMock() 4087db96d56Sopenharmony_ci self.assertIsInstance(mock.__getitem__, MagicMock) 4097db96d56Sopenharmony_ci 4107db96d56Sopenharmony_ci mock[1][2].__getitem__.return_value = 3 4117db96d56Sopenharmony_ci self.assertEqual(mock[1][2][3], 3) 4127db96d56Sopenharmony_ci 4137db96d56Sopenharmony_ci 4147db96d56Sopenharmony_ci def test_magic_method_reset_mock(self): 4157db96d56Sopenharmony_ci mock = MagicMock() 4167db96d56Sopenharmony_ci str(mock) 4177db96d56Sopenharmony_ci self.assertTrue(mock.__str__.called) 4187db96d56Sopenharmony_ci mock.reset_mock() 4197db96d56Sopenharmony_ci self.assertFalse(mock.__str__.called) 4207db96d56Sopenharmony_ci 4217db96d56Sopenharmony_ci 4227db96d56Sopenharmony_ci def test_dir(self): 4237db96d56Sopenharmony_ci # overriding the default implementation 4247db96d56Sopenharmony_ci for mock in Mock(), MagicMock(): 4257db96d56Sopenharmony_ci def _dir(self): 4267db96d56Sopenharmony_ci return ['foo'] 4277db96d56Sopenharmony_ci mock.__dir__ = _dir 4287db96d56Sopenharmony_ci self.assertEqual(dir(mock), ['foo']) 4297db96d56Sopenharmony_ci 4307db96d56Sopenharmony_ci 4317db96d56Sopenharmony_ci def test_bound_methods(self): 4327db96d56Sopenharmony_ci m = Mock() 4337db96d56Sopenharmony_ci 4347db96d56Sopenharmony_ci # XXXX should this be an expected failure instead? 4357db96d56Sopenharmony_ci 4367db96d56Sopenharmony_ci # this seems like it should work, but is hard to do without introducing 4377db96d56Sopenharmony_ci # other api inconsistencies. Failure message could be better though. 4387db96d56Sopenharmony_ci m.__iter__ = [3].__iter__ 4397db96d56Sopenharmony_ci self.assertRaises(TypeError, iter, m) 4407db96d56Sopenharmony_ci 4417db96d56Sopenharmony_ci 4427db96d56Sopenharmony_ci def test_magic_method_type(self): 4437db96d56Sopenharmony_ci class Foo(MagicMock): 4447db96d56Sopenharmony_ci pass 4457db96d56Sopenharmony_ci 4467db96d56Sopenharmony_ci foo = Foo() 4477db96d56Sopenharmony_ci self.assertIsInstance(foo.__int__, Foo) 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_ci 4507db96d56Sopenharmony_ci def test_descriptor_from_class(self): 4517db96d56Sopenharmony_ci m = MagicMock() 4527db96d56Sopenharmony_ci type(m).__str__.return_value = 'foo' 4537db96d56Sopenharmony_ci self.assertEqual(str(m), 'foo') 4547db96d56Sopenharmony_ci 4557db96d56Sopenharmony_ci 4567db96d56Sopenharmony_ci def test_iterable_as_iter_return_value(self): 4577db96d56Sopenharmony_ci m = MagicMock() 4587db96d56Sopenharmony_ci m.__iter__.return_value = [1, 2, 3] 4597db96d56Sopenharmony_ci self.assertEqual(list(m), [1, 2, 3]) 4607db96d56Sopenharmony_ci self.assertEqual(list(m), [1, 2, 3]) 4617db96d56Sopenharmony_ci 4627db96d56Sopenharmony_ci m.__iter__.return_value = iter([4, 5, 6]) 4637db96d56Sopenharmony_ci self.assertEqual(list(m), [4, 5, 6]) 4647db96d56Sopenharmony_ci self.assertEqual(list(m), []) 4657db96d56Sopenharmony_ci 4667db96d56Sopenharmony_ci 4677db96d56Sopenharmony_ci def test_matmul(self): 4687db96d56Sopenharmony_ci m = MagicMock() 4697db96d56Sopenharmony_ci self.assertIsInstance(m @ 1, MagicMock) 4707db96d56Sopenharmony_ci m.__matmul__.return_value = 42 4717db96d56Sopenharmony_ci m.__rmatmul__.return_value = 666 4727db96d56Sopenharmony_ci m.__imatmul__.return_value = 24 4737db96d56Sopenharmony_ci self.assertEqual(m @ 1, 42) 4747db96d56Sopenharmony_ci self.assertEqual(1 @ m, 666) 4757db96d56Sopenharmony_ci m @= 24 4767db96d56Sopenharmony_ci self.assertEqual(m, 24) 4777db96d56Sopenharmony_ci 4787db96d56Sopenharmony_ci def test_divmod_and_rdivmod(self): 4797db96d56Sopenharmony_ci m = MagicMock() 4807db96d56Sopenharmony_ci self.assertIsInstance(divmod(5, m), MagicMock) 4817db96d56Sopenharmony_ci m.__divmod__.return_value = (2, 1) 4827db96d56Sopenharmony_ci self.assertEqual(divmod(m, 2), (2, 1)) 4837db96d56Sopenharmony_ci m = MagicMock() 4847db96d56Sopenharmony_ci foo = divmod(2, m) 4857db96d56Sopenharmony_ci self.assertIsInstance(foo, MagicMock) 4867db96d56Sopenharmony_ci foo_direct = m.__divmod__(2) 4877db96d56Sopenharmony_ci self.assertIsInstance(foo_direct, MagicMock) 4887db96d56Sopenharmony_ci bar = divmod(m, 2) 4897db96d56Sopenharmony_ci self.assertIsInstance(bar, MagicMock) 4907db96d56Sopenharmony_ci bar_direct = m.__rdivmod__(2) 4917db96d56Sopenharmony_ci self.assertIsInstance(bar_direct, MagicMock) 4927db96d56Sopenharmony_ci 4937db96d56Sopenharmony_ci # http://bugs.python.org/issue23310 4947db96d56Sopenharmony_ci # Check if you can change behaviour of magic methods in MagicMock init 4957db96d56Sopenharmony_ci def test_magic_in_initialization(self): 4967db96d56Sopenharmony_ci m = MagicMock(**{'__str__.return_value': "12"}) 4977db96d56Sopenharmony_ci self.assertEqual(str(m), "12") 4987db96d56Sopenharmony_ci 4997db96d56Sopenharmony_ci def test_changing_magic_set_in_initialization(self): 5007db96d56Sopenharmony_ci m = MagicMock(**{'__str__.return_value': "12"}) 5017db96d56Sopenharmony_ci m.__str__.return_value = "13" 5027db96d56Sopenharmony_ci self.assertEqual(str(m), "13") 5037db96d56Sopenharmony_ci m = MagicMock(**{'__str__.return_value': "12"}) 5047db96d56Sopenharmony_ci m.configure_mock(**{'__str__.return_value': "14"}) 5057db96d56Sopenharmony_ci self.assertEqual(str(m), "14") 5067db96d56Sopenharmony_ci 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_ciif __name__ == '__main__': 5097db96d56Sopenharmony_ci unittest.main() 510