diff --git a/taiga_ncurses/controllers/backlog.py b/taiga_ncurses/controllers/backlog.py index 0622075..805a986 100644 --- a/taiga_ncurses/controllers/backlog.py +++ b/taiga_ncurses/controllers/backlog.py @@ -236,32 +236,30 @@ def handler_edit_user_story_response(self, future): def handler_create_user_stories_in_bulk_request(self): data = self.view.get_user_stories_in_bulk_form_data() - if not data.get("subjects", None): + if not data.get("bulkStories", None): self.view.notifier.error_msg("Subjects are required") else: - pass - #TODO - # us_post_f = self.executor.create_user_stories_in_bulk(data) - # us_post_f.add_done_callback(self.handler_create_user_stories_in_bulk_response) + us_post_f = self.executor.create_user_stories_in_bulk(data) + us_post_f.add_done_callback(self.handler_create_user_stories_in_bulk_response) - #def handler_create_user_stories_in_bulk_response(self, future): - # response = future.result() + def handler_create_user_stories_in_bulk_response(self, future): + response = future.result() - # if response is None: - # self.view.notifier.error_msg("Create error") - # else: - # self.view.notifier.info_msg("Create successful!") - # self.view.close_user_story_form() + if response is None: + self.view.notifier.error_msg("Create error") + else: + self.view.notifier.info_msg("Create successful!") + self.view.close_user_stories_in_bulk_form() - # project_stats_f = self.executor.project_stats(self.view.project) - # project_stats_f.add_done_callback(self.handle_project_stats) + project_stats_f = self.executor.project_stats(self.view.project) + project_stats_f.add_done_callback(self.handle_project_stats) - # user_stories_f = self.executor.unassigned_user_stories(self.view.project) - # user_stories_f.add_done_callback(self.handle_user_stories) + user_stories_f = self.executor.unassigned_user_stories(self.view.project) + user_stories_f.add_done_callback(self.handle_user_stories) - # futures = (project_stats_f, user_stories_f) - # futures_completed_f = self.executor.pool.submit(lambda : wait(futures, 10)) - # futures_completed_f.add_done_callback(self.when_backlog_info_fetched) + futures = (project_stats_f, user_stories_f) + futures_completed_f = self.executor.pool.submit(lambda : wait(futures, 10)) + futures_completed_f.add_done_callback(self.when_backlog_info_fetched) def handler_delete_user_story_response(self, future): response = future.result() diff --git a/taiga_ncurses/executor.py b/taiga_ncurses/executor.py index bd65a66..3546f7c 100644 --- a/taiga_ncurses/executor.py +++ b/taiga_ncurses/executor.py @@ -45,6 +45,9 @@ def milestone_stats(self, milestone, project): def create_user_story(self, data): return self.pool.submit(self.client.create_user_story, data_dict=data) + def create_user_stories_in_bulk(self, data): + return self.pool.submit(self.client.create_user_stories_in_bulk, data_dict=data) + def update_user_story(self, user_story, data): return self.pool.submit(self.client.update_user_story, id=user_story["id"], data_dict=data) diff --git a/taiga_ncurses/ui/views/backlog.py b/taiga_ncurses/ui/views/backlog.py index bd26dac..aa67892 100644 --- a/taiga_ncurses/ui/views/backlog.py +++ b/taiga_ncurses/ui/views/backlog.py @@ -91,7 +91,8 @@ def get_user_stories_in_bulk_form_data(self): data = {} if hasattr(self, "user_stories_in_bulk_form"): data.update({ - "subjects": self.user_stories_in_bulk_form.subjects, + "bulkStories": self.user_stories_in_bulk_form.subjects, + "projectId": self.project["id"], }) return data diff --git a/tests/controllers/test_backlog_controller.py b/tests/controllers/test_backlog_controller.py index 8ab9c18..655c6fc 100644 --- a/tests/controllers/test_backlog_controller.py +++ b/tests/controllers/test_backlog_controller.py @@ -340,3 +340,61 @@ def test_backlog_controller_change_user_story_points(): assert project_view.backlog.notifier.info_msg.call_count == 1 assert list(executor.update_user_story.call_args.call_list()[0][0][1]["points"].values())[0] == item.value assert executor.update_user_story.call_count == 1 + +# BULK + +def test_backlog_controller_show_the_new_user_stories_in_bulk_form(): + project = factories.project() + project_view = views.projects.ProjectDetailView(project) + executor = factories.patched_executor() + _ = mock.Mock() + project_detail_controller = controllers.projects.ProjectDetailController(project_view, executor, _) + + assert not hasattr(project_detail_controller.view.backlog, "user_stories_in_bulk_form") + project_detail_controller.handle(config.ProjectBacklogKeys.CREATE_USER_STORIES_IN_BULK) + assert hasattr(project_detail_controller.view.backlog, "user_stories_in_bulk_form") + +def test_backlog_controller_cancel_the_new_user_stories_in_bulk_form(): + project = factories.project() + project_view = views.projects.ProjectDetailView(project) + executor = factories.patched_executor() + _ = mock.Mock() + project_detail_controller = controllers.projects.ProjectDetailController(project_view, executor, _) + project_detail_controller.handle(config.ProjectBacklogKeys.CREATE_USER_STORIES_IN_BULK) + + assert hasattr(project_detail_controller.view.backlog, "user_stories_in_bulk_form") + form = project_detail_controller.view.backlog.user_stories_in_bulk_form + signals.emit(form.cancel_button, "click") + assert not hasattr(project_detail_controller.view.backlog, "user_stories_in_bulk_form") + +def test_backlog_controller_submit_new_user_stories_in_bulk_form_with_errors(): + project = factories.project() + project_view = views.projects.ProjectDetailView(project) + project_view.backlog.notifier = mock.Mock() + executor = factories.patched_executor() + _ = mock.Mock() + project_detail_controller = controllers.projects.ProjectDetailController(project_view, executor, _) + project_detail_controller.handle(config.ProjectBacklogKeys.CREATE_USER_STORIES_IN_BULK) + form = project_detail_controller.view.backlog.user_stories_in_bulk_form + + signals.emit(form.save_button, "click") + assert project_view.backlog.notifier.error_msg.call_count == 1 + +def test_backlog_controller_submit_new_user_stories_in_bulk_form_successfully(): + us_subjects = "Create a new user story 1\nCreate a new user story 2" + project = factories.project() + project_view = views.projects.ProjectDetailView(project) + project_view.backlog.notifier = mock.Mock() + executor = factories.patched_executor() + _ = mock.Mock() + project_detail_controller = controllers.projects.ProjectDetailController(project_view, executor, _) + project_detail_controller.handle(config.ProjectBacklogKeys.CREATE_USER_STORIES_IN_BULK) + form = project_detail_controller.view.backlog.user_stories_in_bulk_form + project_view.backlog.notifier.reset_mock() + + form._subjects_edit.set_edit_text(us_subjects) + signals.emit(form.save_button, "click") + assert project_view.backlog.notifier.info_msg.call_count == 1 + assert executor.create_user_stories_in_bulk.call_args.call_list()[0][0][0]["bulkStories"] == us_subjects + assert executor.create_user_stories_in_bulk.call_count == 1 + assert executor.create_user_stories_in_bulk.return_value.result() diff --git a/tests/factories.py b/tests/factories.py index e924877..04bbc1d 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -111,6 +111,9 @@ def successful_update_user_story_response(subject): "watchers": [] } +def successful_create_user_stories_in_bulk_response(): + return True + def successful_update_user_stories_order_response(): return True @@ -250,6 +253,8 @@ def patched_executor(login_response=future(successful_login_response("admin")), user_stories=future(user_stories()), create_user_story_response=future(successful_create_user_story_response("Create us")), update_user_story_response=future(successful_update_user_story_response("Update us")), + create_user_stories_in_bulk_response=future( + successful_create_user_stories_in_bulk_response()), update_user_stories_order_response=future(successful_update_user_stories_order_response()), delete_user_story_response=future(successful_delete_user_story_response()), tasks=future(tasks()), @@ -275,6 +280,7 @@ def patched_executor(login_response=future(successful_login_response("admin")), executor.unassigned_user_stories = mock.Mock(return_value=unassigned_user_stories) executor.create_user_story = mock.Mock(return_value=create_user_story_response) executor.update_user_story = mock.Mock(return_value=update_user_story_response) + executor.create_user_stories_in_bulk = mock.Mock(return_value=create_user_stories_in_bulk_response) executor.update_user_stories_order = mock.Mock(return_value=update_user_stories_order_response) executor.delete_user_story = mock.Mock(return_value=delete_user_story_response) diff --git a/tests/test_executor.py b/tests/test_executor.py index daa410d..caa124d 100644 --- a/tests/test_executor.py +++ b/tests/test_executor.py @@ -68,6 +68,12 @@ def test_delete_user_story_method_returns_a_future(): f = e.delete_user_story({"id": 123123}) assert isinstance(f, Future) +def test_create_user_stories_in_bulk_method_returns_a_future(): + client = mock.Mock() + e = executor.Executor(client) + f = e.create_user_stories_in_bulk({"ulkStories": "A\nB\nC", "projectId": 1}) + assert isinstance(f, Future) + def test_update_user_stories_order_method_returns_a_future(): client = mock.Mock() e = executor.Executor(client)