1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
  153
  154
  155
  156
  157
  158
  159
  160
  161
  162
  163
  164
  165
  166
  167
  168
  169
  170
  171
  172
  173
  174
  175
  176
  177
  178
  179
  180

ash / api / tasks / fake_tasks_client.h [blame]

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

#ifndef ASH_API_TASKS_FAKE_TASKS_CLIENT_H_
#define ASH_API_TASKS_FAKE_TASKS_CLIENT_H_

#include <list>
#include <string>
#include <vector>

#include "ash/api/tasks/tasks_client.h"
#include "ash/ash_export.h"
#include "base/containers/flat_map.h"
#include "base/functional/callback_forward.h"
#include "google_apis/common/api_error_codes.h"
#include "ui/base/models/list_model.h"

namespace ash::api {

struct Task;
struct TaskList;

class ASH_EXPORT FakeTasksClient : public TasksClient {
 public:
  FakeTasksClient();
  FakeTasksClient(const FakeTasksClient&) = delete;
  FakeTasksClient& operator=(const FakeTasksClient&) = delete;
  ~FakeTasksClient() override;

  std::vector<std::string> pending_completed_tasks() const {
    return pending_completed_tasks_;
  }

  int completed_task_count() { return completed_tasks_; }

  // TasksClient:
  bool IsDisabledByAdmin() const override;
  const ui::ListModel<api::TaskList>* GetCachedTaskLists() override;
  void GetTaskLists(bool force_fetch, GetTaskListsCallback callback) override;
  const ui::ListModel<api::Task>* GetCachedTasksInTaskList(
      const std::string& task_list_id) override;
  void GetTasks(const std::string& task_list_id,
                bool force_fetch,
                GetTasksCallback callback) override;
  void MarkAsCompleted(const std::string& task_list_id,
                       const std::string& task_id,
                       bool checked) override;
  void AddTask(const std::string& task_list_id,
               const std::string& title,
               TasksClient::OnTaskSavedCallback callback) override;
  void UpdateTask(const std::string& task_list_id,
                  const std::string& task_id,
                  const std::string& title,
                  bool completed,
                  TasksClient::OnTaskSavedCallback callback) override;
  void InvalidateCache() override {}
  std::optional<base::Time> GetTasksLastUpdateTime(
      const std::string& task_list_id) const override;
  void OnGlanceablesBubbleClosed(base::OnceClosure callback) override;

  // Helper function for loading in pre-built `TaskList` objects.
  void AddTaskList(std::unique_ptr<TaskList> task_list_data);

  // Helper function for loading in pre-built `Task` objects.
  void AddTask(const std::string& task_list_id,
               std::unique_ptr<Task> task_data);

  // Deletes the task list with `task_list_id` from `task_lists_`.
  void DeleteTaskList(const std::string& task_list_id);

  void SetTasksLastUpdateTime(base::Time time);

  // Returns `bubble_closed_count_`, while also resetting the counter.
  int GetAndResetBubbleClosedCount();

  // Runs `pending_get_tasks_callbacks_` and returns their number.
  size_t RunPendingGetTasksCallbacks();

  // Runs `pending_get_task_lists_callbacks_` and returns their number.
  size_t RunPendingGetTaskListsCallbacks();

  // Runs `pending_add_task_callbacks_` and returns their number.
  size_t RunPendingAddTaskCallbacks();

  // Runs `pending_update_task_callbacks_` and returns their number.
  size_t RunPendingUpdateTaskCallbacks();

  void set_is_disabled_by_admin(bool is_disabled_by_admin) {
    is_disabled_by_admin_ = is_disabled_by_admin;
  }
  void set_paused(bool paused) { paused_ = paused; }
  void set_paused_on_fetch(bool paused) { paused_on_fetch_ = paused; }
  void set_get_task_lists_error(bool error) { get_task_lists_error_ = error; }
  void set_get_tasks_error(bool error) { get_tasks_error_ = error; }
  void set_http_error(std::optional<google_apis::ApiErrorCode> http_error) {
    http_error_ = http_error;
  }

  ui::ListModel<TaskList>* task_lists() { return task_lists_.get(); }

 private:
  void AddTaskImpl(const std::string& task_list_id,
                   const std::string& title,
                   TasksClient::OnTaskSavedCallback callback);
  void UpdateTaskImpl(const std::string& task_list_id,
                      const std::string& task_id,
                      const std::string& title,
                      bool completed,
                      TasksClient::OnTaskSavedCallback callback);

  // Copies `task_lists_` to `cached_task_lists_` to save the task lists
  // state when the glanceables are closed.
  void CacheTaskLists();

  // Copies the current showing tasks to `cached_tasks_` to save the tasks state
  // when the glanceables are closed.
  void CacheTasks();

  // All available task lists.
  std::unique_ptr<ui::ListModel<TaskList>> task_lists_;

  // The cached task lists that is used before `task_lists_` is simulated to be
  // fetched.
  std::unique_ptr<ui::ListModel<TaskList>> cached_task_lists_;

  // The cached tasks that was shown when the glanceables are closed.
  std::unique_ptr<ui::ListModel<Task>> cached_tasks_;

  // The id of the task list that was shown when the glanceables are closed.
  std::string cached_task_list_id_;

  // Tracks completed tasks and the task list they belong to.
  std::vector<std::string> pending_completed_tasks_;

  // All available tasks grouped by task list id.
  base::flat_map<std::string, std::unique_ptr<ui::ListModel<Task>>>
      tasks_in_task_lists_;

  // Number of times `OnGlanceablesBubbleClosed()` has been called.
  int bubble_closed_count_ = 0;
  int completed_tasks_ = 0;

  // If `true`, GetTaskListsCallback run with failure after data fetching in
  // `GetTaskLists()` is done. This should be set before `GetTaskLists()` is
  // called.
  bool get_task_lists_error_ = false;
  // If `true`, GetTasksCallback run with failure after data fetching in
  // `GetTasks()` is done. This should be set before `GetTasks()` is called.
  bool get_tasks_error_ = false;

  // A http error is required to be set if we simulate send a request to the
  // API. For `GetTaskLists()` and `GetTasks()`, this is optional. For
  // `AddTaskImpl()` or `UpdateTaskImpl()`, this is required.
  std::optional<google_apis::ApiErrorCode> http_error_ = std::nullopt;

  // The last time when the tasks were updated. This is manually set by
  // `SetTasksLastUpdateTime`.
  base::Time last_updated_time_;

  bool is_disabled_by_admin_ = false;

  // If `false` - callbacks are executed immediately; if `true` - callbacks get
  // saved to the corresponding list and executed once
  // `RunPending**Callbacks()` is called.
  bool paused_ = false;

  // Similar to `paused_`, but only moves callbacks to pending callbacks when
  // data fetching is simulated, that is, callbacks are run immediately if the
  // cached data is used.
  bool paused_on_fetch_ = false;
  std::list<base::OnceClosure> pending_get_tasks_callbacks_;
  std::list<base::OnceClosure> pending_get_task_lists_callbacks_;
  std::list<base::OnceClosure> pending_add_task_callbacks_;
  std::list<base::OnceClosure> pending_update_task_callbacks_;
};

}  // namespace ash::api

#endif  // ASH_API_TASKS_FAKE_TASKS_CLIENT_H_