// Copyright 2018 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.

#include <lib/fsl/vmo/strings.h>
#include <lib/fxl/files/file.h>
#include <lib/fxl/strings/string_number_conversions.h>
#include <lib/gtest/test_loop_fixture.h>
#include <lib/network_wrapper/fake_network_wrapper.h>
#include <rapidjson/stringbuffer.h>
#include <rapidjson/writer.h>

namespace service_account {

namespace http = ::fuchsia::net::oldhttp;

std::string GetSuccessResponseBodyForTest(std::string token,
                                          size_t expiration) {
  rapidjson::StringBuffer string_buffer;
  rapidjson::Writer<rapidjson::StringBuffer> writer(string_buffer);

  writer.StartObject();

  writer.Key("idToken");
  writer.String(token);

  writer.Key("expiresIn");
  writer.String(fxl::NumberToString(expiration));

  writer.EndObject();

  return std::string(string_buffer.GetString(), string_buffer.GetSize());
}

http::URLResponse GetResponseForTest(http::HttpErrorPtr error, uint32_t status,
                                     std::string body) {
  http::URLResponse response;
  response.error = std::move(error);
  response.status_code = status;
  fsl::SizedVmo buffer;
  if (!fsl::VmoFromString(body, &buffer)) {
    ADD_FAILURE() << "Unable to convert string to Vmo.";
  }
  response.body = http::URLBody::New();
  response.body->set_buffer(std::move(buffer).ToTransport());
  return response;
}

}  // namespace service_account
