From 596bc0151d0a3f6b97b9e3f8fbd8fbf68d5bcd23 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jul 17 2020 08:20:38 +0000 Subject: Fix updating a ticket which is in a board or will no longer be Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/model.py b/pagure/lib/model.py index fbac954..9d366e3 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -3371,14 +3371,14 @@ class BoardIssues(BASE): secondary="board_statuses", primaryjoin="boards_issues.c.status_id==board_statuses.c.id", secondaryjoin="board_statuses.c.board_id==boards.c.id", + uselist=False, + viewonly=True, ) def to_json(self): """ The JSON representation of these objects. """ return { - "board": [bs.to_json() for bs in self.board][0] - if self.board - else [], + "board": self.board.to_json() if self.board else None, "status": self.status.to_json(), "rank": self.rank, } diff --git a/tests/test_pagure_flask_ui_boards.py b/tests/test_pagure_flask_ui_boards.py index 5bd37b7..f52e820 100644 --- a/tests/test_pagure_flask_ui_boards.py +++ b/tests/test_pagure_flask_ui_boards.py @@ -289,13 +289,115 @@ class PagureFlaskUiBoardstests(tests.SimplePagureTest): # There are 3 columns self.assertEqual(output_text.count("drag-inner-list"), 3) self.assertEqual(output_text.count("drag-inner"), 3) - # One ticket (2 per tickets) + # One ticket self.assertEqual(output_text.count(" id_txt"), 1) self.assertEqual(output_text.count(" text-success"), 1) self.assertEqual(output_text.count(" text-danger"), 0) # Two (!) in the nav bar on the issues title + the ticket self.assertEqual(output_text.count("fa-exclamation-circle"), 2) + @patch("pagure.lib.git.update_git", MagicMock(return_value=True)) + @patch("pagure.lib.notify.send_email", MagicMock(return_value=True)) + def test_update_issue_add_tags_check_board_remove_tag_check_board(self): + """ Test the update_issue endpoint. """ + + # Before update, list tags + repo = pagure.lib.query.get_authorized_project(self.session, "test") + tags = pagure.lib.query.get_tags_of_project(self.session, repo) + self.assertEqual([tag.tag for tag in tags], ["dev", "infra"]) + self.assertEqual(repo.issues[0].tags_text, []) + + user = tests.FakeUser() + user.username = "pingou" + with tests.user_set(self.app.application, user): + csrf_token = self.get_csrf() + + # Tag to the issue + data = {"csrf_token": csrf_token, "tag": "dev"} + output = self.app.post( + "/test/issue/1/update", data=data, follow_redirects=True + ) + self.assertEqual(output.status_code, 200) + output_text = output.get_data(as_text=True) + self.assertIn( + "Issue #1: Test issue - test - Pagure", + output_text, + ) + self.assertIn( + '', + output_text, + ) + self.assertIn(" Issue tagged with: dev", output_text) + + # After update, list tags + self.session = pagure.lib.query.create_session(self.dbpath) + repo = pagure.lib.query.get_authorized_project(self.session, "test") + tags = pagure.lib.query.get_tags_of_project(self.session, repo) + self.assertEqual([tag.tag for tag in tags], ["dev", "infra"]) + self.assertEqual(repo.issues[0].tags_text, ["dev"]) + self.assertEqual(repo.issues[1].tags_text, []) + + # Check the board - Ticket added + output = self.app.get("/test/boards/dev") + self.assertEqual(output.status_code, 200) + output_text = output.get_data(as_text=True) + # There are 3 columns + self.assertEqual(output_text.count("drag-inner-list"), 3) + self.assertEqual(output_text.count("drag-inner"), 3) + # One ticket + self.assertEqual(output_text.count(" id_txt"), 1) + self.assertEqual(output_text.count(" text-success"), 1) + self.assertEqual(output_text.count(" text-danger"), 0) + # Two (!) in the nav bar on the issues title + the ticket + self.assertEqual(output_text.count("fa-exclamation-circle"), 2) + + # Now remove the "dev" tag in favor of the "infra" one + user = tests.FakeUser() + user.username = "pingou" + with tests.user_set(self.app.application, user): + csrf_token = self.get_csrf() + + # Tag to the issue + data = {"csrf_token": csrf_token, "tag": "infra"} + output = self.app.post( + "/test/issue/1/update", data=data, follow_redirects=True + ) + self.assertEqual(output.status_code, 200) + output_text = output.get_data(as_text=True) + self.assertIn( + "Issue #1: Test issue - test - Pagure", + output_text, + ) + self.assertIn( + '', + output_text, + ) + self.assertIn(" Issue tagged with: infra", output_text) + + # After update, list tags + self.session = pagure.lib.query.create_session(self.dbpath) + repo = pagure.lib.query.get_authorized_project(self.session, "test") + tags = pagure.lib.query.get_tags_of_project(self.session, repo) + self.assertEqual([tag.tag for tag in tags], ["dev", "infra"]) + self.assertEqual(repo.issues[0].tags_text, ["infra"]) + self.assertEqual(repo.issues[1].tags_text, []) + + # Check the board - Ticket added + output = self.app.get("/test/boards/dev") + self.assertEqual(output.status_code, 200) + output_text = output.get_data(as_text=True) + # There are 3 columns + self.assertEqual(output_text.count("drag-inner-list"), 3) + self.assertEqual(output_text.count("drag-inner"), 3) + # 0 ticket + self.assertEqual(output_text.count(" id_txt"), 0) + self.assertEqual(output_text.count(" text-success"), 0) + self.assertEqual(output_text.count(" text-danger"), 0) + # One (!) in the nav bar on the issues title + self.assertEqual(output_text.count("fa-exclamation-circle"), 1) + def test_view_board_ticket_closed(self): headers = {"Content-Type": "application/json"}