// Copyright (C) 2019 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.google.gerrit.plugins.checks.acceptance.api;

import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth8.assertThat;
import static com.google.gerrit.testing.GerritJUnit.assertThrows;

import com.google.gerrit.acceptance.RestResponse;
import com.google.gerrit.acceptance.UseClockStep;
import com.google.gerrit.acceptance.testsuite.request.RequestScopeOperations;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.plugins.checks.Check;
import com.google.gerrit.plugins.checks.CheckKey;
import com.google.gerrit.plugins.checks.CheckerUuid;
import com.google.gerrit.plugins.checks.acceptance.AbstractCheckersTest;
import com.google.gerrit.plugins.checks.acceptance.testsuite.CheckOperations.PerCheckOperations;
import com.google.gerrit.plugins.checks.acceptance.testsuite.CheckTestData;
import com.google.gerrit.plugins.checks.acceptance.testsuite.CheckerTestData;
import com.google.gerrit.plugins.checks.api.CheckInfo;
import com.google.gerrit.plugins.checks.api.CheckInput;
import com.google.gerrit.plugins.checks.api.CheckState;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.util.time.TimeUtil;
import com.google.gerrit.testing.TestTimeUtil;
import com.google.inject.Inject;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.Map;
import org.eclipse.jgit.lib.ObjectId;
import org.junit.Before;
import org.junit.Test;

@UseClockStep(startAtEpoch = true)
public class CreateCheckIT extends AbstractCheckersTest {
  @Inject private RequestScopeOperations requestScopeOperations;

  private PatchSet.Id patchSetId;
  private ObjectId commitId;

  @Before
  public void setUp() throws Exception {
    patchSetId = createChange().getPatchSetId();
    commitId =
        ObjectId.fromString(
            gApi.changes().id(patchSetId.changeId().get()).current().commit(false).commit);
  }

  @Test
  public void createCheck() throws Exception {
    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.state = CheckState.RUNNING;

    Timestamp expectedCreationTimestamp = TestTimeUtil.getCurrentTimestamp();
    CheckInfo info = checksApiFactory.revision(patchSetId).create(input).get();
    assertThat(info.checkerUuid).isEqualTo(checkerUuid.get());
    assertThat(info.state).isEqualTo(CheckState.RUNNING);
    assertThat(info.message).isNull();
    assertThat(info.url).isNull();
    assertThat(info.started).isNull();
    assertThat(info.finished).isNull();
    assertThat(info.created).isEqualTo(expectedCreationTimestamp);
    assertThat(info.updated).isEqualTo(info.created);

    CheckKey key = CheckKey.create(project, patchSetId, checkerUuid);
    PerCheckOperations perCheckOps = checkOperations.check(key);

    // TODO(gerrit-team) Add a Truth subject for the notes map
    Map<ObjectId, String> notes = perCheckOps.notesAsText();
    assertThat(notes)
        .containsExactly(
            commitId,
            noteDbContent(checkerUuid.get(), expectedCreationTimestamp, expectedCreationTimestamp));
  }

  @Test
  public void cannotCreateCheckWithoutCheckerUuid() throws Exception {
    BadRequestException thrown =
        assertThrows(
            BadRequestException.class,
            () -> checksApiFactory.revision(patchSetId).create(new CheckInput()));
    assertThat(thrown).hasMessageThat().contains("checker UUID is required");
  }

  @Test
  public void createCheckWithStateNotStarted() throws Exception {
    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.state = CheckState.NOT_STARTED;

    CheckInfo info = checksApiFactory.revision(patchSetId).create(input).get();
    assertThat(info.state).isEqualTo(input.state);
    assertThat(getCheck(project, patchSetId, checkerUuid).state()).isEqualTo(input.state);
  }

  @Test
  public void createCheckWithoutState() throws Exception {
    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();

    CheckInfo info = checksApiFactory.revision(patchSetId).create(input).get();
    assertThat(info.state).isEqualTo(CheckState.NOT_STARTED);
    assertThat(getCheck(project, patchSetId, checkerUuid).state())
        .isEqualTo(CheckState.NOT_STARTED);
  }

  @Test
  public void createCheckWithMessage() throws Exception {
    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.message = "some message";

    CheckInfo info = checksApiFactory.revision(patchSetId).create(input).get();
    assertThat(info.message).isEqualTo(input.message);
    assertThat(getCheck(project, patchSetId, checkerUuid).message()).hasValue(input.message);
  }

  @Test
  public void createCheckWithUrl() throws Exception {
    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.url = "http://example.com/my-check";

    CheckInfo info = checksApiFactory.revision(patchSetId).create(input).get();
    assertThat(info.url).isEqualTo(input.url);
    assertThat(getCheck(project, patchSetId, checkerUuid).url()).hasValue(input.url);
  }

  @Test
  public void cannotCreateCheckWithInvalidUrl() throws Exception {
    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.url = CheckTestData.INVALID_URL;

    BadRequestException thrown =
        assertThrows(
            BadRequestException.class, () -> checksApiFactory.revision(patchSetId).create(input));
    assertThat(thrown).hasMessageThat().contains("only http/https URLs supported: " + input.url);
  }

  @Test
  public void createCheckWithStarted() throws Exception {
    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.started = TimeUtil.nowTs();

    CheckInfo info = checksApiFactory.revision(patchSetId).create(input).get();
    assertThat(info.started).isEqualTo(input.started);
    assertThat(getCheck(project, patchSetId, checkerUuid).started()).hasValue(input.started);
  }

  @Test
  public void createCheckWithFinished() throws Exception {
    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.finished = TimeUtil.nowTs();

    CheckInfo info = checksApiFactory.revision(patchSetId).create(input).get();
    assertThat(info.finished).isEqualTo(input.finished);
    assertThat(getCheck(project, patchSetId, checkerUuid).finished()).hasValue(input.finished);
  }

  @Test
  public void cannotCreateCheckForInvalidCheckerUuid() throws Exception {
    CheckInput input = new CheckInput();
    input.checkerUuid = CheckerTestData.INVALID_UUID;
    input.state = CheckState.RUNNING;

    BadRequestException thrown =
        assertThrows(
            BadRequestException.class, () -> checksApiFactory.revision(patchSetId).create(input));
    assertThat(thrown).hasMessageThat().contains("invalid checker UUID: " + input.checkerUuid);
  }

  @Test
  public void cannotCreateCheckForNonExistingChecker() throws Exception {
    CheckInput input = new CheckInput();
    input.checkerUuid = "foo:non-existing";
    input.state = CheckState.RUNNING;

    UnprocessableEntityException thrown =
        assertThrows(
            UnprocessableEntityException.class,
            () -> checksApiFactory.revision(patchSetId).create(input));
    assertThat(thrown).hasMessageThat().contains("checker " + input.checkerUuid + " not found");
  }

  @Test
  public void cannotCreateCheckForInvalidChecker() throws Exception {
    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();
    checkerOperations.checker(checkerUuid).forInvalidation().nonParseableConfig().invalidate();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.state = CheckState.RUNNING;

    RestApiException thrown =
        assertThrows(
            RestApiException.class, () -> checksApiFactory.revision(patchSetId).create(input));
    assertThat(thrown).hasMessageThat().contains("Cannot create check");
  }

  @Test
  public void canCreateCheckForDisabledChecker() throws Exception {
    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).disable().create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.state = CheckState.RUNNING;

    checksApiFactory.revision(patchSetId).create(input);

    CheckKey checkKey = CheckKey.create(project, patchSetId, checkerUuid);
    assertThat(checkOperations.check(checkKey).exists()).isTrue();
  }

  @Test
  public void canCreateCheckForCheckerThatDoesNotApplyToTheProject() throws Exception {
    Project.NameKey otherProject = createProjectOverAPI("other", null, true, null);
    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(otherProject).create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.state = CheckState.RUNNING;

    checksApiFactory.revision(patchSetId).create(input);

    CheckKey checkKey = CheckKey.create(project, patchSetId, checkerUuid);
    assertThat(checkOperations.check(checkKey).exists()).isTrue();
  }

  @Test
  public void canCreateCheckForCheckerThatDoesNotApplyToTheChange() throws Exception {
    CheckerUuid checkerUuid =
        checkerOperations.newChecker().repository(project).query("message:not-matching").create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.state = CheckState.RUNNING;

    checksApiFactory.revision(patchSetId).create(input);

    CheckKey checkKey = CheckKey.create(project, patchSetId, checkerUuid);
    assertThat(checkOperations.check(checkKey).exists()).isTrue();
  }

  @Test
  public void canCreateCheckForCheckerWithUnsupportedOperatorInQuery() throws Exception {
    CheckerUuid checkerUuid =
        checkerOperations
            .newChecker()
            .repository(project)
            .query(CheckerTestData.QUERY_WITH_UNSUPPORTED_OPERATOR)
            .create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.state = CheckState.RUNNING;

    checksApiFactory.revision(patchSetId).create(input);

    CheckKey checkKey = CheckKey.create(project, patchSetId, checkerUuid);
    assertThat(checkOperations.check(checkKey).exists()).isTrue();
  }

  @Test
  public void canCreateCheckForCheckerWithInvalidQuery() throws Exception {
    CheckerUuid checkerUuid =
        checkerOperations
            .newChecker()
            .repository(project)
            .query(CheckerTestData.INVALID_QUERY)
            .create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.state = CheckState.RUNNING;

    checksApiFactory.revision(patchSetId).create(input);

    CheckKey checkKey = CheckKey.create(project, patchSetId, checkerUuid);
    assertThat(checkOperations.check(checkKey).exists()).isTrue();
  }

  @Test
  public void cannotCreateCheckWithoutAdministrateCheckers() throws Exception {
    requestScopeOperations.setApiUser(user.id());

    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.state = CheckState.RUNNING;

    AuthException thrown =
        assertThrows(
            AuthException.class, () -> checksApiFactory.revision(patchSetId).create(input));
    assertThat(thrown).hasMessageThat().contains("not permitted");
  }

  @Test
  public void cannotCreateCheckAnonymously() throws Exception {
    requestScopeOperations.setApiUserAnonymous();

    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.state = CheckState.RUNNING;

    AuthException thrown =
        assertThrows(
            AuthException.class, () -> checksApiFactory.revision(patchSetId).create(input));
    assertThat(thrown).hasMessageThat().contains("Authentication required");
  }

  @Test
  public void createCheckOnChangeEditRejected() throws Exception {
    int changeId = patchSetId.changeId().get();
    gApi.changes().id(changeId).edit().modifyCommitMessage("new message");
    assertThat(gApi.changes().id(changeId).edit().get()).isPresent();
    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.state = CheckState.RUNNING;
    RestResponse response =
        adminRestSession.post("/changes/" + changeId + "/revisions/edit/checks~checks", input);

    response.assertConflict();
    assertThat(response.getEntityContent()).isEqualTo("checks are not supported on a change edit");
  }

  @Test
  public void creationOfCheckChangesETagOfChange() throws Exception {
    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();

    String oldETag = parseChangeResource(patchSetId.changeId().toString()).getETag();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.state = CheckState.RUNNING;
    checksApiFactory.revision(patchSetId).create(input).get();

    String newETag = parseChangeResource(patchSetId.changeId().toString()).getETag();
    assertThat(newETag).isNotEqualTo(oldETag);
  }

  @Test
  public void creationOfCheckChangesETagOfRevisionActions() throws Exception {
    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();

    String oldETag = gApi.changes().id(patchSetId.changeId().toString()).current().etag();

    CheckInput input = new CheckInput();
    input.checkerUuid = checkerUuid.get();
    input.state = CheckState.RUNNING;
    checksApiFactory.revision(patchSetId).create(input).get();

    String newETag = gApi.changes().id(patchSetId.changeId().toString()).current().etag();
    assertThat(newETag).isNotEqualTo(oldETag);
  }

  // TODO(gerrit-team) More tests, especially for multiple checkers and PS and how commits behave

  private Check getCheck(Project.NameKey project, PatchSet.Id patchSetId, CheckerUuid checkerUuid)
      throws Exception {
    return checkOperations.check(CheckKey.create(project, patchSetId, checkerUuid)).get();
  }

  private String noteDbContent(String uuid, Timestamp created, Timestamp updated) {
    return ""
        + "{\n"
        + "  \"checks\": {\n"
        + "    \""
        + uuid
        + "\": {\n"
        + "      \"state\": \"RUNNING\",\n"
        + "      \"created\": \""
        + Instant.ofEpochMilli(created.getTime())
        + "\",\n"
        + "      \"updated\": \""
        + Instant.ofEpochMilli(updated.getTime())
        + "\"\n"
        + "    }\n"
        + "  }\n"
        + "}";
  }
}
