// Copyright (C) 2018 The Android Open Source Project
//
// 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
//
// http://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.

package com.googlesource.gerrit.plugins.webhooks.rest;

import static com.google.common.truth.Truth.assertThat;
import static com.google.gerrit.reviewdb.client.RefNames.REFS_CONFIG;
import static com.googlesource.gerrit.plugins.webhooks.Configuration.DEFAULT_MAX_TRIES;
import static com.googlesource.gerrit.plugins.webhooks.Configuration.DEFAULT_RETRY_INTERVAL;
import static com.googlesource.gerrit.plugins.webhooks.Configuration.DEFAULT_SSL_VERIFY;
import static com.googlesource.gerrit.plugins.webhooks.Configuration.DEFAULT_TIMEOUT_MS;
import static javax.servlet.http.HttpServletResponse.SC_OK;

import com.google.common.collect.ImmutableList;
import com.google.gerrit.acceptance.LightweightPluginDaemonTest;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.acceptance.RestResponse;
import com.google.gerrit.acceptance.TestPlugin;
import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jgit.transport.RefSpec;
import org.junit.Test;

@TestPlugin(name = "webhooks", sysModule = "com.googlesource.gerrit.plugins.webhooks.Module")
public class GetRemoteIT extends LightweightPluginDaemonTest {

  @Test
  public void noWebhooks() throws IOException {
    RestResponse response =
        adminRestSession.get(
            String.format("/config/server/webhooks~projects/%s/remotes/", project.get()));
    assertThat(response.getStatusCode()).isEqualTo(200);
    assertThat(asMap(response.getEntityContent()).size()).isEqualTo(0);
  }

  @Test
  public void testGet() throws Exception {
    git().fetch().setRefSpecs(new RefSpec(REFS_CONFIG + ":" + REFS_CONFIG)).call();
    testRepo.reset(REFS_CONFIG);

    RemoteInfo expected;
    String getFoo = String.format("/config/server/webhooks~projects/%s/remotes/foo", project.get());

    String webhooksConfig = "[remote \"foo\"]\n  url = https://foo.org/\n";
    expected = newRemoteInfo("https://foo.org/");
    pushAndVerify(getFoo, webhooksConfig, expected);

    webhooksConfig = webhooksConfig + "  event = \"ref-updated\"\n";
    expected.events = ImmutableList.of("ref-updated");
    pushAndVerify(getFoo, webhooksConfig, expected);

    webhooksConfig = webhooksConfig + "  event = \"patchset-created\"\n";
    expected.events = ImmutableList.of("ref-updated", "patchset-created");
    pushAndVerify(getFoo, webhooksConfig, expected);

    webhooksConfig = webhooksConfig + "  connectionTimeout = 123\n";
    expected.connectionTimeout = 123;
    pushAndVerify(getFoo, webhooksConfig, expected);

    webhooksConfig = webhooksConfig + "  socketTimeout = 234\n";
    expected.socketTimeout = 234;
    pushAndVerify(getFoo, webhooksConfig, expected);

    webhooksConfig = webhooksConfig + "  maxTries = 345\n";
    expected.maxTries = 345;
    pushAndVerify(getFoo, webhooksConfig, expected);

    webhooksConfig = webhooksConfig + "  retryInterval = 456\n";
    expected.retryInterval = 456;
    pushAndVerify(getFoo, webhooksConfig, expected);

    webhooksConfig = webhooksConfig + "  sslVerify = " + !DEFAULT_SSL_VERIFY;
    expected.sslVerify = !DEFAULT_SSL_VERIFY;
    pushAndVerify(getFoo, webhooksConfig, expected);
  }

  private void pushAndVerify(String endpoint, String webhooksConfig, RemoteInfo expected)
      throws Exception {
    push(webhooksConfig);
    RestResponse res = adminRestSession.get(endpoint);
    assertThat(res.getStatusCode()).isEqualTo(200);
    assertThat(expected).isEqualTo(asRemoteInfo(res.getEntityContent()));
  }

  @Test
  public void testList() throws Exception {
    git().fetch().setRefSpecs(new RefSpec(REFS_CONFIG + ":" + REFS_CONFIG)).call();
    testRepo.reset(REFS_CONFIG);

    Map<String, RemoteInfo> expected = new HashMap<>();
    String listAll = String.format("/config/server/webhooks~projects/%s/remotes/", project.get());

    String webhooksConfig = "[remote \"foo\"]\n  url = https://foo.org/\n";
    expected.put("foo", newRemoteInfo("https://foo.org/"));
    pushAndVerifyList(listAll, webhooksConfig, expected);

    webhooksConfig =
        webhooksConfig + "[remote \"bar\"]\n  url = https://bar.org/\n  event = \"ref-updated\"\n";
    RemoteInfo barInfo = newRemoteInfo("https://bar.org/");
    barInfo.events = ImmutableList.of("ref-updated");
    expected.put("bar", barInfo);
    pushAndVerifyList(listAll, webhooksConfig, expected);

    webhooksConfig =
        webhooksConfig
            + "[remote \"qux\"]\n  url = https://qux.org/\n  event = \"patchset-created\"\n";
    RemoteInfo quxInfo = newRemoteInfo("https://qux.org/");
    quxInfo.events = ImmutableList.of("patchset-created");
    expected.put("qux", quxInfo);
    pushAndVerifyList(listAll, webhooksConfig, expected);
  }

  private void pushAndVerifyList(
      String endpoint, String webhooksConfig, Map<String, RemoteInfo> expected) throws Exception {
    push(webhooksConfig);
    RestResponse res = adminRestSession.get(endpoint);
    assertThat(res.getStatusCode()).isEqualTo(SC_OK);
    assertThat(expected).isEqualTo(asMap(res.getEntityContent()));
  }

  private void push(String content) throws Exception {
    PushOneCommit push =
        pushFactory.create(
            admin.newIdent(), testRepo, "Create webhooks", "webhooks.config", content);
    push.to(REFS_CONFIG);
  }

  static Map<String, RemoteInfo> asMap(String json) {
    return newGson().fromJson(json, new TypeToken<Map<String, RemoteInfo>>() {}.getType());
  }

  static RemoteInfo asRemoteInfo(String json) {
    return newGson().fromJson(json, new TypeToken<RemoteInfo>() {}.getType());
  }

  private RemoteInfo newRemoteInfo(String url) {
    RemoteInfo info = new RemoteInfo();
    info.url = url;
    info.events = ImmutableList.of();
    info.connectionTimeout = DEFAULT_TIMEOUT_MS;
    info.socketTimeout = DEFAULT_TIMEOUT_MS;
    info.maxTries = DEFAULT_MAX_TRIES;
    info.retryInterval = DEFAULT_RETRY_INTERVAL;
    info.sslVerify = DEFAULT_SSL_VERIFY;
    return info;
  }
}
