All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.pincette.jes.test.Application Maven / Gradle / Ivy

package net.pincette.jes.test;

import static java.lang.System.exit;
import static java.util.Arrays.stream;
import static net.pincette.jes.test.Test.run;
import static net.pincette.jes.util.Configuration.loadDefault;
import static net.pincette.jes.util.Streams.fromConfig;
import static net.pincette.json.JsonUtil.string;
import static net.pincette.util.Util.tryToGetSilent;

import com.typesafe.config.Config;
import java.io.File;
import java.util.Map;
import javax.json.JsonArray;
import javax.json.JsonObject;
import net.pincette.util.ArgsBuilder;

/**
 * The command-line for running reducer tests for JSON Event Sourcing. The configuration is loaded
 * from "conf/application.conf". It should have the "kafka" entry and the "environment" entry. The
 * latter will be set to "dev" when not present. The "-d" or "--directory" option should point to a
 * directory, which contains the subdirectories "commands" and "replies".
 *
 * @author Werner Donn\u00e9
 */
public class Application {
  private static final String DEV = "dev";
  private static final String DIRECTORY = "directory";
  private static final String DIRECTORY_OPT = "--directory";
  private static final String DIRECTORY_OPT_SHORT = "-d";
  private static final String ENVIRONMENT = "environment";
  private static final String KAFKA = "kafka";

  private static ArgsBuilder adder(final ArgsBuilder builder, final String arg) {
    switch (arg) {
      case DIRECTORY_OPT:
      case DIRECTORY_OPT_SHORT:
        return builder.addPending(DIRECTORY);
      default:
        return builder.add(arg);
    }
  }

  public static void main(final String[] args) {
    stream(args)
        .reduce(new ArgsBuilder(), Application::adder, (b1, b2) -> b1)
        .build()
        .filter(map -> map.containsKey(DIRECTORY))
        .map(Application::test)
        .orElse(Application::usage)
        .run();

    exit(0);
  }

  @SuppressWarnings("squid:S106") // Not logging.
  public static void report(
      final String filename,
      final JsonObject command,
      final JsonObject expected,
      final JsonArray patch) {
    System.out.println(filename);

    if (!patch.isEmpty()) {
      System.out.println("ERROR");
      System.out.println("The reply for the command");
      System.out.println(string(command));
      System.out.println("and the expected result");
      System.out.println(string(expected));
      System.out.println("have the following differences");
      System.out.println(string(patch));
    } else {
      System.out.println("OK");
    }
  }

  @SuppressWarnings("squid:S106") // Not logging.
  private static Runnable test(final Map options) {
    return () -> {
      final Config config = loadDefault();

      if (!run(
          new File(options.get(DIRECTORY)).toPath(),
          fromConfig(config, KAFKA),
          tryToGetSilent(() -> config.getString(ENVIRONMENT)).orElse(DEV),
          Application::report)) {
        System.out.println("Some tests failed");
        exit(1);
      }

      System.out.println("Tests succeeded");
    };
  }

  @SuppressWarnings("squid:S106") // Not logging.
  private static void usage() {
    System.err.println("Usage: net.pincette.jes.test.Application (-d | --directory) directory");
    exit(1);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy