From b502ec35b0aa2ac00e788548845e93611abe9936 Mon Sep 17 00:00:00 2001 From: Clark Boylan Date: Mon, 18 Apr 2022 15:36:24 -0700 Subject: [PATCH] Omnibus fixups for storyboard testing and CI Linting fails due to two different hacking rules: H214 and H216. We fix H214 by using assertNotIn and assertIn over assertFalse(foo in bar) and assertTrue(foo in bar). We ignore H216 as it says don't use the mock library but storyboard actually does use mock and updating to use unittest.mock appears to be a fair bit of work. In the sqlaclhemy models we move some classes around to address this error: sqlalchemy.exc.InvalidRequestError: When initializing mapper mapped class Story->stories, expression 'TimeLineEvent' failed to locate a name ('TimeLineEvent'). If this is a class name, consider adding this relationship() to the class after both dependent classes have been defined. In the project loader we switch to using yaml.safe_load() to avoid the missing Loader argument to yaml.load(). We pin jinja2 to < 3.0.0 as the old sphinx we've pinned to uses contextfunction which appears to have been replaced in jinja2 3.0.0. We should probably attempt to update the doc toolchain for storyboard when we have time. We pin MarkupSafe for similar reasons to the jinja2 pin. Version 2.1.0 of MarkupSafe removed the soft_unicode name which is used by sphinx. Finally we run the python 3.6 and 3.7 jobs on ubuntu-bionic. Change-Id: Ifcb6660ce2c89c21ba867aa88d942461bcff125d --- .zuul.yaml | 4 + doc/requirements.txt | 2 + storyboard/db/models.py | 78 +++++++++---------- storyboard/db/projects_loader.py | 2 +- storyboard/tests/api/test_project_groups.py | 14 ++-- storyboard/tests/api/test_projects.py | 20 ++--- storyboard/tests/api/test_stories.py | 24 +++--- storyboard/tests/api/test_task_statuses.py | 8 +- storyboard/tests/api/test_tasks.py | 28 +++---- .../db/migration/test_unique_revisions.py | 4 +- .../tests/plugin/test_user_preferences.py | 6 +- tox.ini | 3 +- 12 files changed, 100 insertions(+), 93 deletions(-) diff --git a/.zuul.yaml b/.zuul.yaml index c4681084..759ee9d6 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -89,8 +89,10 @@ - tox-pep8 - tox-py36: timeout: 6000 + nodeset: ubuntu-bionic - tox-py37: timeout: 6000 + nodeset: ubuntu-bionic - tox-py38: timeout: 6000 - opendev-buildset-registry @@ -101,8 +103,10 @@ - tox-pep8 - tox-py36: timeout: 6000 + nodeset: ubuntu-bionic - tox-py37: timeout: 6000 + nodeset: ubuntu-bionic - tox-py38: timeout: 6000 - opendev-buildset-registry diff --git a/doc/requirements.txt b/doc/requirements.txt index aea0a6e9..d5e78edc 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -1,6 +1,8 @@ # The order of packages is significant, because pip processes them in the order # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. +jinja2<3.0.0 +MarkupSafe<2.1.0 sphinx<2.0.0 sphinxcontrib-pecanwsme>=0.5 openstackdocstheme diff --git a/storyboard/db/models.py b/storyboard/db/models.py index 1fb8f77b..ad876d2e 100644 --- a/storyboard/db/models.py +++ b/storyboard/db/models.py @@ -310,6 +310,45 @@ story_storytags = Table( ) +# Time-line models + +class TimeLineEvent(ModelBuilder, Base): + __tablename__ = 'events' + + story_id = Column(Integer, ForeignKey('stories.id'), nullable=True) + worklist_id = Column(Integer, ForeignKey('worklists.id'), nullable=True) + board_id = Column(Integer, ForeignKey('boards.id'), nullable=True) + comment_id = Column(Integer, ForeignKey('comments.id'), nullable=True) + comment = relationship('Comment', backref='event') + author_id = Column(Integer, ForeignKey('users.id'), nullable=True) + + event_type = Column(Enum(*event_types.ALL), nullable=False) + + # this info field should contain additional fields to describe the event + # ex. {'old_status': 'Todo', 'new_status': 'In progress'} + # or {'old_assignee_id': 1, 'new_assignee_id': 42} + event_info = Column(UnicodeText(), nullable=True) + + +class Comment(FullText, ModelBuilder, Base): + __fulltext_columns__ = ['content'] + + id = Column(Integer, primary_key=True) + content = Column(MYSQL_MEDIUM_TEXT) + is_active = Column(Boolean, default=True) + in_reply_to = Column(Integer, ForeignKey('comments.id')) + parent = relationship('Comment', remote_side=[id], backref='children') + + +class HistoricalComment(FullText, ModelBuilder, Base): + __tablename__ = 'comments_history' + __fulltext_columns__ = ['content'] + + content = Column(MYSQL_MEDIUM_TEXT) + comment_id = Column(Integer, ForeignKey('comments.id'), nullable=False) + current = relationship(Comment, backref='history') + + class Story(FullText, ModelBuilder, Base): __tablename__ = 'stories' @@ -526,45 +565,6 @@ class StorySummary(Base): "task_statuses"] -# Time-line models - -class TimeLineEvent(ModelBuilder, Base): - __tablename__ = 'events' - - story_id = Column(Integer, ForeignKey('stories.id'), nullable=True) - worklist_id = Column(Integer, ForeignKey('worklists.id'), nullable=True) - board_id = Column(Integer, ForeignKey('boards.id'), nullable=True) - comment_id = Column(Integer, ForeignKey('comments.id'), nullable=True) - comment = relationship('Comment', backref='event') - author_id = Column(Integer, ForeignKey('users.id'), nullable=True) - - event_type = Column(Enum(*event_types.ALL), nullable=False) - - # this info field should contain additional fields to describe the event - # ex. {'old_status': 'Todo', 'new_status': 'In progress'} - # or {'old_assignee_id': 1, 'new_assignee_id': 42} - event_info = Column(UnicodeText(), nullable=True) - - -class Comment(FullText, ModelBuilder, Base): - __fulltext_columns__ = ['content'] - - id = Column(Integer, primary_key=True) - content = Column(MYSQL_MEDIUM_TEXT) - is_active = Column(Boolean, default=True) - in_reply_to = Column(Integer, ForeignKey('comments.id')) - parent = relationship('Comment', remote_side=[id], backref='children') - - -class HistoricalComment(FullText, ModelBuilder, Base): - __tablename__ = 'comments_history' - __fulltext_columns__ = ['content'] - - content = Column(MYSQL_MEDIUM_TEXT) - comment_id = Column(Integer, ForeignKey('comments.id'), nullable=False) - current = relationship(Comment, backref='history') - - # Subscription and notifications class Subscription(ModelBuilder, Base): diff --git a/storyboard/db/projects_loader.py b/storyboard/db/projects_loader.py index 4a542a8a..61996d1a 100644 --- a/storyboard/db/projects_loader.py +++ b/storyboard/db/projects_loader.py @@ -38,7 +38,7 @@ LOG = log.getLogger(__name__) def do_load_models(filename): config_file = open(filename) session = db_api.get_session(autocommit=False, in_request=False) - projects_list = yaml.load(config_file) + projects_list = yaml.safe_load(config_file) project_groups = list() diff --git a/storyboard/tests/api/test_project_groups.py b/storyboard/tests/api/test_project_groups.py index d908218b..1b37043a 100644 --- a/storyboard/tests/api/test_project_groups.py +++ b/storyboard/tests/api/test_project_groups.py @@ -151,7 +151,7 @@ class TestProjectGroupSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(1, len(results.json)) self.assertEqual('1', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual('projectgroup2', result['name']) @@ -164,7 +164,7 @@ class TestProjectGroupSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -179,7 +179,7 @@ class TestProjectGroupSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -196,7 +196,7 @@ class TestProjectGroupSearch(base.FunctionalTest): self.assertEqual(1, len(results.json)) self.assertEqual('2', results.headers['X-Total']) self.assertEqual('1', results.headers['X-Limit']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -224,7 +224,7 @@ class TestProjectGroupSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(3, result['id']) @@ -242,7 +242,7 @@ class TestProjectGroupSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -259,4 +259,4 @@ class TestProjectGroupSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(0, len(results.json)) self.assertEqual('0', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) diff --git a/storyboard/tests/api/test_projects.py b/storyboard/tests/api/test_projects.py index 6b1ea10b..e9c6a7eb 100644 --- a/storyboard/tests/api/test_projects.py +++ b/storyboard/tests/api/test_projects.py @@ -143,7 +143,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_by_name(self): url = self.build_search_url({ @@ -153,7 +153,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(1, len(results.json)) self.assertEqual('1', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual('project1', result['name']) @@ -166,7 +166,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -181,7 +181,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(2, result['id']) @@ -197,7 +197,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(1, len(results.json)) self.assertEqual('1', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(2, result['id']) @@ -210,7 +210,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(0, len(results.json)) self.assertEqual('0', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_limit(self): url = self.build_search_url({ @@ -222,7 +222,7 @@ class TestProjectSearch(base.FunctionalTest): self.assertEqual(1, len(results.json)) self.assertEqual('2', results.headers['X-Total']) self.assertEqual('1', results.headers['X-Limit']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -250,7 +250,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(3, result['id']) @@ -268,7 +268,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -285,4 +285,4 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(0, len(results.json)) self.assertEqual('0', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) diff --git a/storyboard/tests/api/test_stories.py b/storyboard/tests/api/test_stories.py index d3cb1bed..6995fd30 100644 --- a/storyboard/tests/api/test_stories.py +++ b/storyboard/tests/api/test_stories.py @@ -253,7 +253,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(5, len(results.json)) self.assertEqual('5', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_by_title(self): url = self.build_search_url({ @@ -263,7 +263,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -278,7 +278,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -293,7 +293,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(1, len(results.json)) self.assertEqual('1', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -304,7 +304,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -319,7 +319,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -334,7 +334,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -349,7 +349,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(1, len(results.json)) self.assertEqual('1', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -401,7 +401,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(0, len(results.json)) self.assertEqual('0', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_limit(self): url = self.build_search_url({ @@ -413,7 +413,7 @@ class TestStorySearch(base.FunctionalTest): self.assertEqual(1, len(results.json)) self.assertEqual('2', results.headers['X-Total']) self.assertEqual('1', results.headers['X-Limit']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -441,7 +441,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(5, len(results.json)) self.assertEqual('5', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(5, result['id']) @@ -463,7 +463,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(5, len(results.json)) self.assertEqual('5', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) diff --git a/storyboard/tests/api/test_task_statuses.py b/storyboard/tests/api/test_task_statuses.py index 8f6e90b8..4b10d265 100644 --- a/storyboard/tests/api/test_task_statuses.py +++ b/storyboard/tests/api/test_task_statuses.py @@ -36,7 +36,7 @@ class TestTaskStatusesSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(5, len(results.json)) self.assertEqual('5', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_by_name(self): """Test searching by various names.""" @@ -49,7 +49,7 @@ class TestTaskStatusesSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(1, len(results.json)) self.assertEqual('1', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) # Assert that searching by 'task status' or some permutation works. url = self.build_search_url({ @@ -59,7 +59,7 @@ class TestTaskStatusesSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(5, len(results.json)) self.assertEqual('5', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) url = self.build_search_url({ 'name': 'stat' @@ -68,7 +68,7 @@ class TestTaskStatusesSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(5, len(results.json)) self.assertEqual('5', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_constrain(self): """Test constraint searches.""" diff --git a/storyboard/tests/api/test_tasks.py b/storyboard/tests/api/test_tasks.py index f457855e..780b7a64 100644 --- a/storyboard/tests/api/test_tasks.py +++ b/storyboard/tests/api/test_tasks.py @@ -423,7 +423,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(4, len(results.json)) self.assertEqual('4', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_by_title(self): url = self.build_search_url({ @@ -433,7 +433,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -448,7 +448,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -465,7 +465,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(1, len(results.json)) self.assertEqual('1', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -478,7 +478,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(2, result['id']) @@ -493,7 +493,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(2, result['id']) @@ -510,7 +510,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(2, result['id']) @@ -523,7 +523,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(2, result['id']) @@ -540,7 +540,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -553,7 +553,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(2, result['id']) @@ -568,7 +568,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(0, len(results.json)) self.assertEqual('0', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_limit(self): url = self.build_search_url({ @@ -580,7 +580,7 @@ class TestTaskSearch(base.FunctionalTest): self.assertEqual(1, len(results.json)) self.assertEqual('2', results.headers['X-Total']) self.assertEqual('1', results.headers['X-Limit']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -608,7 +608,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(4, len(results.json)) self.assertEqual('4', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -628,7 +628,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(4, len(results.json)) self.assertEqual('4', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(4, result['id']) diff --git a/storyboard/tests/db/migration/test_unique_revisions.py b/storyboard/tests/db/migration/test_unique_revisions.py index 4f565e4a..8c3a3ba4 100644 --- a/storyboard/tests/db/migration/test_unique_revisions.py +++ b/storyboard/tests/db/migration/test_unique_revisions.py @@ -43,13 +43,13 @@ class UniqueRevisionsTestCase(testtools.TestCase): module = imp.load_source('module', six.text_type(module_path)) revision_id = module.revision - self.assertFalse(revision_id in revisions, + self.assertNotIn(revision_id, revisions, "Found two revisions with id %s" % revision_id) revisions.add(revision_id) down_revision_id = module.revision - self.assertFalse(down_revision_id in down_revisions, + self.assertNotIn(down_revision_id, down_revisions, "Found two revisions with down_revision_id %s" % revision_id) down_revisions.add(down_revision_id) diff --git a/storyboard/tests/plugin/test_user_preferences.py b/storyboard/tests/plugin/test_user_preferences.py index 7cc76dd3..d6a94d96 100644 --- a/storyboard/tests/plugin/test_user_preferences.py +++ b/storyboard/tests/plugin/test_user_preferences.py @@ -53,9 +53,9 @@ class TestUserPreferencesPluginBase(base.TestCase): self.assertEqual(2, len(manager.extensions)) manager.map(prefs_base.load_preferences, loaded_prefs) - self.assertTrue("foo" in loaded_prefs) - self.assertTrue("omg" in loaded_prefs) - self.assertTrue("lol" in loaded_prefs) + self.assertIn("foo", loaded_prefs) + self.assertIn("omg", loaded_prefs) + self.assertIn("lol", loaded_prefs) self.assertEqual(loaded_prefs["foo"], "baz") self.assertEqual(loaded_prefs["omg"], "wat") diff --git a/tox.ini b/tox.ini index 00b9d984..18f16cef 100644 --- a/tox.ini +++ b/tox.ini @@ -54,8 +54,9 @@ commands = # The following rules should either be addressed or determined to be # skippable long term. # E265 is ignored to make switch to newer hacking easier +# H216 is ignored to allow use of the mock library instead of unittest.mock # H405 is ignored to make switch to newer hacking easier -ignore = E125,E128,E265,H405,W503 +ignore = E125,E128,E265,H216,H405,W503 builtins = _ show-source = True exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build