/*
 * 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.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({Project.NameKey.class})
public class WebhookClientIntegrationTest {
  private static final String PROJECT_NAME = "test-project";

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

  @Before
  public void setup() throws Exception {
    PowerMockito.mockStatic(Project.NameKey.class);
    when(Project.NameKey.parse(PROJECT_NAME)).thenReturn(mockNameKey);
  }

  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));
  }
}
