def test_init_params(self): """Parameters can be instantiated with another instance of Parameters""" params_1 = insightiq_api.Parameters({'one' : 1}) params = insightiq_api.Parameters(params_1) expected = [['one', 1]] actual = params._data self.assertEqual(expected, actual)
def test_items(self): """Parameters supports the `.items()` method""" params = insightiq_api.Parameters({'one': 1}, {'one': 'foo'}) value = list(params.items()) # using list() b/c newer versions of Python return a generator expected = [('one', 1), ('one', 'foo')] self.assertEqual(value, expected)
def test_pop(self): """Parameters support the `.pop()` method""" params = insightiq_api.Parameters(one=1) value = params.pop('one') expected = 1 self.assertEqual(value, expected)
def test_len(self): """Parameters returns the correct answer for ``len()``""" params = insightiq_api.Parameters({'one' : 'foo'}, one=1, two=2) value = len(params) expected = 3 self.assertEqual(value, expected)
def test_get_all(self): """Parameters - ``.get_all()`` returns all instances of duplicate parameters""" params = insightiq_api.Parameters({'one': 1}, {'one': 'foo'}, {'two': 'bar'}) value = params.get_all('one') expected = [['one', 1], ['one', 'foo']] self.assertEqual(value, expected)
def test_keys(self): """Parameters supports the `.keys()` method""" params = insightiq_api.Parameters(one=1) value = list(params.keys()) expected = ['one'] self.assertEqual(value, expected)
def test_NAME(self): """Parameters - the NAME property is 0""" params = insightiq_api.Parameters() value = params.NAME expected = 0 self.assertEqual(value, expected)
def test_VALUE(self): """Parameters - the VALUE property is 1""" params = insightiq_api.Parameters() value = params.VALUE expected = 1 self.assertEqual(value, expected)
def test_init_params_complex_list(self): """Parameters supports list of multiple valid types""" params = insightiq_api.Parameters([{'one' : 1}, ('two', 2)]) value = params._data expected = [['one', 1], ['two', 2]] self.assertEqual(value, expected)
def test_init_params_list(self): """Parameters can be instantiated with a list of key/value pairs""" params = insightiq_api.Parameters([('one', 1), ('two', 2)]) value = params._data expected = [['one', 1], ['two', 2]] self.assertEqual(value, expected)
def test_init_dict(self): """Parameters can be instantiated with a normal dictionary""" params = insightiq_api.Parameters({'one' : 1}) expected = [['one', 1]] actual = params._data self.assertEqual(expected, actual)
def test_init_keywords(self): """Parameters can be instantiated with keyword arguments""" params = insightiq_api.Parameters(one=1) expected = [['one', 1]] actual = params._data self.assertEqual(expected, actual)
def test_setattr_modifies(self): """Parameters supports changing param values via the dictionary syntax""" params = insightiq_api.Parameters(one=1) params['one'] = 2 value = params.get('one') expected = 2 self.assertEqual(value, expected)
def test_getitem(self): """Parameters supports dictionary syntax for retrieving an attribute""" params = insightiq_api.Parameters(one=1) try: value = params['one'] except TypeError as doh: value = '%s' % doh self.assertEqual(value, 1)
def test_init_odict(self): """Parameters can be instantiated with a `collections.OrderedDict`""" odict = collections.OrderedDict(one=1) params = insightiq_api.Parameters(odict) expected = [['one', 1]] actual = params._data self.assertEqual(expected, actual)
def test_modify_parameter(self): """Parameters can change a specific instance of parameters""" params = insightiq_api.Parameters({'one': 1}, {'one': 3}) params.modify_parameter(name='one', new_value=2, occurrence=1) value = params.get_all('one') expected = [['one', 1], ['one', 2]] self.assertEqual(value, expected)
def test_add(self): """Parameters - ``add()`` creats duplicate entries for the same parameter name""" params = insightiq_api.Parameters(one=1) params.add(name='one', value='foo') value = params._data expected = [['one', 1], ['one', 'foo']] self.assertEqual(value, expected)
def test_iterative_addition(self): """Parameters - adding duplicate params works in a for-loop""" params = insightiq_api.Parameters() for value in range(3): params.add('guid', value) value = params.get_all('guid') expected = [['guid', 0], ['guid', 1], ['guid', 2]] self.assertEqual(value, expected)
def test_building_query_string(self): """Parameters - iterating the object to build an HTTP query string is simple""" params = insightiq_api.Parameters({'one': 1}, {'one': 'foo'}, {'two': 'bar'}) tmp = [] for param, value in params.items(): tmp.append('%s=%s' % (param, value)) query = '&'.join(tmp) expected = 'one=1&one=foo&two=bar' self.assertEqual(query, expected)
def test_delete_parameter(self): """Parameters can delete a specific instance of a parameter""" params = insightiq_api.Parameters({'one': 1}, {'one': 2}, {'one': 3}) # order of the init args == order of the occurrence params.delete_parameter(name='one', occurrence=1) # base zero, so the 2nd value = params.get_all('one') expected = [['one', 1], ['one', 3]] self.assertEqual(value, expected)
def test_setattr(self): """Parameters support dictionary syntax for setting an attribute""" params = insightiq_api.Parameters() try: params['one'] = 1 except TypeError as doh: value = '%s' % doh else: value = params._data expected = [['one', 1]] self.assertEqual(value, expected)
def test_modify_occurrence(self): """Parameters - changing the value of a specific param works""" params = insightiq_api.Parameters({'one': 1}, {'one': 'foo'}, {'two': 2}) ones = params.get_all('one') for index, pair in enumerate(ones): if pair[params.VALUE] == 'foo': # deleting a specific param would just call the ``.delete_parameter()`` method instead params.modify_parameter(name=pair[params.NAME], new_value='bar', occurrence=index) value = params._data expected = [['one', 1], ['one', 'bar'], ['two', 2]] self.assertEqual(value, expected)
def test_modify_parameter_no_occurrence(self): """Parameters raises KeyError when trying to modify an occurrence that does not exist""" params = insightiq_api.Parameters(one=1) with self.assertRaises(KeyError): params.modify_parameter(name='one', new_value=2, occurrence=200)
def test_delete_parameter_no_occurrence(self): """Parameters raises KeyError when trying to delete an occurrence that does not exist""" params = insightiq_api.Parameters(one=1) with self.assertRaises(KeyError): params.delete_parameter(name='one', occurrence=200)
def test_init_params_list_bad(self): """Parameters cannot be instantiated with a random list""" with self.assertRaises(ValueError): insightiq_api.Parameters(['one', 1, 'two', 2])
def test_VALUE_readonly(self): """Parameters - the VALUE property is read only""" params = insightiq_api.Parameters() with self.assertRaises(AttributeError): params.VALUE = 'foo'
def test_init_params_tuple_too_long(self): """Parameters wont accept a tuple/list when it's length is not two""" with self.assertRaises(ValueError): insightiq_api.Parameters([(2,3,4,5)])
def test_getitem_keyerror(self): """Parameters - asking for a non-existant parameter raises KeyError""" params = insightiq_api.Parameters() with self.assertRaises(KeyError): params['doh']
def test_delitem_no_param(self): """Parameters raises KeyError when trying to delete a param that doesn't exist""" params = insightiq_api.Parameters() with self.assertRaises(KeyError): del params['foo']