import { IFactory } from "../interfaces/IFactory";
import { IParser, ParserOptions } from "../interfaces/IParser";
import { Csv } from "../models/Csv";
import { ParserFactory } from "../providers/factories/ParserFactory";
import { JsonParserService } from "../providers/services/JsonParserService";
describe("Json test", () => {
  test("simple single json to csv", () => {
    const json = {
      name: "fox",
      id: "31245324",
    };
    let parserFactory: IFactory = new ParserFactory();
    const parser: IParser = parserFactory.make("jsonParser", json, {
      hasId: false,
      single: true,
    });
    expect(parser).toBeInstanceOf(JsonParserService);
    const headers = ["id", "name"];
    const csv: Csv = parser.parse(headers);
    const data: string = csv.make();
    const rows = csv.makeRows().getRows();
    expect(rows).toEqual([["31245324", "fox"]]);
    expect(data).toEqual("id,name\n31245324,fox,");
    expect(csv.getHeaders()).toEqual(headers);
  });
  test("simple mutiple json to csv", () => {
    const json = {
      user: { name: "fox", id: "31245324" },
      child: { name: "fox", id: "31245324" },
    };
    let parserFactory: IFactory = new ParserFactory();
    const parser: IParser = parserFactory.make("jsonParser", json, {
      hasId: false,
      single: false,
    });
    expect(parser).toBeInstanceOf(JsonParserService);
    const headers = ["id", "name"];
    const csv: Csv = parser.parse(headers);
    const data: string = csv.make();
    const rows = csv.makeRows().getRows();
    expect(rows).toEqual([
      ["31245324", "fox"],
      ["31245324", "fox"],
    ]);
    expect(data).toEqual("id,name\n31245324,fox,\n31245324,fox,\n");
    expect(csv.getHeaders()).toEqual(headers);
  });
  test("complex nested json to csv", () => {
    const json = {
      user: { name: "fox", uid: "31245324", address: { city: "nowhere" } },
      child: { name: "fox", uid: "31245324", address: { city: "where" } },
    };
    let parserFactory: IFactory = new ParserFactory();
    const parser: IParser = parserFactory.make("jsonParser", json, {
      hasId: true,
      single: false,
    });
    expect(parser).toBeInstanceOf(JsonParserService);
    const headers = ["uid", "name", "address.city"];
    const csv: Csv = parser.parse(headers);
    const data: string = csv.make();
    const rows = csv.makeRows().getRows();
    expect(rows).toEqual([
      ["user", "31245324", "fox", "nowhere"],
      ["child", "31245324", "fox", "where"],
    ]);
    expect(data).toEqual(
      "id,uid,name,address.city\nuser,31245324,fox,nowhere,\nchild,31245324,fox,where,\n"
    );
    expect(csv.getHeaders()).toEqual(headers);
  });
  test("complex nested json to csv with defualt values", () => {
    const json = {
      user: { name: "fox", uid: "31245324", address: { city: "nowhere" } },
      child: { name: "fox", uid: "31245324" },
    };
    let parserFactory: IFactory = new ParserFactory();
    const options: ParserOptions = {
      hasId: true,
      single: false,
      setDefaultValues: true,
    };
    const parser: IParser = parserFactory.make("jsonParser", json, options);
    expect(parser).toBeInstanceOf(JsonParserService);
    const headers = ["uid", "name", "address.city"];
    const csv: Csv = parser.parse(headers);
    const data: string = csv.make();
    const rows = csv.makeRows().getRows();
    console.log(rows);
    expect(rows).toEqual([
      ["user", "31245324", "fox", "nowhere"],
      ["child", "31245324", "fox"],
    ]);
    expect(data).toEqual(
      "id,uid,name,address.city\nuser,31245324,fox,nowhere,\nchild,31245324,fox,,\n"
    );
    expect(csv.getHeaders()).toEqual(headers);
  });
});
