# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Allow tests to assert recipe success or failure.

TODO(crbug/1010715) Remove this and use functionality in core recipe engine.
"""

from recipe_engine import recipe_test_api
from recipe_engine import post_process


class StatusCheckTestApi(recipe_test_api.RecipeTestApi):

  def test(self, name, status='success'):
    return super(StatusCheckTestApi, self).test(name) + self.status(status)

  def status(self, status='success'):
    """Returns step data to check status of recipe at end of test.

    Args:
      status: One of 'success' (default), 'failure', or 'infra_failure'. The
          result of the test case will be required to match this.
    """

    assertion_type = {
        'infra_failure': post_process.StatusException,
        'failure': post_process.StatusFailure,
        'success': post_process.StatusSuccess,
    }[status]
    return self.post_process(assertion_type)
