mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-20 22:30:12 +01:00
This script didn't have tests defined. Now, the objects on this tool have tests to verify its functionality, as well as the core method called to do all the processes to provide a sorted list of the marge queue. Signed-off-by: Sergi Blanch Torne <sergi.blanch.torne@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37395>
176 lines
5.3 KiB
Python
176 lines
5.3 KiB
Python
#!/usr/bin/env python3
|
|
# Copyright © 2025 Collabora Ltd.
|
|
# Authors:
|
|
# Sergi Blanch Torne <sergi.blanch.torne@collabora.com>
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
from dataclasses import dataclass
|
|
from datetime import timedelta
|
|
|
|
from unittest import TestCase
|
|
from typing import Iterable
|
|
|
|
from marge_queue import MargeMergeRequest, MargeQueue, get_merge_queue
|
|
|
|
|
|
DATA = {
|
|
37564: {
|
|
# sample of a Merge Request rejected by marge and later reassigned to marge
|
|
"updated_at": "2025-09-25T10:59:27.144Z",
|
|
"title": "etnaviv: Fix util_blitter_save_so_targets(..) call",
|
|
"notes": [
|
|
# Those notes must be listed in reverse order
|
|
# because the list is requested sort="desc"
|
|
{
|
|
"body": "assigned to @marge-bot and unassigned @austriancoder",
|
|
"created_at": "2025-09-25T11:44:01.672Z",
|
|
},
|
|
{
|
|
"body": "added 1 commit",
|
|
"created_at": "2025-09-25T10:43:43.490Z",
|
|
},
|
|
{
|
|
"body": "This branch couldn't be merged:",
|
|
"created_at": "2025-09-25T10:42:27.817Z",
|
|
},
|
|
{
|
|
"body": "assigned to @austriancoder and unassigned @marge-bot",
|
|
"created_at": "2025-09-25T10:42:15.404Z",
|
|
},
|
|
{
|
|
"body": "added 3 commits",
|
|
"created_at": "2025-09-25T10:38:57.332Z",
|
|
},
|
|
{
|
|
"body": "assigned to @marge-bot",
|
|
"created_at": "2025-09-25T10:38:03.993Z",
|
|
},
|
|
],
|
|
},
|
|
37560: {
|
|
# sample of a Merge Request assigned to marge between the two
|
|
# assignments of the previous sample. This is meant to show that
|
|
# this goes first in the queue, and it doesn't confuses the sequence.
|
|
"updated_at": "2025-09-25T11:38:08.420Z",
|
|
"title": "tu: limit query pool types logged into RMV",
|
|
"notes": [
|
|
{
|
|
"body": "assigned to @marge-bot",
|
|
"created_at": "2025-09-25T10:47:40.040Z",
|
|
},
|
|
{
|
|
"body": "added 1 commit",
|
|
"created_at": "2025-09-25T10:46:42.113Z",
|
|
},
|
|
{
|
|
"body": "mentioned in issue #13970",
|
|
"created_at": "2025-09-25T10:45:35.566Z",
|
|
},
|
|
{
|
|
"body": "Rb",
|
|
"created_at": "2025-09-25T08:25:51.527Z",
|
|
},
|
|
],
|
|
},
|
|
}
|
|
|
|
|
|
@dataclass
|
|
class ProjectMergeRequestNote:
|
|
body: str
|
|
created_at: str
|
|
|
|
|
|
@dataclass
|
|
class ProjectMergeRequestNoteManager:
|
|
"""
|
|
Mock the gitlab.v4.objects.ProjectMergeRequestNoteManager
|
|
"""
|
|
iid: int
|
|
|
|
def list(self, *args, **kwargs) -> Iterable:
|
|
for note in DATA[self.iid]["notes"]:
|
|
yield ProjectMergeRequestNote(**note)
|
|
|
|
|
|
@dataclass
|
|
class ProjectMergeRequest:
|
|
"""
|
|
Mock the gitlab.v4.objects.ProjectMergeRequest
|
|
"""
|
|
iid: int
|
|
|
|
@property
|
|
def updated_at(self) -> str:
|
|
return DATA[self.iid]["updated_at"]
|
|
|
|
@property
|
|
def web_url(self) -> str:
|
|
return f"https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/{self.iid}"
|
|
|
|
@property
|
|
def title(self) -> str:
|
|
return DATA[self.iid]["title"]
|
|
|
|
@property
|
|
def notes(self) -> ProjectMergeRequestNoteManager:
|
|
return ProjectMergeRequestNoteManager(self.iid)
|
|
|
|
|
|
@dataclass
|
|
class ProjectMergeRequestManager:
|
|
"""
|
|
Mock the gitlab.v4.objects.ProjectMergeRequestManager
|
|
"""
|
|
def list(self, *args, **kwargs) -> Iterable:
|
|
for mr in DATA.keys():
|
|
yield ProjectMergeRequest(mr)
|
|
|
|
|
|
@dataclass
|
|
class Project:
|
|
"""
|
|
Mock the gitlab.v4.objects.Project
|
|
"""
|
|
@property
|
|
def mergerequests(self) -> ProjectMergeRequestManager:
|
|
return ProjectMergeRequestManager()
|
|
|
|
|
|
class MargeMergeTestCase(TestCase):
|
|
def test_queue(self) -> None:
|
|
queue = MargeQueue()
|
|
for mr_id in DATA.keys():
|
|
gl_mr_mock_obj = ProjectMergeRequest(mr_id)
|
|
marge_mr = MargeMergeRequest(gl_mr_mock_obj)
|
|
|
|
# for each element in the data sample, test the MargeMergeRequest construction
|
|
self.assertEqual(marge_mr.title, gl_mr_mock_obj.title)
|
|
self.assertEqual(marge_mr.web_url, gl_mr_mock_obj.web_url)
|
|
self.assertIsInstance(marge_mr.time_enqueued, timedelta)
|
|
|
|
queue.append(marge_mr)
|
|
|
|
self.assertEqual(queue.n_merge_requests_enqueued, 2)
|
|
|
|
|
|
def test_get_merge_queue(self) -> None:
|
|
project = Project()
|
|
queue = get_merge_queue(project)
|
|
|
|
self.assertEqual(queue.n_merge_requests_enqueued, 2)
|
|
self.assertEqual(len(queue.sorted_queue), 2)
|
|
# They are in reverse order because of the reassignment to marge
|
|
self.assertEqual(queue.sorted_queue[0].id, list(DATA.keys())[1])
|
|
self.assertEqual(queue.sorted_queue[1].id, list(DATA.keys())[0])
|
|
self.assertEqual(len(queue.undetermined), 0)
|
|
|
|
for marge_mr in queue.sorted_queue:
|
|
mr_id = marge_mr.id
|
|
self.assertEqual(marge_mr.title, DATA[mr_id]["title"])
|
|
self.assertEqual(
|
|
marge_mr.web_url,
|
|
f"https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/{mr_id}"
|
|
)
|
|
self.assertIsInstance(marge_mr.time_enqueued, timedelta)
|