blob: 064d767f49f2d7314d008b108c5e773bcb430b20 [file]
# Copyright 2026 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Test API for static_checks module."""
from __future__ import annotations
from collections.abc import Mapping, Sequence
from typing import Any, NotRequired, TypedDict
from recipe_engine import recipe_test_api
class InsertedDeleted(TypedDict):
lines_inserted: NotRequired[int]
lines_deleted: NotRequired[int]
class StaticChecksTestApi(recipe_test_api.RecipeTestApi):
"""Test helpers for static_checks recipe module."""
InsertedDeleted = InsertedDeleted
def change_details(
self,
msg: str,
description: str = '',
files: Sequence[str] | Mapping[str, InsertedDeleted] = (),
owner: str = 'nobody@example.com',
revert_of: int = 0,
votes: dict[str, str | None] | None = None,
work_in_progress: bool | None = None,
num_parents: int = 1,
) -> recipe_test_api.TestData:
labels: dict[str, dict[str, bool]] = {}
if votes:
for k, v in votes.items():
labels[k] = {}
if v is not None: # pragma: no cover
assert v in 'approved recommended disliked rejected'.split()
labels[k][v] = True
if isinstance(files, (list, tuple)):
files = {
x: {'lines_inserted': 20, 'lines_deleted': 20} for x in files
}
details: dict[str, Any] = {
'current_revision': 'HASH',
'revisions': {
'HASH': {
'_number': 1,
'commit': {
'subject': msg.split('\n')[0],
'message': msg,
'parents': [
{'commit': f'PARENT{i}'} for i in range(num_parents)
],
},
'files': files,
'description': description,
}
},
'owner': {'email': owner},
'revert_of': revert_of,
'labels': labels,
'_number': 1234,
}
if work_in_progress:
details['work_in_progress'] = work_in_progress # pragma: no cover
return self.step_data('change details', self.m.json.output(details))