import { getDomainFromEmail } from "../../src/utils/sanitizer.utils";
import { removeNonNumeric } from "../../src/utils/sanitizer.utils";
import { removeNonAlpha } from "../../src/utils/sanitizer.utils";
import { removeNonAlphanumeric } from "../../src/utils/sanitizer.utils";

describe("Sanitize Email", () => {
  const inputs = [
    "this+is+an-_email@example.com",
    '"unusual email"@example.com',
    "(brackets)addr@example.com",
    "I%Have{Special}%Characters@example.com",
    "Basic.address@example.com",
    `"very.(),:;<>[]\".VERY.\"very\ \"very\".unusual"@example.com`,
    "THIS_EMAIL_CONTAINS_CAPITALISED_DOMAIN@EXAMPLE.COM",
  ];
  const expectedOutput = "example.com";
  for (const addr of inputs) {
    test(`Should return only domain: ${addr}`, () => {
      expect(getDomainFromEmail(addr)).toEqual(expectedOutput);
    });
  }
});

describe("Remove non-numeric", () => {
  const inputs = ["abc123", "<%43)($£@:}jfkd4"];
  const expectedOutputs = ["123", "434"];
  for (const key in inputs) {
    const input = inputs[key];
    const desired = expectedOutputs[key];
    test(`Should return only numbers: ${key}`, () => {
      expect(removeNonNumeric(input)).toEqual(desired);
    });
  }
});

describe("Remove non-Alpha", () => {
  const inputs = ["DROP/*comment*/sampletable", "10; DROP TABLE members /*"];
  const outputs = ["DROPcommentsampletable", "DROPTABLEmembers"];
  for (const key in inputs) {
    const input = inputs[key];
    const desired = outputs[key];
    test(`Should return with only letters: ${key}`, () => {
      expect(removeNonAlpha(input)).toEqual(desired);
    });
  }
});

describe("Remove non-alphanumeric", () => {
  const inputs = [
    "DROP/*comment*/sampletable",
    "10; DROP TABLE members /*",
    "1F44",
  ];
  const outputs = ["DROPcommentsampletable", "10DROPTABLEmembers", "1F44"];
  for (const key in inputs) {
    const input = inputs[key];
    const desired = outputs[key];
    test(`Should return with only alphanumeric: ${key}`, () => {
      expect(removeNonAlphanumeric(input)).toEqual(desired);
    });
  }
});