// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_API_UNITTEST_H_
#define CHROME_BROWSER_EXTENSIONS_EXTENSION_API_UNITTEST_H_

#include <memory>
#include <optional>
#include <string>
#include <utility>

#include "base/memory/scoped_refptr.h"
#include "base/values.h"
#include "chrome/test/base/browser_with_test_window_test.h"

class ExtensionFunction;

namespace extensions {

// Use this class to enable calling API functions in a unittest.
// By default, this class will create and load an empty unpacked `extension_`,
// which will be used in all API function calls. This extension can be
// overridden using set_extension().
// By default, this class does not create a WebContents for the API functions.
// When calling RunFunction[AndReturn*], `args` should be in JSON format,
// wrapped in a list. See also RunFunction* in api_test_utils.h.
// TODO(yoz): Move users of this base class to use the equivalent base class
// in extensions/browser/api_unittest.h.
class ExtensionApiUnittest : public BrowserWithTestWindowTest {
 public:
  template <typename... TaskEnvironmentTraits>
  explicit ExtensionApiUnittest(TaskEnvironmentTraits&&... traits)
      : BrowserWithTestWindowTest(
            std::forward<TaskEnvironmentTraits>(traits)...) {}
  ~ExtensionApiUnittest() override;

  const Extension* extension() const { return extension_.get(); }
  scoped_refptr<const Extension> extension_ref() { return extension_; }
  void set_extension(scoped_refptr<const Extension> extension) {
    extension_ = extension;
  }

 protected:
  // SetUp creates and loads an empty, unpacked Extension.
  void SetUp() override;

  // Various ways of running an API function. These methods take ownership of
  // `function`. `args` should be in JSON format, wrapped in a list.
  // See also the RunFunction* methods in api_test_utils.h.

  // Return the function result as a base::Value, if successful, or nullopt on
  // failure.
  std::optional<base::Value> RunFunctionAndReturnValue(
      scoped_refptr<ExtensionFunction> function,
      const std::string& args);

  // Return the function result as a base::Value::Dict, if successful, or
  // nullopt on failure. This will EXPECT-fail if the result is not a
  // base::Value::Dict.
  std::optional<base::Value::Dict> RunFunctionAndReturnDictionary(
      scoped_refptr<ExtensionFunction> function,
      const std::string& args);

  // Return the function result as a base::Value::List, if successful, or
  // nullopt on failure. This will EXPECT-fail if the result is not a list.
  std::optional<base::Value::List> RunFunctionAndReturnList(
      scoped_refptr<ExtensionFunction> function,
      const std::string& args);

  // Return an error thrown from the function, if one exists.
  // This will EXPECT-fail if any result is returned from the function.
  std::string RunFunctionAndReturnError(
      scoped_refptr<ExtensionFunction> function,
      const std::string& args);

  // Run the function and ignore any result.
  void RunFunction(scoped_refptr<ExtensionFunction> function,
                   const std::string& args);

 private:
  // The Extension used when running API function calls.
  scoped_refptr<const Extension> extension_;
};

}  // namespace extensions

#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_API_UNITTEST_H_
