import { IFactory } from "../interfaces/IFactory";
import { IParser } from "../interfaces/IParser";
import { Csv } from "../models/Csv";
import { ParserFactory } from "../providers/factories/ParserFactory";
import { FileSystemService } from "../providers/services/FileSystemService";
import { JsonParserService } from "../providers/services/JsonParserService";
import fs from "fs";
import { CsvParserService } from "../providers/services/CsvParserService";

describe("FileIO test", () => {
  test("Create a csv file", (done) => {
    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,
    });
    const headers = ["uid", "name", "address.city"];
    const csv: Csv = parser.parse(headers);
    const data: string = csv.make();
    const fileSystemService: FileSystemService = new FileSystemService(
      "data.csv",
      "./Data"
    );
    fileSystemService.write(data).then(() => {
      const exists: boolean = fs.existsSync(fileSystemService.getFullPath());
      expect(exists).toEqual(true);
      done();
    });
  });
  test("Create a json file", (done) => {
    const headers = ["id", "uid", "name", "address.city"];
    const body = "user,31245323,fox,nowhere,\nchild,31245324,fox,where,\n";
    const csv: Csv = new Csv(headers, body);
    let parserFactory: IFactory = new ParserFactory();
    const parser: IParser = parserFactory.make("csvParser", csv);
    const json = parser.parse();
    const fileSystemService: FileSystemService = new FileSystemService(
      "data.json",
      "./Data"
    );
    fileSystemService.write(JSON.stringify(json)).then(() => {
      const exists: boolean = fs.existsSync(fileSystemService.getFullPath());
      expect(exists).toEqual(true);
      done();
    });
  });
});
