/*
 * Copyright 2017 Cisco Systems, Inc.
 *
 * 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.cisco.gerrit.plugins.slack.client;

import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import com.cisco.gerrit.plugins.slack.config.ProjectConfig;
import com.cisco.gerrit.plugins.slack.message.MessageTemplate;
import com.cisco.gerrit.plugins.slack.util.ResourceHelper;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.PluginConfig;
import com.google.gerrit.server.config.PluginConfigFactory;
import java.io.InputStream;
import java.util.Properties;
import org.junit.Test;

public class WebhookClientIntegrationTest {
  private static final String PROJECT_NAME = "test-project";

  private PluginConfigFactory mockConfigFactory = mock(PluginConfigFactory.class);
  private PluginConfig mockPluginConfig = mock(PluginConfig.class);

  private ProjectConfig getConfig() throws Exception {
    Project.NameKey projectNameKey;
    projectNameKey = Project.NameKey.parse(PROJECT_NAME);

    // Setup mocks
    when(mockConfigFactory.getFromProjectConfigWithInheritance(
            projectNameKey, ProjectConfig.CONFIG_NAME))
        .thenReturn(mockPluginConfig);

    when(mockConfigFactory.getFromGerritConfig(ProjectConfig.CONFIG_NAME))
        .thenReturn(mockPluginConfig);

    // Internal proxy integration test config
    // when(mockPluginConfig.getString("proxy-host", null)).thenReturn("127.0.0.1");
    // when(mockPluginConfig.getInt("proxy-port", 8080)).thenReturn(8080);
    // when(mockPluginConfig.getString("proxy-username", null)).thenReturn("user");
    // when(mockPluginConfig.getString("proxy-password", null)).thenReturn("password");

    return new ProjectConfig(mockConfigFactory, PROJECT_NAME);
  }

  @Test
  public void canPublishMessage() throws Exception {
    WebhookClient client;
    client = new WebhookClient(getConfig());

    Properties properties = new Properties();
    try (InputStream testProperties = ResourceHelper.loadNamedResourceAsStream("test.properties")) {
      properties.load(testProperties);
    }

    MessageTemplate template;
    template = new MessageTemplate();

    template.setChannel("general");
    template.setName("Integration Tester");
    template.setAction("proposed");
    template.setProject("project");
    template.setBranch("master");
    template.setUrl("http://gerrit/1234");
    template.setNumber(1234);
    template.setTitle("Adds a test commit message");

    String webhookUrl;
    webhookUrl = properties.getProperty("webhook-url");

    assertTrue(client.publish(template.render(), webhookUrl));
  }

  @Test
  public void canPublishMessageWithLongMessage() throws Exception {
    WebhookClient client;
    client = new WebhookClient(getConfig());

    Properties properties = new Properties();
    try (InputStream testProperties = ResourceHelper.loadNamedResourceAsStream("test.properties")) {
      properties.load(testProperties);
    }

    MessageTemplate template;
    template = new MessageTemplate();

    template.setChannel("general");
    template.setName("Integration Tester");
    template.setAction("commented on");
    template.setProject("project");
    template.setBranch("master");
    template.setUrl("http://gerrit/1234");
    template.setNumber(1234);
    template.setTitle("Adds a test commit message");
    template.setMessage(
        "It provides a bunch of really great things. "
            + "I am mostly trying to fill out a really long comment to "
            + "test message rendering. Slack should do the right thing "
            + "but this will be on multiple lines in IRC.\n\n\n\n\n"
            + "This is hidden.");

    String webhookUrl;
    webhookUrl = properties.getProperty("webhook-url");

    assertTrue(client.publish(template.render(), webhookUrl));
  }
}
