From 1b7e63b601675cc02b515d02cd34368b68dff137 Mon Sep 17 00:00:00 2001 From: skrzepto Date: Jun 21 2016 13:19:44 +0000 Subject: [PATCH 1/2] Fixing model relation ship --- 1. when running delete-user.py with the hubs section commented out. When I enter user: `decause` to delete. From the db I see that the users table and associations table is affected and the hub is still around like predicted 2. This is with user already deleted. When I uncomment the hubs section from delete-user.py and enter user: `decause` to delete hub. The db hub row is gone and all its widgets are also all deleted. 3. With user still in db. From the db widgets, hubs. Association is missing the rows with decause in it but decause is still found in the users table just like we want --- diff --git a/hubs/models.py b/hubs/models.py index 32580a6..ee52937 100755 --- a/hubs/models.py +++ b/hubs/models.py @@ -107,8 +107,8 @@ class Association(BASE): primary_key=True) role = sa.Column(sa.Enum(*roles), primary_key=True) - user = relation("User", backref=backref('associations', cascade="all, delete-orphan")) - hub = relation("Hub", backref=backref('associations', cascade="all, delete-orphan")) + user = relation("User", backref=backref('associations', cascade="all, delete")) + hub = relation("Hub", backref=backref('associations', cascade="all, delete")) @classmethod def get(cls, session, hub, user, role): @@ -124,8 +124,7 @@ class Hub(BASE): name = sa.Column(sa.String(50), primary_key=True) summary = sa.Column(sa.String(128)) created_on = sa.Column(sa.DateTime, default=datetime.datetime.utcnow) - widgets = relation('Widget', cascade='all,delete-orphan', single_parent=True, - backref=backref('hub', cascade='all')) + widgets = relation('Widget', cascade='all,delete', backref='hub') left_width = sa.Column(sa.Integer, nullable=False, default=8) archived = sa.Column(sa.Boolean, default=False) user_hub = sa.Column(sa.Boolean, default=False) From 7a8d6257b57e5e9a297a5cd75b1265b33f9a7f85 Mon Sep 17 00:00:00 2001 From: skrzepto Date: Jun 21 2016 17:36:14 +0000 Subject: [PATCH 2/2] adding unittests to model modification removed the long comment --- diff --git a/hubs/models.py b/hubs/models.py index ee52937..681048b 100755 --- a/hubs/models.py +++ b/hubs/models.py @@ -306,6 +306,10 @@ class Widget(BASE): def by_plugin(cls, session, plugin): return session.query(cls).filter_by(plugin=plugin).first() + @classmethod + def by_hub_id_all(cls, session, hub_id): + return session.query(cls).filter_by(hub_id=hub_id).all() + get = by_idx @property diff --git a/hubs/tests/test_models.py b/hubs/tests/test_models.py new file mode 100644 index 0000000..c836a51 --- /dev/null +++ b/hubs/tests/test_models.py @@ -0,0 +1,98 @@ +import hubs +import hubs.models +import hubs.tests +import fedmsg.config + +fedmsg_config = fedmsg.config.load_config() + + +class ModelTest(hubs.tests.APPTest): + def test_delete_user(self): + self.session = hubs.models.init(fedmsg_config['hubs.sqlalchemy.uri']) + + # verify user exists + username = 'ralph' + openid = '%s.id.fedoraproject.org' % username + user = hubs.models.User.get(self.session, openid) + self.assertIsNotNone(user) + + # check if association exists + hub = hubs.models.Hub.get(self.session, username) + assoc = hubs.models.Association.get(self.session, hub, user, 'owner') + self.assertIsNotNone(assoc) + + # delete the user + self.session.delete(user) + user = hubs.models.User.get(self.session, openid) + self.assertIsNone(user) + + # checking to see if the hub is still intact + hub = hubs.models.Hub.get(self.session, username) + self.assertIsNotNone(hub) + self.assertEqual('ralph', hub.name) + + # check if widgets still are intact + widgets = hubs.models.Widget.by_hub_id_all(self.session, hub.name) + self.assertEqual(8, len(widgets)) + + def test_delete_hubs(self): + self.session = hubs.models.init(fedmsg_config['hubs.sqlalchemy.uri']) + + # verify the hub exists + hub_name = 'ralph' + hub = hubs.models.Hub.get(self.session, hub_name) + self.assertIsNotNone(hub) + + # check if association exists + username = 'ralph' + openid = '%s.id.fedoraproject.org' % username + user = hubs.models.User.get(self.session, openid) + assoc = hubs.models.Association.get(self.session, hub, user, 'owner') + self.assertIsNotNone(assoc) + + # check if widgets exist + widgets = hubs.models.Widget.by_hub_id_all(self.session, hub.name) + self.assertEqual(8, len(widgets)) + + # delete the hub + self.session.delete(hub) + + # check if association is removed + assoc = hubs.models.Association.get(self.session, hub, user, 'owner') + self.assertIsNone(assoc) + + # check if widgets are removed + widgets = hubs.models.Widget.by_hub_id_all(self.session, hub.name) + self.assertEqual([], widgets) + + # verify hub is deleted + hub = hubs.models.Hub.get(self.session, hub_name) + self.assertIsNone(hub) + + # check if user is still intact + user = hubs.models.User.get(self.session, openid) + self.assertIsNotNone(user) + self.assertIn('ralph', user.openid) + + def test_delete_user_then_hubs(self): + self.session = hubs.models.init(fedmsg_config['hubs.sqlalchemy.uri']) + username = 'ralph' + openid = '%s.id.fedoraproject.org' % username + user = hubs.models.User.get(self.session, openid) + self.assertIsNotNone(user) + self.session.delete(user) + user = hubs.models.User.get(self.session, openid) + self.assertIsNone(user) + + # checking to see if the hub is still intact + hub = hubs.models.Hub.get(self.session, username) + self.assertIsNotNone(hub) + + self.session.delete(hub) + + # check if widgets are removed + widgets = hubs.models.Widget.by_hub_id_all(self.session, hub.name) + self.assertEqual([], widgets) + + hub = hubs.models.Hub.get(self.session, username) + self.assertIsNone(hub)