@bangladeshi/bangladesh-address
Version:
A simple npm package for Bangladesh's administrative divisions, districts, upazilas, and metropolitan thanas.
194 lines (193 loc) • 9.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const index_1 = require("../index");
const division_name_1 = require("../division/types/division-name");
describe("Data Integrity", () => {
describe("Division counts", () => {
it("should have exactly 8 divisions", () => {
expect((0, index_1.allDivision)()).toHaveLength(8);
});
it("should match DivisionName enum values", () => {
const divisions = (0, index_1.allDivision)();
const enumValues = Object.values(division_name_1.DivisionName);
expect(divisions.sort()).toEqual(enumValues.sort());
});
});
describe("District counts", () => {
it("should have exactly 64 districts", () => {
expect((0, index_1.allDistricts)()).toHaveLength(64);
});
it("should have correct district count per division", () => {
const divisionDistrictCounts = {
[division_name_1.DivisionName.Barisal]: 6,
[division_name_1.DivisionName.Chattogram]: 11,
[division_name_1.DivisionName.Dhaka]: 13,
[division_name_1.DivisionName.Khulna]: 10,
[division_name_1.DivisionName.Mymensingh]: 4,
[division_name_1.DivisionName.Rajshahi]: 8,
[division_name_1.DivisionName.Rangpur]: 8,
[division_name_1.DivisionName.Sylhet]: 4,
};
Object.entries(divisionDistrictCounts).forEach(([division, expectedCount]) => {
const districts = (0, index_1.districtsOf)(division);
expect(districts.length).toBe(expectedCount);
});
});
it("total districts from all divisions should equal 64", () => {
const divisions = Object.values(division_name_1.DivisionName);
const allDistrictNames = new Set();
divisions.forEach((division) => {
const districts = (0, index_1.districtsOf)(division);
districts.forEach((d) => allDistrictNames.add(d));
});
expect(allDistrictNames.size).toBe(64);
});
});
describe("Upazila counts", () => {
it("should have exactly 495 upazilas", () => {
expect((0, index_1.allUpazila)()).toHaveLength(495);
});
it("every district should have at least one upazila", () => {
const districts = (0, index_1.allDistricts)();
districts.forEach((district) => {
const upazilas = (0, index_1.upazilasOf)(district);
expect(upazilas.length).toBeGreaterThan(0);
});
});
});
describe("Thana counts", () => {
it("should have 26 metropolitan thanas", () => {
const thanas = (0, index_1.allThana)();
expect(thanas.length).toBe(26);
});
it("Dhaka should have 15 thanas", () => {
const dhakaThanas = (0, index_1.thanasOf)("Dhaka");
expect(dhakaThanas.length).toBe(15);
});
it("Chattogram should have 6 thanas", () => {
const chattogramThanas = (0, index_1.thanasOf)("Chattogram");
expect(chattogramThanas.length).toBe(6);
});
it("Rajshahi should have 2 thanas", () => {
const rajshahiThanas = (0, index_1.thanasOf)("Rajshahi");
expect(rajshahiThanas.length).toBe(2);
});
it("Khulna should have 3 thanas", () => {
const khulnaThanas = (0, index_1.thanasOf)("Khulna");
expect(khulnaThanas.length).toBe(3);
});
it("isThana should return true for metropolitan thanas", () => {
expect((0, index_1.isThana)("Gulshan")).toBe(true);
expect((0, index_1.isThana)("Dhanmondi")).toBe(true);
expect((0, index_1.isThana)("Kotwali")).toBe(true);
});
it("isThana should return false for regular upazilas", () => {
expect((0, index_1.isThana)("Savar")).toBe(false);
expect((0, index_1.isThana)("Keraniganj")).toBe(false);
});
});
describe("Data consistency", () => {
it("all upazilas should have valid division references", () => {
const validDivisions = (0, index_1.allDivision)();
const districts = (0, index_1.allDistricts)();
districts.forEach((district) => {
const upazilas = (0, index_1.upazilasOf)(district);
upazilas.forEach((upazila) => {
expect(validDivisions).toContain(upazila.division);
});
});
});
it("all upazilas should have valid district references", () => {
const validDistricts = (0, index_1.allDistricts)();
const districts = (0, index_1.allDistricts)();
districts.forEach((district) => {
const upazilas = (0, index_1.upazilasOf)(district);
upazilas.forEach((upazila) => {
expect(validDistricts).toContain(upazila.district);
});
});
});
it("thanas should have valid thana objects", () => {
const thanas = (0, index_1.allThana)();
thanas.forEach((thana) => {
expect(thana).toHaveProperty("thana");
expect(thana).toHaveProperty("district");
expect(thana).toHaveProperty("division");
expect(thana).toHaveProperty("type");
expect(thana.type).toBe("thana");
});
});
it("all thanas should have valid district references", () => {
const validDistricts = (0, index_1.allDistricts)();
const thanas = (0, index_1.allThana)();
thanas.forEach((thana) => {
expect(validDistricts).toContain(thana.district);
});
});
it("all thanas should have valid division references", () => {
const validDivisions = (0, index_1.allDivision)();
const thanas = (0, index_1.allThana)();
thanas.forEach((thana) => {
expect(validDivisions).toContain(thana.division);
});
});
});
describe("Utility functions", () => {
it("allThanaNames should return same count as allThana", () => {
expect((0, index_1.allThanaNames)().length).toBe((0, index_1.allThana)().length);
});
it("isUpazila should return true for valid upazilas", () => {
expect((0, index_1.isUpazila)("Savar")).toBe(true);
expect((0, index_1.isUpazila)("Keraniganj")).toBe(true);
});
it("isUpazila should return false for thanas", () => {
expect((0, index_1.isUpazila)("Gulshan")).toBe(false);
expect((0, index_1.isUpazila)("Dhanmondi")).toBe(false);
});
it("getThana should return correct thana object", () => {
const thana = (0, index_1.getThana)("Gulshan");
expect(thana === null || thana === void 0 ? void 0 : thana.district).toBe("Dhaka");
expect(thana === null || thana === void 0 ? void 0 : thana.division).toBe("Dhaka");
});
it("getUpazila should return correct upazila object", () => {
const upazila = (0, index_1.getUpazila)("Savar");
expect(upazila === null || upazila === void 0 ? void 0 : upazila.district).toBe("Dhaka");
expect(upazila === null || upazila === void 0 ? void 0 : upazila.division).toBe("Dhaka");
});
it("thanas and upazilas with same name should be in different districts", () => {
const thanas = (0, index_1.allThana)();
thanas.forEach((thana) => {
const matchingUpazila = (0, index_1.getUpazila)(thana.thana);
if (matchingUpazila) {
// Same name exists as upazila - must be in different district
expect(matchingUpazila.district).not.toBe(thana.district);
}
});
});
it("Mohammadpur thana (Dhaka) and Mohammadpur upazila (Magura) are different", () => {
const thana = (0, index_1.getThana)("Mohammadpur");
const upazila = (0, index_1.getUpazila)("Mohammadpur");
expect(thana === null || thana === void 0 ? void 0 : thana.district).toBe("Dhaka");
expect(upazila === null || upazila === void 0 ? void 0 : upazila.district).toBe("Magura");
});
});
describe("Type Safety", () => {
it("DivisionName enum should have correct values", () => {
expect(division_name_1.DivisionName.Dhaka).toBe("Dhaka");
expect(division_name_1.DivisionName.Chattogram).toBe("Chattogram");
});
it("DistrictName type should accept valid districts", () => {
const dhaka = "Dhaka";
const chattogram = "Chattogram";
expect(dhaka).toBe("Dhaka");
expect(chattogram).toBe("Chattogram");
});
it("district context should disambiguate duplicate thana names", () => {
// Kotwali exists in both Dhaka and Chattogram
const dhakaKotwali = (0, index_1.getThana)("Kotwali", "Dhaka");
const chattogramKotwali = (0, index_1.getThana)("Kotwali", "Chattogram");
expect(dhakaKotwali === null || dhakaKotwali === void 0 ? void 0 : dhakaKotwali.division).toBe("Dhaka");
expect(chattogramKotwali === null || chattogramKotwali === void 0 ? void 0 : chattogramKotwali.division).toBe("Chattogram");
});
});
});