From 6e1eb4722552a1c81156f9a3116c7b04997cff22 Mon Sep 17 00:00:00 2001 From: Arto Jantunen Date: Sun, 6 Dec 2015 10:57:34 +0200 Subject: [PATCH 1/6] sqliteUtils: set sqlalchemy url in __init__ --- pytrainer/lib/sqliteUtils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pytrainer/lib/sqliteUtils.py b/pytrainer/lib/sqliteUtils.py index 7623c0bb..341c67c2 100644 --- a/pytrainer/lib/sqliteUtils.py +++ b/pytrainer/lib/sqliteUtils.py @@ -33,9 +33,10 @@ def __init__(self,host=None, ddbb = None, user = None, password = None, configur self.db = None confdir = configuration.confdir self.ddbb = "%s/pytrainer.ddbb" %confdir + self.url = "sqlite:///" + self.ddbb def get_connection_url(self): - return "sqlite:///" + self.ddbb + return self.url def connect(self): #si devolvemos 1 ha ido todo con exito From 9e7ac3fa66eaea9a8a1c0c336563d2fd57db3453 Mon Sep 17 00:00:00 2001 From: Arto Jantunen Date: Sun, 6 Dec 2015 11:00:26 +0200 Subject: [PATCH 2/6] sqliteUtils: allow running with an in-memory sqlite database --- pytrainer/lib/sqliteUtils.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pytrainer/lib/sqliteUtils.py b/pytrainer/lib/sqliteUtils.py index 341c67c2..89057d71 100644 --- a/pytrainer/lib/sqliteUtils.py +++ b/pytrainer/lib/sqliteUtils.py @@ -31,9 +31,13 @@ class Sql: def __init__(self,host=None, ddbb = None, user = None, password = None, configuration = None): self.db = None - confdir = configuration.confdir - self.ddbb = "%s/pytrainer.ddbb" %confdir - self.url = "sqlite:///" + self.ddbb + if ddbb == 'memory': + self.ddbb = ':memory:' + self.url = 'sqlite://' + else: + confdir = configuration.confdir + self.ddbb = "%s/pytrainer.ddbb" %confdir + self.url = "sqlite:///" + self.ddbb def get_connection_url(self): return self.url From d82fbeee3a06ee3f65f483076358ae8e393002ed Mon Sep 17 00:00:00 2001 From: Arto Jantunen Date: Sun, 6 Dec 2015 18:05:20 +0200 Subject: [PATCH 3/6] equipment_test: Use a real DDBB object and database when testing EquipmentService --- pytrainer/test/core/test_equipment.py | 85 ++++++++++++++------------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/pytrainer/test/core/test_equipment.py b/pytrainer/test/core/test_equipment.py index 5628ec9e..542cafe8 100644 --- a/pytrainer/test/core/test_equipment.py +++ b/pytrainer/test/core/test_equipment.py @@ -20,7 +20,7 @@ import mock from pytrainer.core.equipment import Equipment, EquipmentService,\ EquipmentServiceException -from pytrainer.lib.sqliteUtils import Sql +from pytrainer.lib.ddbb import DDBB class EquipmentTest(unittest.TestCase): @@ -193,14 +193,19 @@ def test_equals_instances_with_different_ids(self): class EquipmentServiceTest(unittest.TestCase): def setUp(self): - self.mock_ddbb = mock.Mock(spec=Sql) + profile = mock.Mock() + profile.getValue = mock.Mock(return_value='memory') + self.mock_ddbb = DDBB(profile) + self.mock_ddbb.connect() + self.mock_ddbb.create_tables() self.equipment_service = EquipmentService(self.mock_ddbb) def tearDown(self): - pass + self.mock_ddbb.disconnect() def test_get_equipment_item(self): - self.mock_ddbb.select.return_value = [(1, u"Test Description", True, 500, 200, u"Test notes.")] + self.mock_ddbb.insert("equipment", "life_expectancy,notes,description,prior_usage,active", + (500, u"Test notes.", u"Test Description", 200, 1)) item = self.equipment_service.get_equipment_item(1) self.assertEquals(1, item.id) self.assertEquals("Test Description", item.description) @@ -210,19 +215,21 @@ def test_get_equipment_item(self): self.assertEquals("Test notes.", item.notes) def test_get_equipment_item_non_unicode(self): - self.mock_ddbb.select.return_value = [(1, "Test Description", True, 500, 200, "Test notes.")] + self.mock_ddbb.insert("equipment", "life_expectancy,notes,description,prior_usage,active", + (500, u"Test notes.", u"Test Description", 200, 1)) item = self.equipment_service.get_equipment_item(1) self.assertEquals("Test Description", item.description) self.assertEquals("Test notes.", item.notes) def test_get_equipment_item_non_existant(self): - self.mock_ddbb.select.return_value = [] item = self.equipment_service.get_equipment_item(1) self.assertEquals(None, item) def test_get_all_equipment(self): - self.mock_ddbb.select.return_value = [(1, u"Test item 1", True, 500, 200, u"Test notes 1."), - (2, u"Test item 2", False, 600, 300, u"Test notes 2.")] + self.mock_ddbb.insert("equipment", "life_expectancy,notes,description,prior_usage,active", + (500, u"Test notes 1.", u"Test item 1", 200, 1)) + self.mock_ddbb.insert("equipment", "life_expectancy,notes,description,prior_usage,active", + (600, u"Test notes 2.", u"Test item 2", 300, 0)) items = self.equipment_service.get_all_equipment() item = items[0] self.assertEquals(1, item.id) @@ -240,13 +247,14 @@ def test_get_all_equipment(self): self.assertEquals("Test notes 2.", item.notes) def test_get_all_equipment_non_existant(self): - self.mock_ddbb.select.return_value = [] items = self.equipment_service.get_all_equipment() self.assertEquals([], items) def test_get_active_equipment(self): - self.mock_ddbb.select.return_value = [(1, u"Test item 1", True, 500, 200, u"Test notes 1."), - (2, u"Test item 2", True, 600, 300, u"Test notes 2.")] + self.mock_ddbb.insert("equipment", "life_expectancy,notes,description,prior_usage,active", + (500, u"Test notes 1.", u"Test item 1", 200, 1)) + self.mock_ddbb.insert("equipment", "life_expectancy,notes,description,prior_usage,active", + (600, u"Test notes 2.", u"Test item 2", 300, 1)) items = self.equipment_service.get_active_equipment() item = items[0] self.assertEquals(1, item.id) @@ -264,31 +272,18 @@ def test_get_active_equipment(self): self.assertEquals("Test notes 2.", item.notes) def test_get_active_equipment_non_existant(self): - self.mock_ddbb.select.return_value = [] items = self.equipment_service.get_active_equipment() self.assertEquals([], items) def test_store_equipment(self): equipment = Equipment() equipment.description = u"test description" - equipment_ids = [] - def mock_select(table, columns, where): - if columns == "id": - return equipment_ids - else: - return [(2, u"", 1, 0, 0,u"")] - def update_equipment_ids(*args): - equipment_ids.append([1]) - self.mock_ddbb.select = mock.Mock(wraps=mock_select) - self.mock_ddbb.insert.side_effect = update_equipment_ids stored_equipment = self.equipment_service.store_equipment(equipment) - self.mock_ddbb.insert.assert_called_with("equipment", - "description,active,life_expectancy,prior_usage,notes", - ["test description", 1, 0, 0,"" ]) - self.assertEquals(2, stored_equipment.id) + self.assertEquals(1, stored_equipment.id) def test_store_equipment_duplicate_description(self): - self.mock_ddbb.select.return_value = [(1,)] + self.mock_ddbb.insert("equipment", "life_expectancy,notes,description,prior_usage,active", + (500, u"Test notes.", u"test item", 200, 1)) equipment = Equipment() equipment.description = u"test item" try: @@ -298,18 +293,15 @@ def test_store_equipment_duplicate_description(self): pass def test_update_equipment(self): - equipment = Equipment() - equipment.id = 1 + self.mock_ddbb.insert("equipment", "life_expectancy,notes,description,prior_usage,active", + (500, u"Test notes.", u"old description", 200, 1)) + equipment = self.equipment_service.get_equipment_item(1) equipment.description = u"new description" - self.mock_ddbb.select.return_value = [(1, u"old description", 1, 0, 0,u"")] self.equipment_service.store_equipment(equipment) - self.mock_ddbb.update.assert_called_with("equipment", - "description,active,life_expectancy,prior_usage,notes", - ["new description", 1, 0, 0,"" ], - "id = 1") + equipment = self.equipment_service.get_equipment_item(1) + self.assertEquals("new description", equipment.description) def test_update_equipment_non_existant(self): - self.mock_ddbb.select.return_value = [] equipment = Equipment() equipment.id = 1 try: @@ -319,7 +311,8 @@ def test_update_equipment_non_existant(self): pass def test_update_equipment_duplicate_description(self): - self.mock_ddbb.select.return_value = [(1, u"test item", True, 500, 200, u"Test notes.")] + self.mock_ddbb.insert("equipment", "life_expectancy,notes,description,prior_usage,active", + (500, u"Test notes.", u"test item", 200, 1)) equipment = Equipment() equipment.id = 2 equipment.description = u"test item" @@ -330,21 +323,29 @@ def test_update_equipment_duplicate_description(self): pass def test_get_equipment_usage(self): - self.mock_ddbb.select.return_value = [(250,)] - equipment = Equipment() - equipment.id = 1 + self.mock_ddbb.insert("equipment", "life_expectancy,notes,description,prior_usage,active", + (500, u"Test notes.", u"test item", 0, 1)) + self.mock_ddbb.insert("records", "distance", (250,)) + self.mock_ddbb.insert("record_equipment", "record_id,equipment_id", (1, 1)) + equipment = self.equipment_service.get_equipment_item(1) usage = self.equipment_service.get_equipment_usage(equipment) self.assertEquals(250, usage) def test_get_equipment_usage_none(self): - self.mock_ddbb.select.return_value = [(None,)] + self.mock_ddbb.insert("equipment", "life_expectancy,notes,description,prior_usage,active", + (500, u"Test notes.", u"test item", 0, 1)) + equipment = self.equipment_service.get_equipment_item(1) + usage = self.equipment_service.get_equipment_usage(equipment) + self.assertEquals(0, usage) + + def test_get_equipment_prior_usage(self): equipment = Equipment() equipment.id = 1 + equipment.prior_usage = 250 usage = self.equipment_service.get_equipment_usage(equipment) - self.assertEquals(0, usage) + self.assertEquals(250, usage) def test_get_equipment_prior_usage(self): - self.mock_ddbb.select.return_value = [(None,)] equipment = Equipment() equipment.id = 1 equipment.prior_usage = 250 From 377c35596209c0e388b6db00834baa5394cc30c0 Mon Sep 17 00:00:00 2001 From: Arto Jantunen Date: Sat, 30 Jan 2016 11:24:51 +0200 Subject: [PATCH 4/6] DDBB: Make adding default data optional when creating tables --- pytrainer/lib/ddbb.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pytrainer/lib/ddbb.py b/pytrainer/lib/ddbb.py index 145c063d..ab8a9543 100644 --- a/pytrainer/lib/ddbb.py +++ b/pytrainer/lib/ddbb.py @@ -288,12 +288,12 @@ def lastRecord(self,table): ret_val = self.ddbbObject.freeExec(sql) return ret_val[0][0] - def create_tables(self): + def create_tables(self, add_default=True): """Initialise the database schema from an empty database.""" logging.info("Creating database tables") for entry in tablesList: self.ddbbObject.createTableDefault(entry, tablesList[entry]) - if entry in tablesDefaultData: + if add_default and entry in tablesDefaultData: logging.debug("Adding default data to %s" % entry) for data_dict in tablesDefaultData[entry]: self.insert_dict(entry, data_dict) From b284fdffee3addc94287c3ccdfc6e9f714935c35 Mon Sep 17 00:00:00 2001 From: Arto Jantunen Date: Sat, 30 Jan 2016 11:26:18 +0200 Subject: [PATCH 5/6] sport_test: Use a real DDBB object and database when testing SportService --- pytrainer/test/core/test_sport.py | 125 ++++++++++++------------------ 1 file changed, 51 insertions(+), 74 deletions(-) diff --git a/pytrainer/test/core/test_sport.py b/pytrainer/test/core/test_sport.py index acd42a47..75489bc1 100644 --- a/pytrainer/test/core/test_sport.py +++ b/pytrainer/test/core/test_sport.py @@ -21,6 +21,7 @@ import mock from pytrainer.lib.sqliteUtils import Sql import pytrainer.core +from pytrainer.lib.ddbb import DDBB class SportTest(unittest.TestCase): @@ -220,53 +221,38 @@ def test_color_should_not_accept_none(self): class SportServiceTest(unittest.TestCase): def setUp(self): - self.mock_ddbb = mock.Mock(spec=Sql) + profile = mock.Mock() + profile.getValue = mock.Mock(return_value='memory') + self.mock_ddbb = DDBB(profile) + self.mock_ddbb.connect() + self.mock_ddbb.create_tables(add_default=False) self.sport_service = SportService(self.mock_ddbb) + + def tearDown(self): + self.mock_ddbb.disconnect() def test_store_sport_should_insert_row_when_sport_has_no_id(self): - def mock_select(table, columns, where): - call_count = self.mock_ddbb.select.call_count - if call_count == 2: - return [[1]] - return [] - self.mock_ddbb.select = mock.Mock(wraps=mock_select) sport = Sport() sport.name = u"Test name" - self.sport_service.store_sport(sport) - self.mock_ddbb.insert.assert_called_with("sports", "name,weight,met,max_pace,color", - [u"Test name", 0.0, None, None, "0000ff"]) + sport = self.sport_service.store_sport(sport) + self.assertEquals(1, sport.id) + def test_store_sport_should_update_row_when_sport_has_id(self): - def mock_select(table, columns, where): - if columns == "id_sports": - return [[1]] - else: - return [(1, u"", 0, 0, 0, "0")] - self.mock_ddbb.select = mock.Mock(wraps=mock_select) sport = Sport() - sport.id = 1 + sport.name = u"Test name" + sport = self.sport_service.store_sport(sport) sport.name = u"New name" self.sport_service.store_sport(sport) - self.mock_ddbb.update.assert_called_with("sports", "name,weight,met,max_pace,color", - [u"New name", 0.0, None, None, "0000ff"], "id_sports=1") + sport = self.sport_service.get_sport(1) + self.assertEquals(sport.name, u"New name") def test_store_sport_should_return_stored_sport(self): - sport_ids = [] - def update_sport_ids(*args): - sport_ids.append([1]) - self.mock_ddbb.insert.side_effect = update_sport_ids - def mock_select(table, columns, where): - if columns == "id_sports": - return sport_ids - else: - return [(2, u"", 0, 0, 0, "0")] - self.mock_ddbb.select = mock.Mock(wraps=mock_select) sport = Sport() stored_sport = self.sport_service.store_sport(sport) - self.assertEquals(2, stored_sport.id) + self.assertEquals(1, stored_sport.id) def test_store_sport_should_error_when_sport_has_unknown_id(self): - self.mock_ddbb.select.return_value = [] sport = Sport() sport.id = 100 try: @@ -277,40 +263,41 @@ def test_store_sport_should_error_when_sport_has_unknown_id(self): self.fail() def test_store_sport_should_error_when_new_sport_has_duplicate_name(self): - self.mock_ddbb.select.return_value = [(1, u"Test name", 150, 12.5, 200, "0")] - sport = Sport() - sport.name = u"Test name" + sport1 = Sport() + sport1.name = u"Test name" + self.sport_service.store_sport(sport1) + sport2 = Sport() + sport2.name = u"Test name" try: - self.sport_service.store_sport(sport) + self.sport_service.store_sport(sport2) except(SportServiceException): pass else: self.fail() def test_store_sport_should_error_when_existing_sport_has_duplicate_name(self): - def mock_select(table, columns, where): - if columns == pytrainer.core.sport._ID_COLUMN: - return [[2]] - else: - return [(1, u"Test name", 0, 0.0, "0"), (2, u"New name", 0, 0.0, "0")] - self.mock_ddbb.select = mock.Mock(wraps=mock_select) - sport = Sport() - sport.id = 1 - sport.name = u"New name" + sport1 = Sport() + sport1.name = u"Test name" + self.sport_service.store_sport(sport1) + sport2 = Sport() + sport2.name = u"New name" + self.sport_service.store_sport(sport2) + sport1.name = u"New name" try: - self.sport_service.store_sport(sport) + self.sport_service.store_sport(sport1) except(SportServiceException): pass else: self.fail() def test_get_sport_returns_none_for_nonexistant_sport(self): - self.mock_ddbb.select.return_value = [] sport = self.sport_service.get_sport(1) self.assertEquals(None, sport) def test_get_sport_returns_sport_with_id(self): - self.mock_ddbb.select.return_value = [(1, u"", 0, 0, 0, "0")] + sport = Sport() + sport.name = u"Test name" + self.sport_service.store_sport(sport) sport = self.sport_service.get_sport(1) self.assertEquals(1, sport.id) @@ -323,19 +310,15 @@ def test_get_sport_raises_error_for_id_none(self): self.fail() def test_get_sport_by_name_returns_none_for_nonexistant_sport(self): - self.mock_ddbb.select.return_value = [] sport = self.sport_service.get_sport("no such sport") self.assertEquals(None, sport) def test_get_sport_by_name_returns_sport_with_name(self): - def mock_select(table, columns, where): - if columns == "id_sport": - return [(1)] - else: - return [(1, u"rugby", 0, 0, 0, "0")] - self.mock_ddbb.select = mock.Mock(wraps=mock_select) - sport = self.sport_service.get_sport("rugby") - self.assertEquals(u"rugby", sport.name) + sport1 = Sport() + sport1.name = u"rugby" + self.sport_service.store_sport(sport1) + sport2 = self.sport_service.get_sport("rugby") + self.assertEquals(u"rugby", sport2.name) def test_get_sport_by_name_raises_error_for_none_sport_name(self): try: @@ -346,7 +329,12 @@ def test_get_sport_by_name_raises_error_for_none_sport_name(self): self.fail() def test_get_all_sports_should_return_all_sports_in_query_result(self): - self.mock_ddbb.select.return_value = [(1, u"Test name", 0, 0, 0, "0"), (2, u"Test name 2", 0, 0, 0, "0")] + sport1 = Sport() + sport1.name = u"Test name" + self.sport_service.store_sport(sport1) + sport2 = Sport() + sport2.name = u"Test name 2" + self.sport_service.store_sport(sport2) sports = self.sport_service.get_all_sports() self.assertEquals(2, len(sports)) sport1 = sports[0] @@ -355,12 +343,12 @@ def test_get_all_sports_should_return_all_sports_in_query_result(self): self.assertEquals(2, sport2.id) def test_get_all_sports_should_return_no_sports_when_query_result_empty(self): - self.mock_ddbb.select.return_value = [] sports = self.sport_service.get_all_sports() + for i in sports: + print i.name self.assertEquals(0, len(sports)) def test_remove_sport_should_error_when_sport_has_no_id(self): - self.mock_ddbb.select.return_value = [(1, u"Test name", 150, 12.5, 200, "0")] sport = Sport() try: self.sport_service.remove_sport(sport) @@ -370,7 +358,6 @@ def test_remove_sport_should_error_when_sport_has_no_id(self): self.fail() def test_remove_sport_should_error_when_sport_has_unknown_id(self): - self.mock_ddbb.select.return_value = [] sport = Sport() sport.id = 100 try: @@ -380,20 +367,10 @@ def test_remove_sport_should_error_when_sport_has_unknown_id(self): else: self.fail() - def test_remove_sport_should_delete_sport_with_specified_id(self): - self.mock_ddbb.select.return_value = [[1]] - sport = Sport() - sport.id = 1 - self.sport_service.remove_sport(sport) - self.mock_ddbb.delete.assert_called_with("sports", "id_sports=1") - def test_remove_sport_should_remove_associated_entries(self): - self.mock_ddbb.select.return_value = [[1]] sport = Sport() - sport.id = 1 - delete_arguments = [] - def mock_delete(*args): - delete_arguments.append(args) - self.mock_ddbb.delete = mock.Mock(wraps=mock_delete) + sport.name = u"Test name" + sport = self.sport_service.store_sport(sport) self.sport_service.remove_sport(sport) - self.assertEquals(("records", "sport=1"), delete_arguments[0]) + result = self.sport_service.get_sport(1) + self.assertEquals(result, None) From 94a05b97178d3c4dedd8d2872d820cb14b457ad2 Mon Sep 17 00:00:00 2001 From: Arto Jantunen Date: Sat, 30 Jan 2016 11:30:04 +0200 Subject: [PATCH 6/6] sport_test: Use get_sport_by_name instead of get_sport when intended --- pytrainer/test/core/test_sport.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pytrainer/test/core/test_sport.py b/pytrainer/test/core/test_sport.py index 75489bc1..ffac07b4 100644 --- a/pytrainer/test/core/test_sport.py +++ b/pytrainer/test/core/test_sport.py @@ -310,14 +310,14 @@ def test_get_sport_raises_error_for_id_none(self): self.fail() def test_get_sport_by_name_returns_none_for_nonexistant_sport(self): - sport = self.sport_service.get_sport("no such sport") + sport = self.sport_service.get_sport_by_name("no such sport") self.assertEquals(None, sport) def test_get_sport_by_name_returns_sport_with_name(self): sport1 = Sport() sport1.name = u"rugby" self.sport_service.store_sport(sport1) - sport2 = self.sport_service.get_sport("rugby") + sport2 = self.sport_service.get_sport_by_name("rugby") self.assertEquals(u"rugby", sport2.name) def test_get_sport_by_name_raises_error_for_none_sport_name(self):