From bb1c54fa03a2b294fe912ca763166630b9511fb9 Mon Sep 17 00:00:00 2001 From: Jose Javier Merchante Date: Tue, 20 Jan 2026 10:49:37 +0100 Subject: [PATCH] Support GitHub issues events This commit extends the eventizer to collect GitHub issues and the related identities. Signed-off-by: Jose Javier Merchante --- src/grimoirelab/core/consumers/identities.py | 13 + .../core/scheduler/tasks/chronicler.py | 25 +- tests/unit/scheduler/data/github_issues.json | 1118 +++++++++++++++++ tests/unit/scheduler/test_task_eventizer.py | 83 +- ui/src/components/FormDialog.vue | 28 +- 5 files changed, 1258 insertions(+), 9 deletions(-) create mode 100644 tests/unit/scheduler/data/github_issues.json diff --git a/src/grimoirelab/core/consumers/identities.py b/src/grimoirelab/core/consumers/identities.py index 56392c5..2ba168b 100644 --- a/src/grimoirelab/core/consumers/identities.py +++ b/src/grimoirelab/core/consumers/identities.py @@ -45,6 +45,14 @@ GIT_EVENT_COMMIT_TESTED_BY, ) +from chronicler.events.core.github import ( + GITHUB_EVENT_AUTHOR, + GITHUB_EVENT_ASSIGNEE, + GITHUB_EVENT_CLOSED_BY, + GITHUB_EVENT_CREATED_BY, + GITHUB_EVENT_COMMENT_AUTHOR, +) + IDENTITY_EVENTS = ( GIT_EVENT_COMMIT_AUTHORED_BY, @@ -58,6 +66,11 @@ GIT_EVENT_COMMIT_SIGNED_OFF_BY, GIT_EVENT_COMMIT_SUGGESTED_BY, GIT_EVENT_COMMIT_TESTED_BY, + GITHUB_EVENT_AUTHOR, + GITHUB_EVENT_ASSIGNEE, + GITHUB_EVENT_CLOSED_BY, + GITHUB_EVENT_CREATED_BY, + GITHUB_EVENT_COMMENT_AUTHOR, ) diff --git a/src/grimoirelab/core/scheduler/tasks/chronicler.py b/src/grimoirelab/core/scheduler/tasks/chronicler.py index 4fd775d..a5f150d 100644 --- a/src/grimoirelab/core/scheduler/tasks/chronicler.py +++ b/src/grimoirelab/core/scheduler/tasks/chronicler.py @@ -77,6 +77,12 @@ def chronicler_job( backend_args = job_args.copy() if job_args else {} + # Convert common datetime arguments + datetime_args = ["from_date", "to_date"] + for arg in datetime_args: + if arg in backend_args and isinstance(backend_args[arg], str): + backend_args[arg] = str_to_datetime(backend_args[arg]) + # Get the generator to fetch the data items perceval_gen = perceval.backend.BackendItemsGenerator( backend_class, backend_args, datasource_category @@ -222,7 +228,7 @@ def resuming_args( params = {} if progress.summary and progress.summary.fetched > 0: - params["from_date"] = progress.summary.max_updated_on + params["from_date"] = progress.summary.max_updated_on.isoformat() if progress.summary.max_offset: params["offset"] = progress.summary.max_offset @@ -239,7 +245,7 @@ def recovery_args( return ChroniclerArgumentGenerator.resuming_args(task_args, progress) -def get_chronicler_argument_generator(name: str) -> ChroniclerArgumentGenerator: +def get_chronicler_argument_generator(name: str) -> type[ChroniclerArgumentGenerator]: """Get the argument generator for a backend.""" generators = { @@ -320,9 +326,14 @@ def initial_args(task_args: dict[str, Any]) -> dict[str, Any]: # For the first execution make some arguments mandatory job_args = {} - job_args["owner"] = task_args["owner"] - job_args["repository"] = task_args["repository"] + uri = task_args["uri"] + processed_uri = uri.rstrip("/").rstrip(".git", "") + path_parts = processed_uri.split("/") + job_args["owner"] = path_parts[-2] + job_args["repository"] = path_parts[-1] + + # TODO: Obtain tokens from a secure storage tokens = task_args.get("api_token", []) if not isinstance(tokens, list): @@ -331,6 +342,8 @@ def initial_args(task_args: dict[str, Any]) -> dict[str, Any]: job_args["api_token"] = tokens job_args["sleep_for_rate"] = True + return job_args + @staticmethod def resuming_args( task_args: dict[str, Any] | None, @@ -340,7 +353,7 @@ def resuming_args( job_args = task_args.copy() if task_args else {} job_args["sleep_for_rate"] = True - job_args["from_date"] = progress.summary.last_updated_on + job_args["from_date"] = progress.summary.last_updated_on.isoformat() return job_args @@ -354,7 +367,7 @@ def recovery_args( job_args = task_args.copy() if task_args else {} if progress.summary and progress.summary.last_updated_on: - job_args["from_date"] = progress.summary.last_updated_on + job_args["from_date"] = progress.summary.last_updated_on.isoformat() return job_args diff --git a/tests/unit/scheduler/data/github_issues.json b/tests/unit/scheduler/data/github_issues.json new file mode 100644 index 0000000..c6d3180 --- /dev/null +++ b/tests/unit/scheduler/data/github_issues.json @@ -0,0 +1,1118 @@ +[ + { + "backend_name":"GitHub", + "backend_version":"1.0.0", + "perceval_version":"1.4.0", + "timestamp":1.768825308844442E9, + "origin":"https://github.com/example_user/tmp", + "uuid":"a548ead04e53ace59cbfc271849b23d00dc9d251", + "updated_on":1.768819573E9, + "classified_fields_filtered":null, + "category":"issue", + "search_fields":{ + "item_id":"3829113706", + "owner":"example_user", + "repo":"tmp" + }, + "tag":"https://github.com/example_user/tmp", + "data":{ + "url":"https://api.github.com/repos/example_user/tmp/issues/1", + "repository_url":"https://api.github.com/repos/example_user/tmp", + "labels_url":"https://api.github.com/repos/example_user/tmp/issues/1/labels{/name}", + "comments_url":"https://api.github.com/repos/example_user/tmp/issues/1/comments", + "events_url":"https://api.github.com/repos/example_user/tmp/issues/1/events", + "html_url":"https://github.com/example_user/tmp/issues/1", + "id":3829113706, + "node_id":"I_kwDOLc5Lw87kO6Nq", + "number":1, + "title":"Test issue", + "user":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false + }, + "labels":[ + { + "id":6658949253, + "node_id":"LA_kwDOLc5Lw88AAAABjOeAhQ", + "url":"https://api.github.com/repos/example_user/tmp/labels/bug", + "name":"bug", + "color":"d73a4a", + "default":true, + "description":"Something isn't working" + } + ], + "state":"open", + "locked":false, + "assignee":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false + }, + "assignees":[ + { + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_vents", + "type":"User", + "user_view_type":"public", + "site_admin":false + } + ], + "milestone":null, + "comments":1, + "created_at":"2026-01-19T10:45:53Z", + "updated_at":"2026-01-19T10:46:13Z", + "closed_at":null, + "author_association":"OWNER", + "active_lock_reason":null, + "sub_issues_summary":{ + "total":0, + "completed":0, + "percent_completed":0 + }, + "issue_dependencies_summary":{ + "blocked_by":0, + "total_blocked_by":0, + "blocking":0, + "total_blocking":0 + }, + "body":"Description issue", + "closed_by":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false + }, + "reactions":{ + "url":"https://api.github.com/repos/example_user/tmp/issues/1/reactions", + "total_count":0, + "+1":0, + "-1":0, + "laugh":0, + "hooray":0, + "confused":0, + "heart":0, + "rocket":0, + "eyes":0 + }, + "timeline_url":"https://api.github.com/repos/example_user/tmp/issues/1/timeline", + "performed_via_github_app":null, + "state_reason":"reopened", + "user_data":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false, + "name":null, + "company":null, + "blog":"", + "location":null, + "email":null, + "hireable":null, + "bio":null, + "twitter_username":null, + "public_repos":14, + "public_gists":0, + "followers":0, + "following":0, + "created_at":"2019-06-03T09:54:17Z", + "updated_at":"2026-01-19T10:45:12Z", + "organizations":[ ] + }, + "assignee_data":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false, + "name":null, + "company":null, + "blog":"", + "location":null, + "email":null, + "hireable":null, + "bio":null, + "twitter_username":null, + "public_repos":14, + "public_gists":0, + "followers":0, + "following":0, + "created_at":"2019-06-03T09:54:17Z", + "updated_at":"2026-01-19T10:45:12Z", + "organizations":[ ] + }, + "assignees_data":[ + { + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false, + "name":null, + "company":null, + "blog":"", + "location":null, + "email":null, + "hireable":null, + "bio":null, + "twitter_username":null, + "public_repos":14, + "public_gists":0, + "followers":0, + "following":0, + "created_at":"2019-06-03T09:54:17Z", + "updated_at":"2026-01-19T10:45:12Z", + "organizations":[ ] + } + ], + "comments_data":[ + { + "url":"https://api.github.com/repos/example_user/tmp/issues/comments/3767671300", + "html_url":"https://github.com/example_user/tmp/issues/1#issuecomment-3767671300", + "issue_url":"https://api.github.com/repos/example_user/tmp/issues/1", + "id":3767671300, + "node_id":"IC_kwDOLc5Lw87gkhoE", + "user":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false + }, + "created_at":"2026-01-19T10:45:59Z", + "updated_at":"2026-01-19T10:45:59Z", + "body":"Comment 1", + "author_association":"OWNER", + "reactions":{ + "url":"https://api.github.com/repos/example_user/tmp/issues/comments/3767671300/reactions", + "total_count":1, + "+1":1, + "-1":0, + "laugh":0, + "hooray":0, + "confused":0, + "heart":0, + "rocket":0, + "eyes":0 + }, + "performed_via_github_app":null, + "user_data":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false, + "name":null, + "company":null, + "blog":"", + "location":null, + "email":null, + "hireable":null, + "bio":null, + "twitter_username":null, + "public_repos":14, + "public_gists":0, + "followers":0, + "following":0, + "created_at":"2019-06-03T09:54:17Z", + "updated_at":"2026-01-19T10:45:12Z", + "organizations":[ ] + }, + "reactions_data":[ + { + "id":324746517, + "node_id":"REA_lALOLc5Lw87gkhoEzhNbPRU", + "user":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false + }, + "content":"+1", + "created_at":"2026-01-19T10:46:01Z", + "user_data":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false, + "name":null, + "company":null, + "blog":"", + "location":null, + "email":null, + "hireable":null, + "bio":null, + "twitter_username":null, + "public_repos":14, + "public_gists":0, + "followers":0, + "following":0, + "created_at":"2019-06-03T09:54:17Z", + "updated_at":"2026-01-19T10:45:12Z", + "organizations":[ ] + } + } + ] + } + ], + "reactions_data":[ ] + } + }, + { + "backend_name":"GitHub", + "backend_version":"1.0.0", + "perceval_version":"1.4.0", + "timestamp":1.768825309192627E9, + "origin":"https://github.com/example_user/tmp", + "uuid":"9654465e0137fa44acbec0ea546a83a759abf462", + "updated_on":1.768819675E9, + "classified_fields_filtered":null, + "category":"issue", + "search_fields":{ + "item_id":"3829117343", + "owner":"example_user", + "repo":"tmp" + }, + "tag":"https://github.com/example_user/tmp", + "data":{ + "url":"https://api.github.com/repos/example_user/tmp/issues/2", + "repository_url":"https://api.github.com/repos/example_user/tmp", + "labels_url":"https://api.github.com/repos/example_user/tmp/issues/2/labels{/name}", + "comments_url":"https://api.github.com/repos/example_user/tmp/issues/2/comments", + "events_url":"https://api.github.com/repos/example_user/tmp/issues/2/events", + "html_url":"https://github.com/example_user/tmp/pull/2", + "id":3829117343, + "node_id":"PR_kwDOLc5Lw869-f6P", + "number":2, + "title":"Update 1710157816", + "user":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false + }, + "labels":[ + { + "id":6658949257, + "node_id":"LA_kwDOLc5Lw88AAAABjOeAiQ", + "url":"https://api.github.com/repos/example_user/tmp/labels/documentation", + "name":"documentation", + "color":"0075ca", + "default":true, + "description":"Improvements or additions to documentation" + } + ], + "state":"closed", + "locked":false, + "assignee":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false + }, + "assignees":[ + { + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false + } + ], + "milestone":null, + "comments":0, + "created_at":"2026-01-19T10:46:53Z", + "updated_at":"2026-01-19T10:47:55Z", + "closed_at":"2026-01-19T10:47:55Z", + "author_association":"OWNER", + "active_lock_reason":null, + "draft":false, + "pull_request":{ + "url":"https://api.github.com/repos/example_user/tmp/pulls/2", + "html_url":"https://github.com/example_user/tmp/pull/2", + "diff_url":"https://github.com/example_user/tmp/pull/2.diff", + "patch_url":"https://github.com/example_user/tmp/pull/2.patch", + "merged_at":"2026-01-19T10:47:55Z" + }, + "body":"PR description", + "closed_by":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false + }, + "reactions":{ + "url":"https://api.github.com/repos/example_user/tmp/issues/2/reactions", + "total_count":1, + "+1":1, + "-1":0, + "laugh":0, + "hooray":0, + "confused":0, + "heart":0, + "rocket":0, + "eyes":0 + }, + "timeline_url":"https://api.github.com/repos/example_user/tmp/issues/2/timeline", + "performed_via_github_app":null, + "state_reason":null, + "user_data":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false, + "name":null, + "company":null, + "blog":"", + "location":null, + "email":null, + "hireable":null, + "bio":null, + "twitter_username":null, + "public_repos":14, + "public_gists":0, + "followers":0, + "following":0, + "created_at":"2019-06-03T09:54:17Z", + "updated_at":"2026-01-19T10:45:12Z", + "organizations":[ ] + }, + "assignee_data":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false, + "name":null, + "company":null, + "blog":"", + "location":null, + "email":null, + "hireable":null, + "bio":null, + "twitter_username":null, + "public_repos":14, + "public_gists":0, + "followers":0, + "following":0, + "created_at":"2019-06-03T09:54:17Z", + "updated_at":"2026-01-19T10:45:12Z", + "organizations":[ ] + }, + "assignees_data":[ + { + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false, + "name":null, + "company":null, + "blog":"", + "location":null, + "email":null, + "hireable":null, + "bio":null, + "twitter_username":null, + "public_repos":14, + "public_gists":0, + "followers":0, + "following":0, + "created_at":"2019-06-03T09:54:17Z", + "updated_at":"2026-01-19T10:45:12Z", + "organizations":[ ] + } + ], + "comments_data":[ ], + "reactions_data":[ + { + "id":257194677, + "node_id":"REA_lAHOLc5Lw87kO7Gfzg9UerU", + "user":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false + }, + "content":"+1", + "created_at":"2026-01-19T10:47:31Z", + "user_data":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false, + "name":null, + "company":null, + "blog":"", + "location":null, + "email":null, + "hireable":null, + "bio":null, + "twitter_username":null, + "public_repos":14, + "public_gists":0, + "followers":0, + "following":0, + "created_at":"2019-06-03T09:54:17Z", + "updated_at":"2026-01-19T10:45:12Z", + "organizations":[ ] + } + } + ] + } + }, + { + "backend_name":"GitHub", + "backend_version":"1.0.0", + "perceval_version":"1.4.0", + "timestamp":1.768825309427565E9, + "origin":"https://github.com/example_user/tmp", + "uuid":"6d29718200ba6e09771b467d19ac2d2e25373b65", + "updated_on":1.76882523E9, + "classified_fields_filtered":null, + "category":"issue", + "search_fields":{ + "item_id":"3829469819", + "owner":"example_user", + "repo":"tmp" + }, + "tag":"https://github.com/example_user/tmp", + "data":{ + "url":"https://api.github.com/repos/example_user/tmp/issues/3", + "repository_url":"https://api.github.com/repos/example_user/tmp", + "labels_url":"https://api.github.com/repos/example_user/tmp/issues/3/labels{/name}", + "comments_url":"https://api.github.com/repos/example_user/tmp/issues/3/comments", + "events_url":"https://api.github.com/repos/example_user/tmp/issues/3/events", + "html_url":"https://github.com/example_user/tmp/issues/3", + "id":3829469819, + "node_id":"I_kwDOLc5Lw87kQRJ7", + "number":3, + "title":"Issue 2", + "user":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false + }, + "labels":[ ], + "state":"closed", + "locked":false, + "assignee":null, + "assignees":[ ], + "milestone":null, + "comments":1, + "created_at":"2026-01-19T12:20:03Z", + "updated_at":"2026-01-19T12:20:30Z", + "closed_at":"2026-01-19T12:20:30Z", + "author_association":"OWNER", + "active_lock_reason":null, + "sub_issues_summary":{ + "total":0, + "completed":0, + "percent_completed":0 + }, + "issue_dependencies_summary":{ + "blocked_by":0, + "total_blocked_by":0, + "blocking":0, + "total_blocking":0 + }, + "body":"This is a test issue\n", + "closed_by":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false + }, + "reactions":{ + "url":"https://api.github.com/repos/example_user/tmp/issues/3/reactions", + "total_count":0, + "+1":0, + "-1":0, + "laugh":0, + "hooray":0, + "confused":0, + "heart":0, + "rocket":0, + "eyes":0 + }, + "timeline_url":"https://api.github.com/repos/example_user/tmp/issues/3/timeline", + "performed_via_github_app":null, + "state_reason":"completed", + "user_data":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false, + "name":null, + "company":null, + "blog":"", + "location":null, + "email":null, + "hireable":null, + "bio":null, + "twitter_username":null, + "public_repos":14, + "public_gists":0, + "followers":0, + "following":0, + "created_at":"2019-06-03T09:54:17Z", + "updated_at":"2026-01-19T10:45:12Z", + "organizations":[ ] + }, + "assignee_data":{ }, + "assignees_data":[ ], + "comments_data":[ + { + "url":"https://api.github.com/repos/example_user/tmp/issues/comments/3768062548", + "html_url":"https://github.com/example_user/tmp/issues/3#issuecomment-3768062548", + "issue_url":"https://api.github.com/repos/example_user/tmp/issues/3", + "id":3768062548, + "node_id":"IC_kwDOLc5Lw87gmBJU", + "user":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false + }, + "created_at":"2026-01-19T12:20:19Z", + "updated_at":"2026-01-19T12:20:19Z", + "body":"This is a comment in the issue #3", + "author_association":"OWNER", + "reactions":{ + "url":"https://api.github.com/repos/example_user/tmp/issues/comments/3768062548/reactions", + "total_count":0, + "+1":0, + "-1":0, + "laugh":0, + "hooray":0, + "confused":0, + "heart":0, + "rocket":0, + "eyes":0 + }, + "performed_via_github_app":null, + "user_data":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false, + "name":null, + "company":null, + "blog":"", + "location":null, + "email":null, + "hireable":null, + "bio":null, + "twitter_username":null, + "public_repos":14, + "public_gists":0, + "followers":0, + "following":0, + "created_at":"2019-06-03T09:54:17Z", + "updated_at":"2026-01-19T10:45:12Z", + "organizations":[ ] + }, + "reactions_data":[ ] + } + ], + "reactions_data":[ ] + } + }, + { + "backend_name":"GitHub", + "backend_version":"1.0.0", + "perceval_version":"1.4.0", + "timestamp":1.768825309428564E9, + "origin":"https://github.com/example_user/tmp", + "uuid":"33d506af9577a889786079a2802e275bc8c7a438", + "updated_on":1.768825286E9, + "classified_fields_filtered":null, + "category":"issue", + "search_fields":{ + "item_id":"3829475615", + "owner":"example_user", + "repo":"tmp" + }, + "tag":"https://github.com/example_user/tmp", + "data":{ + "url":"https://api.github.com/repos/example_user/tmp/issues/4", + "repository_url":"https://api.github.com/repos/example_user/tmp", + "labels_url":"https://api.github.com/repos/example_user/tmp/issues/4/labels{/name}", + "comments_url":"https://api.github.com/repos/example_user/tmp/issues/4/comments", + "events_url":"https://api.github.com/repos/example_user/tmp/issues/4/events", + "html_url":"https://github.com/example_user/tmp/pull/4", + "id":3829475615, + "node_id":"PR_kwDOLc5Lw869_tIm", + "number":4, + "title":"Update 1710157816", + "user":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false + }, + "labels":[ ], + "state":"open", + "locked":false, + "assignee":null, + "assignees":[ ], + "milestone":null, + "comments":0, + "created_at":"2026-01-19T12:21:26Z", + "updated_at":"2026-01-19T12:21:26Z", + "closed_at":null, + "author_association":"OWNER", + "active_lock_reason":null, + "draft":false, + "pull_request":{ + "url":"https://api.github.com/repos/example_user/tmp/pulls/4", + "html_url":"https://github.com/example_user/tmp/pull/4", + "diff_url":"https://github.com/example_user/tmp/pull/4.diff", + "patch_url":"https://github.com/example_user/tmp/pull/4.patch", + "merged_at":null + }, + "body":"Example description", + "closed_by":null, + "reactions":{ + "url":"https://api.github.com/repos/example_user/tmp/issues/4/reactions", + "total_count":0, + "+1":0, + "-1":0, + "laugh":0, + "hooray":0, + "confused":0, + "heart":0, + "rocket":0, + "eyes":0 + }, + "timeline_url":"https://api.github.com/repos/example_user/tmp/issues/4/timeline", + "performed_via_github_app":null, + "state_reason":null, + "user_data":{ + "login":"example_user", + "id":51320071, + "node_id":"MDQ6VXNlcjUxMzIwMDcx", + "avatar_url":"https://avatars.githubusercontent.com/u/51320071?v=4", + "gravatar_id":"", + "url":"https://api.github.com/users/example_user", + "html_url":"https://github.com/example_user", + "followers_url":"https://api.github.com/users/example_user/followers", + "following_url":"https://api.github.com/users/example_user/following{/other_user}", + "gists_url":"https://api.github.com/users/example_user/gists{/gist_id}", + "starred_url":"https://api.github.com/users/example_user/starred{/owner}{/repo}", + "subscriptions_url":"https://api.github.com/users/example_user/subscriptions", + "organizations_url":"https://api.github.com/users/example_user/orgs", + "repos_url":"https://api.github.com/users/example_user/repos", + "events_url":"https://api.github.com/users/example_user/events{/privacy}", + "received_events_url":"https://api.github.com/users/example_user/received_events", + "type":"User", + "user_view_type":"public", + "site_admin":false, + "name":null, + "company":null, + "blog":"", + "location":null, + "email":null, + "hireable":null, + "bio":null, + "twitter_username":null, + "public_repos":14, + "public_gists":0, + "followers":0, + "following":0, + "created_at":"2019-06-03T09:54:17Z", + "updated_at":"2026-01-19T10:45:12Z", + "organizations":[ ] + }, + "assignee_data":{ }, + "assignees_data":[ ], + "comments_data":[ ], + "reactions_data":[ ] + } + } +] \ No newline at end of file diff --git a/tests/unit/scheduler/test_task_eventizer.py b/tests/unit/scheduler/test_task_eventizer.py index 4d5ed13..e7f39a3 100644 --- a/tests/unit/scheduler/test_task_eventizer.py +++ b/tests/unit/scheduler/test_task_eventizer.py @@ -22,6 +22,7 @@ import pickle import shutil import tempfile +from unittest.mock import patch import rq import perceval.backend @@ -44,7 +45,7 @@ def tearDown(self): shutil.rmtree(self.tmp_path) super().tearDown() - def test_job(self): + def test_git_job(self): """Test if events are generated using the Git backend""" job_args = { @@ -205,6 +206,86 @@ def test_job(self): self.assertEqual(event["type"], expected[i][1]) self.assertEqual(event["source"], "http://example.com/") + @patch("grimoirelab.core.scheduler.tasks.chronicler.perceval.backend.BackendItemsGenerator") + def test_github_job(self, mock_backend_items_generator): + """Test if events are generated using the GitHub backend""" + + with open(os.path.join(self.dir, "data/github_issues.json"), "r") as f: + github_issues_data = json.load(f) + + # Return value under .items + mock_backend_items_generator.return_value.items = github_issues_data + + job_args = { + "datasource_type": "github", + "datasource_category": "issue", + "events_stream": "events", + "stream_max_length": 500, + "job_args": { + "owner": "example_user", + "repository": "tmp", + "from_date": "2020-01-01T00:00:00Z", + }, + } + + q = rq.Queue("test-queue", job_class=GrimoireLabJob, connection=self.conn, is_async=False) + job = q.enqueue( + f=chronicler_job, + result_ttl=100, + job_timeout=120, + job_id="chonicler-github", + **job_args, + ) + + # Use job._result instead of job.return_value() because + # the mocked backend fail to produce a return value + result = job._result + + # Check job result + self.assertEqual(result.job_id, job.get_id()) + self.assertEqual(result.backend, "github") + self.assertEqual(result.category, "issue") + + expected = [ + ("a548ead04e53ace59cbfc271849b23d00dc9d251", "org.grimoirelab.events.github.issue"), + ("c4ca608a321600f4353fcf6265838d30ac23e67c", "org.grimoirelab.events.github.comment"), + ( + "f5e97ba626a64961846512f4024c42cd802179e3", + "org.grimoirelab.events.github.comment.author", + ), + ("f2f4bc38d02975f2fc0553ec4def64b7be49bfbb", "org.grimoirelab.events.github.author"), + ("7c2a2b2bfe9625cd69654942612c8b1e47ab55e7", "org.grimoirelab.events.github.assignee"), + ("7c2a2b2bfe9625cd69654942612c8b1e47ab55e7", "org.grimoirelab.events.github.assignee"), + ( + "9654465e0137fa44acbec0ea546a83a759abf462", + "org.grimoirelab.events.github.pull_request", + ), + ("4fd4b38aecd9c37177245534d07ec82bb37c69ee", "org.grimoirelab.events.github.author"), + ("c310eb027d3a267a59bf729e475705b1f30f66cf", "org.grimoirelab.events.github.assignee"), + ("c310eb027d3a267a59bf729e475705b1f30f66cf", "org.grimoirelab.events.github.assignee"), + ("6d29718200ba6e09771b467d19ac2d2e25373b65", "org.grimoirelab.events.github.issue"), + ("c08e08c28d9acb6616596ab6c3ad893120fd6323", "org.grimoirelab.events.github.comment"), + ( + "6ed3e671b28317fa98bb593c71de3f73f6e603c3", + "org.grimoirelab.events.github.comment.author", + ), + ("45d0474e3f0aca9019f5a5a4fc7e961f9004fc41", "org.grimoirelab.events.github.author"), + ( + "33d506af9577a889786079a2802e275bc8c7a438", + "org.grimoirelab.events.github.pull_request", + ), + ("730c9d767fc81749ad9c31e69f65632f6833c343", "org.grimoirelab.events.github.author"), + ] + + # Check generated events + events = self.conn.xread({"events": b"0-0"}, count=None, block=0) + events = [json.loads(e[1][b"data"]) for e in events[0][1]] + self.assertEqual(len(events), 16) + for i, event in enumerate(events): + self.assertEqual(event["source"], "https://github.com/example_user/tmp") + self.assertEqual(event["id"], expected[i][0]) + self.assertEqual(event["type"], expected[i][1]) + def test_job_no_result(self): """Execute a job that will not produce any results""" diff --git a/ui/src/components/FormDialog.vue b/ui/src/components/FormDialog.vue index 170479c..7eb4ad6 100644 --- a/ui/src/components/FormDialog.vue +++ b/ui/src/components/FormDialog.vue @@ -19,7 +19,7 @@