# 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 disk_usage recipe module."""

from __future__ import annotations

from recipe_engine import recipe_test_api


class DiskUsageTestApi(recipe_test_api.RecipeTestApi):
    """Test API for disk_usage recipe module."""

    @staticmethod
    def usage_dict(
        total: int = 100 * 1024**3,
        used: int = 40 * 1024**3,
        free: int = 60 * 1024**3,
    ) -> dict[str, int]:
        """Return mock disk usage dictionary."""
        return {'total': total, 'used': used, 'free': free}

    def __call__(
        self,
        total: int = 100 * 1024**3,
        used: int = 40 * 1024**3,
        free: int = 60 * 1024**3,
        step_name: str = 'disk usage',
    ) -> recipe_test_api.TestData:
        """Helper to set mock disk usage data."""
        return self.step_data(
            step_name,
            self.m.json.output(
                self.usage_dict(total=total, used=used, free=free)
            ),
        )
