/*
 * Copyright 2017 LinkedIn Corp.
 *
 * 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 azkaban.project;

import static org.assertj.core.api.Assertions.assertThat;

import java.io.File;
import org.junit.Test;

public class FlowBeanLoaderTest {

  public static final String TEST_FLOW_NAME = "sample_flow";
  public static final String TEST_FLOW_YML_FILENAME = TEST_FLOW_NAME + ".flow";
  public static final String SHELL_END = "shell_end";
  public static final String SHELL_ECHO = "shell_echo";
  public static final String SHELL_BASH = "shell_bash";
  public static final String SHELL_PWD = "shell_pwd";
  public static final String ECHO_COMMAND = "echo \"This is an echoed text.\"";

  final File TEST_FLOW_YML_FILE =
      new File(getClass().getClassLoader().getResource(TEST_FLOW_YML_FILENAME).getFile());

  @Test
  public void testLoad() throws Exception {

    final FlowBeanLoader loader = new FlowBeanLoader();
    final FlowBean flowBean = loader.load(TEST_FLOW_YML_FILE);

    assertThat(flowBean.getConfig().get("flow-level-parameter")).isEqualTo("value");
    assertThat(flowBean.getNodes().size()).isEqualTo(4);

    final NodeBean node0 = flowBean.getNodes().get(0);
    assertThat(node0.getName()).isEqualTo(SHELL_END);
    assertThat(node0.getType()).isEqualTo("noop");
    assertThat(node0.getDependsOn()).contains(SHELL_PWD, SHELL_ECHO, SHELL_BASH);

    final NodeBean node1 = flowBean.getNodes().get(1);
    assertThat(node1.getName()).isEqualTo(SHELL_ECHO);
    assertThat(node1.getConfig().get("command")).isEqualTo(ECHO_COMMAND);
  }

  @Test
  public void testToAzkabanFlow() throws Exception {
    final FlowBeanLoader loader = new FlowBeanLoader();
    final FlowBean flowBean = loader.load(TEST_FLOW_YML_FILE);
    final AzkabanFlow flow = loader
        .toAzkabanFlow(loader.getFlowName(TEST_FLOW_YML_FILE), flowBean);

    assertThat(flow.getName()).isEqualTo(TEST_FLOW_NAME);
    assertThat(flow.getProps().get("flow-level-parameter")).isEqualTo("value");
    assertThat(flow.getNodes().size()).isEqualTo(4);

    final AzkabanJob shellEnd = flow.getJob(SHELL_END);
    assertThat(shellEnd.getName()).isEqualTo(SHELL_END);
    assertThat(shellEnd.getType()).isEqualTo("noop");
    assertThat(shellEnd.getProps().size()).isEqualTo(0);
    assertThat(shellEnd.getDependsOn()).contains(SHELL_PWD, SHELL_ECHO, SHELL_BASH);

    final AzkabanJob shellEcho = flow.getJob(SHELL_ECHO);
    assertThat(shellEcho.getName()).isEqualTo(SHELL_ECHO);
    assertThat(shellEcho.getType()).isEqualTo("command");
    assertThat(shellEcho.getProps().size()).isEqualTo(1);
    assertThat(shellEcho.getProps().get("command")).isEqualTo(ECHO_COMMAND);
  }

  @Test
  public void testGetFlowName() throws Exception {
    assertThat(new FlowBeanLoader().getFlowName(TEST_FLOW_YML_FILE)).isEqualTo(TEST_FLOW_NAME);
  }
}
