package io.delphi.qa.auto.awsmfrw.tests.slz;

import io.delphi.qa.auto.awsmfrw.common_baby.IsaCommonMethods;
import io.delphi.qa.auto.awsmfrw.common_baby.delphi.aws.EnAwsLambdaJobs;
import io.delphi.qa.auto.awsmfrw.common_baby.delphi.aws.EnAwsSecrets;
import io.delphi.qa.auto.awsmfrw.models.EnDelphiDspItems;
import io.delphi.qa.auto.awsmfrw.models.EnDelphiLicensorItems;
import io.delphi.qa.auto.awsmfrw.models.EnDelphiReportItems;
import io.delphi.qa.auto.awsmfrw.models.EnDelphiReportVersionItems;
import io.delphi.qa.auto.awsmfrw.models.aws.cw.MlCwEventRegular;
import io.delphi.qa.auto.awsmfrw.models.aws.cw.OptionalConfig;
import io.delphi.qa.auto.awsmfrw.models.aws.lm.EnAwsLambdaResponseStatusItems;
import io.delphi.qa.auto.awsmfrw.models.aws.lm.RsAwsLambda;
import io.delphi.qa.auto.awsmfrw.models.aws.lm.WpSlzUnitOfWork;
import io.delphi.qa.auto.awsmfrw.suppliers.DelphiDataContainer;
import io.delphi.qa.auto.awsmfrw.tests.BsTestCase;
import org.joda.time.DateTime;
import org.testng.Assert;
import org.testng.annotations.Test;

public class Lambda_UnitTest extends BsTestCase {

  @Override
  public String genTestRunId() {
    return IsaCommonMethods.testRunId();
  }

  private static WpSlzUnitOfWork ML_WP_AWS_UOW;

  static {
    DateTime xReportDate = DT_NOW.minusDays(2);
    ML_WP_AWS_UOW =
        new WpSlzUnitOfWork()
            .withDsp(EnDelphiDspItems.APPLE.get())
            .withLicensor(EnDelphiLicensorItems.THEORCHARD.get())
            .withReportName(EnDelphiReportItems.AM_SHAZAM.getReportName())
            .withVersion(EnDelphiReportVersionItems.v1_2.name())
            .withReportDate(xReportDate)
            .withRequiredContextAmount(0);
  }

  @Test
  public void
      tc1_givenLambda_whenCallJobManager_andEventRegular_andInvalidDate_andOptionalConfig_thenResponseFailed() {
    DelphiDataContainer.genMlPgUnitOfWork(ML_WP_AWS_UOW, 0);
    MlCwEventRegular mlCwEventRegular =
        DelphiDataContainer.genMlCwEventRegular(
                new OptionalConfig().withRdsSecretsKey(EnAwsSecrets.DELPHI_AUTOTESTS_CONFIG.resourceLocator()),
                ML_WP_AWS_UOW.getReportDate())
            .withTime(ML_WP_AWS_UOW.getReportDate());
    String rqJsonText =
        gson.toJson(
            mlCwEventRegular.withOptionalConfig(new OptionalConfig().withRdsSecretsKey("empty")));
    RsAwsLambda rsAwsLambda =
        delphi.aws().lm().getResponse(EnAwsLambdaJobs.DELPHI_SLZ_JOB_EXECUTOR.get(), rqJsonText);
    Assert.assertEquals(
        rsAwsLambda.getMeta().getStatus(),
        EnAwsLambdaResponseStatusItems.FAILURE.get(),
        "aws.step_function.response is " + rsAwsLambda.getMeta().getStatus());
    Assert.assertEquals(rsAwsLambda.getMeta().getStatus(), "FAILURE");
  }

  @Test
  public void
      tc2_givenLambda_whenCallJobManager_andEventRegular_andInvalidDate_andOptionalConfig_thenResponseOk() {
    DelphiDataContainer.genMlPgUnitOfWork(ML_WP_AWS_UOW, 0);
    MlCwEventRegular mlCwEventRegular =
        DelphiDataContainer.genMlCwEventRegular(
            new OptionalConfig().withRdsSecretsKey(EnAwsSecrets.DELPHI_AUTOTESTS_CONFIG.resourceLocator()),
            ML_WP_AWS_UOW.getReportDate());
    String rqJsonText = gson.toJson(mlCwEventRegular.withTime(DateTime.now().minusYears(50)));
    RsAwsLambda rsAwsLambda =
        delphi.aws().lm().getResponse(EnAwsLambdaJobs.DELPHI_SLZ_JOB_EXECUTOR.get(), rqJsonText);
    Assert.assertEquals(
        rsAwsLambda.getMeta().getStatus(),
        EnAwsLambdaResponseStatusItems.OK.get(),
        "aws.step_function.response is " + rsAwsLambda.getMeta().getStatus());
    Assert.assertEquals(rsAwsLambda.getMeta().getStatus(), "OK");
  }
}
