@geekmidas/testkit 9.0.2 → 10.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/{Factory-CUM2767q.d.cts → Factory-C6W78ulZ.d.mts} +2 -2
  2. package/dist/{Factory-ClyZLRsO.d.mts.map → Factory-C6W78ulZ.d.mts.map} +1 -1
  3. package/dist/{Factory-ClyZLRsO.d.mts → Factory-DSEADOaF.d.cts} +2 -2
  4. package/dist/{Factory-CUM2767q.d.cts.map → Factory-DSEADOaF.d.cts.map} +1 -1
  5. package/dist/Factory.d.cts +2 -2
  6. package/dist/Factory.d.mts +2 -2
  7. package/dist/{KyselyFactory-OMwcuAX_.d.cts → KyselyFactory-Cc2UmOJk.d.mts} +3 -3
  8. package/dist/{KyselyFactory-CTZmiGI9.d.mts.map → KyselyFactory-Cc2UmOJk.d.mts.map} +1 -1
  9. package/dist/{KyselyFactory-CTZmiGI9.d.mts → KyselyFactory-DzH0N1zr.d.cts} +3 -3
  10. package/dist/{KyselyFactory-OMwcuAX_.d.cts.map → KyselyFactory-DzH0N1zr.d.cts.map} +1 -1
  11. package/dist/KyselyFactory.d.cts +3 -3
  12. package/dist/KyselyFactory.d.mts +3 -3
  13. package/dist/{ObjectionFactory-DDrKwAoO.d.mts → ObjectionFactory-BYnPr9ZP.d.mts} +3 -3
  14. package/dist/{ObjectionFactory-DDrKwAoO.d.mts.map → ObjectionFactory-BYnPr9ZP.d.mts.map} +1 -1
  15. package/dist/{ObjectionFactory-DvmZVHhe.d.cts → ObjectionFactory-BmKdG0nT.d.cts} +3 -3
  16. package/dist/{ObjectionFactory-DvmZVHhe.d.cts.map → ObjectionFactory-BmKdG0nT.d.cts.map} +1 -1
  17. package/dist/ObjectionFactory.d.cts +3 -3
  18. package/dist/ObjectionFactory.d.mts +3 -3
  19. package/dist/{VitestKyselyTransactionIsolator-CfSMOFlN.mjs → VitestKyselyTransactionIsolator-1Saieke7.mjs} +10 -3
  20. package/dist/VitestKyselyTransactionIsolator-1Saieke7.mjs.map +1 -0
  21. package/dist/{VitestKyselyTransactionIsolator-0CqOsuc9.cjs → VitestKyselyTransactionIsolator-BjJSXryR.cjs} +10 -3
  22. package/dist/VitestKyselyTransactionIsolator-BjJSXryR.cjs.map +1 -0
  23. package/dist/{VitestKyselyTransactionIsolator-CduJlHoT.d.cts → VitestKyselyTransactionIsolator-CwlTo6yf.d.mts} +8 -3
  24. package/dist/VitestKyselyTransactionIsolator-CwlTo6yf.d.mts.map +1 -0
  25. package/dist/{VitestKyselyTransactionIsolator-Cswnnj0k.d.mts → VitestKyselyTransactionIsolator-DJasVuIZ.d.cts} +8 -3
  26. package/dist/VitestKyselyTransactionIsolator-DJasVuIZ.d.cts.map +1 -0
  27. package/dist/VitestKyselyTransactionIsolator.cjs +2 -2
  28. package/dist/VitestKyselyTransactionIsolator.d.cts +2 -2
  29. package/dist/VitestKyselyTransactionIsolator.d.mts +2 -2
  30. package/dist/VitestKyselyTransactionIsolator.mjs +2 -2
  31. package/dist/{VitestObjectionTransactionIsolator-CNo40EdC.mjs → VitestObjectionTransactionIsolator-B_VSWFum.mjs} +2 -2
  32. package/dist/{VitestObjectionTransactionIsolator-CNo40EdC.mjs.map → VitestObjectionTransactionIsolator-B_VSWFum.mjs.map} +1 -1
  33. package/dist/{VitestObjectionTransactionIsolator-BXoR6xdG.d.cts → VitestObjectionTransactionIsolator-CTTjvTPO.d.cts} +2 -2
  34. package/dist/{VitestObjectionTransactionIsolator-BXoR6xdG.d.cts.map → VitestObjectionTransactionIsolator-CTTjvTPO.d.cts.map} +1 -1
  35. package/dist/{VitestObjectionTransactionIsolator-x6hY5j4u.d.mts → VitestObjectionTransactionIsolator-CyZG6nq4.d.mts} +2 -2
  36. package/dist/{VitestObjectionTransactionIsolator-x6hY5j4u.d.mts.map → VitestObjectionTransactionIsolator-CyZG6nq4.d.mts.map} +1 -1
  37. package/dist/{VitestObjectionTransactionIsolator-B5J9jjKq.cjs → VitestObjectionTransactionIsolator-DDoJTu7e.cjs} +2 -2
  38. package/dist/{VitestObjectionTransactionIsolator-B5J9jjKq.cjs.map → VitestObjectionTransactionIsolator-DDoJTu7e.cjs.map} +1 -1
  39. package/dist/VitestObjectionTransactionIsolator.cjs +2 -2
  40. package/dist/VitestObjectionTransactionIsolator.d.cts +2 -2
  41. package/dist/VitestObjectionTransactionIsolator.d.mts +2 -2
  42. package/dist/VitestObjectionTransactionIsolator.mjs +2 -2
  43. package/dist/{VitestTransactionIsolator-BNWJqh9f.d.mts → VitestTransactionIsolator-BLaw80cx.d.mts} +20 -4
  44. package/dist/VitestTransactionIsolator-BLaw80cx.d.mts.map +1 -0
  45. package/dist/{VitestTransactionIsolator-D6ZxLWys.mjs → VitestTransactionIsolator-CvwPecpl.mjs} +17 -4
  46. package/dist/VitestTransactionIsolator-CvwPecpl.mjs.map +1 -0
  47. package/dist/{VitestTransactionIsolator-CtZaOUjH.cjs → VitestTransactionIsolator-DyiX-QtK.cjs} +17 -4
  48. package/dist/VitestTransactionIsolator-DyiX-QtK.cjs.map +1 -0
  49. package/dist/{VitestTransactionIsolator-CSroc7Df.d.cts → VitestTransactionIsolator-glcxyS_R.d.cts} +20 -4
  50. package/dist/VitestTransactionIsolator-glcxyS_R.d.cts.map +1 -0
  51. package/dist/VitestTransactionIsolator.cjs +1 -1
  52. package/dist/VitestTransactionIsolator.d.cts +2 -2
  53. package/dist/VitestTransactionIsolator.d.mts +2 -2
  54. package/dist/VitestTransactionIsolator.mjs +1 -1
  55. package/dist/better-auth.d.cts +2 -2
  56. package/dist/better-auth.d.mts +2 -2
  57. package/dist/{faker-BcjUfHxx.d.mts → faker-D9gz7KjY.d.mts} +3 -3
  58. package/dist/{faker-BcjUfHxx.d.mts.map → faker-D9gz7KjY.d.mts.map} +1 -1
  59. package/dist/{faker-zVCm31nU.d.cts → faker-km9UhOS6.d.cts} +3 -3
  60. package/dist/{faker-zVCm31nU.d.cts.map → faker-km9UhOS6.d.cts.map} +1 -1
  61. package/dist/faker.d.cts +1 -1
  62. package/dist/faker.d.mts +1 -1
  63. package/dist/kysely.cjs +2 -2
  64. package/dist/kysely.d.cts +5 -5
  65. package/dist/kysely.d.mts +5 -5
  66. package/dist/kysely.mjs +2 -2
  67. package/dist/objection.cjs +2 -2
  68. package/dist/objection.d.cts +5 -5
  69. package/dist/objection.d.mts +5 -5
  70. package/dist/objection.mjs +2 -2
  71. package/dist/requestContext.cjs +1 -1
  72. package/dist/requestContext.d.cts +1 -1
  73. package/dist/requestContext.d.mts +1 -1
  74. package/dist/requestContext.mjs +1 -1
  75. package/package.json +10 -7
  76. package/CHANGELOG.md +0 -151
  77. package/dist/VitestKyselyTransactionIsolator-0CqOsuc9.cjs.map +0 -1
  78. package/dist/VitestKyselyTransactionIsolator-CduJlHoT.d.cts.map +0 -1
  79. package/dist/VitestKyselyTransactionIsolator-CfSMOFlN.mjs.map +0 -1
  80. package/dist/VitestKyselyTransactionIsolator-Cswnnj0k.d.mts.map +0 -1
  81. package/dist/VitestTransactionIsolator-BNWJqh9f.d.mts.map +0 -1
  82. package/dist/VitestTransactionIsolator-CSroc7Df.d.cts.map +0 -1
  83. package/dist/VitestTransactionIsolator-CtZaOUjH.cjs.map +0 -1
  84. package/dist/VitestTransactionIsolator-D6ZxLWys.mjs.map +0 -1
  85. package/src/Factory.ts +0 -174
  86. package/src/KyselyFactory.ts +0 -391
  87. package/src/ObjectionFactory.ts +0 -412
  88. package/src/PostgresKyselyMigrator.ts +0 -104
  89. package/src/PostgresMigrator.ts +0 -193
  90. package/src/PostgresObjectionMigrator.ts +0 -138
  91. package/src/VitestKyselyTransactionIsolator.ts +0 -72
  92. package/src/VitestObjectionTransactionIsolator.ts +0 -75
  93. package/src/VitestTransactionIsolator.ts +0 -348
  94. package/src/__tests__/Factory.spec.ts +0 -178
  95. package/src/__tests__/KyselyFactory.spec.ts +0 -458
  96. package/src/__tests__/ObjectionFactory.spec.ts +0 -586
  97. package/src/__tests__/PostgresKyselyMigrator.spec.ts +0 -794
  98. package/src/__tests__/PostgresMigrator.spec.ts +0 -471
  99. package/src/__tests__/PostgresObjectionMigrator.spec.ts +0 -634
  100. package/src/__tests__/VitestObjectionTransactionIsolator.spec.ts +0 -138
  101. package/src/__tests__/benchmark.spec.ts +0 -140
  102. package/src/__tests__/better-auth.spec.ts +0 -21
  103. package/src/__tests__/faker.spec.ts +0 -231
  104. package/src/__tests__/initScript.spec.ts +0 -332
  105. package/src/__tests__/integration.spec.ts +0 -610
  106. package/src/__tests__/requestContext.spec.ts +0 -113
  107. package/src/__tests__/utilities.spec.ts +0 -211
  108. package/src/aws.ts +0 -131
  109. package/src/benchmark.ts +0 -48
  110. package/src/better-auth.ts +0 -310
  111. package/src/faker.ts +0 -349
  112. package/src/helpers.ts +0 -45
  113. package/src/initScript.ts +0 -122
  114. package/src/kysely.ts +0 -166
  115. package/src/logger.ts +0 -18
  116. package/src/objection.ts +0 -157
  117. package/src/os/directory.ts +0 -26
  118. package/src/os/index.ts +0 -1
  119. package/src/requestContext.ts +0 -119
  120. package/src/timer.ts +0 -3
  121. package/test/globalSetup.ts +0 -54
  122. package/test/helpers.ts +0 -268
  123. package/test/migrations/1749664623372_user.ts +0 -22
  124. package/tsconfig.json +0 -9
  125. package/vitest.config.ts +0 -8
@@ -1,138 +0,0 @@
1
- import { Model } from 'objection';
2
- import { it as base, describe, expect } from 'vitest';
3
-
4
- import { createKnexDb, createTestTablesKnex } from '../../test/helpers';
5
- import { wrapVitestObjectionTransaction } from '../objection';
6
-
7
- // Define Objection models for testing
8
- class User extends Model {
9
- static get tableName() {
10
- return 'users';
11
- }
12
-
13
- id!: number;
14
- name!: string;
15
- createdAt!: Date;
16
- updatedAt?: Date;
17
-
18
- static get relationMappings() {
19
- return {
20
- posts: {
21
- relation: Model.HasManyRelation,
22
- modelClass: Post,
23
- join: {
24
- from: 'users.id',
25
- to: 'posts.user_id',
26
- },
27
- },
28
- comments: {
29
- relation: Model.HasManyRelation,
30
- modelClass: Comment,
31
- join: {
32
- from: 'users.id',
33
- to: 'comments.user_id',
34
- },
35
- },
36
- };
37
- }
38
- }
39
-
40
- class Post extends Model {
41
- static get tableName() {
42
- return 'posts';
43
- }
44
-
45
- id!: number;
46
- title!: string;
47
- content!: string;
48
- userId!: number;
49
- published?: boolean;
50
- createdAt!: Date;
51
- updatedAt?: Date;
52
-
53
- static get relationMappings() {
54
- return {
55
- user: {
56
- relation: Model.BelongsToOneRelation,
57
- modelClass: User,
58
- join: {
59
- from: 'posts.user_id',
60
- to: 'users.id',
61
- },
62
- },
63
- comments: {
64
- relation: Model.HasManyRelation,
65
- modelClass: Comment,
66
- join: {
67
- from: 'posts.id',
68
- to: 'comments.post_id',
69
- },
70
- },
71
- };
72
- }
73
- }
74
-
75
- class Comment extends Model {
76
- static get tableName() {
77
- return 'comments';
78
- }
79
-
80
- id!: number;
81
- content!: string;
82
- postId!: number;
83
- userId!: number;
84
- createdAt!: Date;
85
-
86
- static get relationMappings() {
87
- return {
88
- post: {
89
- relation: Model.BelongsToOneRelation,
90
- modelClass: Post,
91
- join: {
92
- from: 'comments.post_id',
93
- to: 'posts.id',
94
- },
95
- },
96
- user: {
97
- relation: Model.BelongsToOneRelation,
98
- modelClass: User,
99
- join: {
100
- from: 'comments.user_id',
101
- to: 'users.id',
102
- },
103
- },
104
- };
105
- }
106
- }
107
-
108
- // Create database connection
109
-
110
- // Create wrapped test with transaction isolation
111
- const it = wrapVitestObjectionTransaction(base, {
112
- connection: createKnexDb,
113
- setup: async (trx) => {
114
- // Create tables in the transaction
115
- await createTestTablesKnex(trx);
116
- },
117
- });
118
-
119
- describe('VitestObjectionTransactionIsolator', () => {
120
- describe('Transaction Isolation', () => {
121
- it('should rollback data after test completes', async ({ trx }) => {
122
- // Create a user within the transaction
123
- const user = await User.query(trx).insert({
124
- name: 'Test User',
125
- });
126
-
127
- expect(user).toBeDefined();
128
- expect(user.id).toBeDefined();
129
- expect(user.name).toBe('Test User');
130
-
131
- // Verify user exists in transaction
132
- const foundUser = await User.query(trx).findById(user.id);
133
- expect(foundUser).toBeDefined();
134
-
135
- // Data will be rolled back after this test
136
- });
137
- });
138
- });
@@ -1,140 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import {
3
- generateCacheKeys,
4
- generateIpAddresses,
5
- generateTestData,
6
- randomIpAddress,
7
- } from '../benchmark';
8
-
9
- describe('generateTestData', () => {
10
- it('should generate the specified number of records', () => {
11
- const data = generateTestData(5);
12
- expect(data).toHaveLength(5);
13
- });
14
-
15
- it('should generate records with expected structure', () => {
16
- const data = generateTestData(3);
17
-
18
- for (const record of data) {
19
- expect(record).toHaveProperty('id');
20
- expect(record).toHaveProperty('name');
21
- expect(record).toHaveProperty('value');
22
- expect(typeof record.id).toBe('string');
23
- expect(typeof record.name).toBe('string');
24
- expect(typeof record.value).toBe('number');
25
- }
26
- });
27
-
28
- it('should generate sequential IDs', () => {
29
- const data = generateTestData(3);
30
- expect(data[0].id).toBe('id-0');
31
- expect(data[1].id).toBe('id-1');
32
- expect(data[2].id).toBe('id-2');
33
- });
34
-
35
- it('should generate sequential names', () => {
36
- const data = generateTestData(3);
37
- expect(data[0].name).toBe('Item 0');
38
- expect(data[1].name).toBe('Item 1');
39
- expect(data[2].name).toBe('Item 2');
40
- });
41
-
42
- it('should generate random values between 0 and 1000', () => {
43
- const data = generateTestData(100);
44
-
45
- for (const record of data) {
46
- expect(record.value).toBeGreaterThanOrEqual(0);
47
- expect(record.value).toBeLessThan(1000);
48
- }
49
- });
50
-
51
- it('should return empty array for count 0', () => {
52
- const data = generateTestData(0);
53
- expect(data).toEqual([]);
54
- });
55
- });
56
-
57
- describe('generateCacheKeys', () => {
58
- it('should generate the specified number of keys', () => {
59
- const keys = generateCacheKeys('test', 5);
60
- expect(keys).toHaveLength(5);
61
- });
62
-
63
- it('should use the provided prefix', () => {
64
- const keys = generateCacheKeys('user', 3);
65
- expect(keys[0]).toBe('user:0');
66
- expect(keys[1]).toBe('user:1');
67
- expect(keys[2]).toBe('user:2');
68
- });
69
-
70
- it('should return empty array for count 0', () => {
71
- const keys = generateCacheKeys('test', 0);
72
- expect(keys).toEqual([]);
73
- });
74
-
75
- it('should handle empty prefix', () => {
76
- const keys = generateCacheKeys('', 2);
77
- expect(keys[0]).toBe(':0');
78
- expect(keys[1]).toBe(':1');
79
- });
80
- });
81
-
82
- describe('generateIpAddresses', () => {
83
- it('should generate the specified number of IPs', () => {
84
- const ips = generateIpAddresses(5);
85
- expect(ips).toHaveLength(5);
86
- });
87
-
88
- it('should use default subnet 192.168.1', () => {
89
- const ips = generateIpAddresses(3);
90
- expect(ips[0]).toBe('192.168.1.0');
91
- expect(ips[1]).toBe('192.168.1.1');
92
- expect(ips[2]).toBe('192.168.1.2');
93
- });
94
-
95
- it('should use custom subnet', () => {
96
- const ips = generateIpAddresses(2, '10.0.0');
97
- expect(ips[0]).toBe('10.0.0.0');
98
- expect(ips[1]).toBe('10.0.0.1');
99
- });
100
-
101
- it('should wrap last octet at 256', () => {
102
- const ips = generateIpAddresses(260);
103
- expect(ips[0]).toBe('192.168.1.0');
104
- expect(ips[255]).toBe('192.168.1.255');
105
- expect(ips[256]).toBe('192.168.1.0'); // Wraps around
106
- expect(ips[257]).toBe('192.168.1.1');
107
- });
108
-
109
- it('should return empty array for count 0', () => {
110
- const ips = generateIpAddresses(0);
111
- expect(ips).toEqual([]);
112
- });
113
- });
114
-
115
- describe('randomIpAddress', () => {
116
- it('should generate valid IP address format', () => {
117
- const ip = randomIpAddress();
118
- const parts = ip.split('.');
119
-
120
- expect(parts).toHaveLength(4);
121
-
122
- for (const part of parts) {
123
- const num = Number.parseInt(part, 10);
124
- expect(num).toBeGreaterThanOrEqual(0);
125
- expect(num).toBeLessThanOrEqual(255);
126
- }
127
- });
128
-
129
- it('should generate different IPs on multiple calls', () => {
130
- const ips = new Set<string>();
131
-
132
- // Generate 10 IPs and check we get at least some variation
133
- for (let i = 0; i < 10; i++) {
134
- ips.add(randomIpAddress());
135
- }
136
-
137
- // With random generation, we should get at least 2 unique IPs
138
- expect(ips.size).toBeGreaterThan(1);
139
- });
140
- });
@@ -1,21 +0,0 @@
1
- import { runAdapterTest } from 'better-auth/adapters/test';
2
- import { afterAll, describe } from 'vitest';
3
- import { memoryAdapter } from '../better-auth';
4
-
5
- describe('Memory Adapter Tests', async () => {
6
- afterAll(async () => {
7
- // Run DB cleanup here...
8
- });
9
- const adapter = memoryAdapter({
10
- debugLogs: {
11
- // If your adapter config allows passing in debug logs, then pass this here.
12
- isRunningAdapterTests: true, // This is our super secret flag to let us know to only log debug logs if a test fails.
13
- },
14
- });
15
-
16
- await runAdapterTest({
17
- getAdapter: async (betterAuthOptions = {}) => {
18
- return adapter(betterAuthOptions);
19
- },
20
- });
21
- });
@@ -1,231 +0,0 @@
1
- import { beforeEach, describe, expect, it } from 'vitest';
2
- import { faker } from '../faker';
3
-
4
- describe('faker', () => {
5
- describe('sequence', () => {
6
- beforeEach(() => {
7
- faker.resetAllSequences();
8
- });
9
-
10
- it('should start from 1 for a new sequence', () => {
11
- expect(faker.sequence()).toBe(1);
12
- expect(faker.sequence('custom')).toBe(1);
13
- });
14
-
15
- it('should increment on each call', () => {
16
- expect(faker.sequence()).toBe(1);
17
- expect(faker.sequence()).toBe(2);
18
- expect(faker.sequence()).toBe(3);
19
- });
20
-
21
- it('should maintain separate counters for different names', () => {
22
- expect(faker.sequence('users')).toBe(1);
23
- expect(faker.sequence('posts')).toBe(1);
24
- expect(faker.sequence('users')).toBe(2);
25
- expect(faker.sequence('posts')).toBe(2);
26
- expect(faker.sequence('users')).toBe(3);
27
- expect(faker.sequence('posts')).toBe(3);
28
- });
29
-
30
- it('should handle concurrent-like sequential calls', () => {
31
- const results: number[] = [];
32
- for (let i = 0; i < 100; i++) {
33
- results.push(faker.sequence('concurrent'));
34
- }
35
-
36
- // Check that all values are unique and sequential
37
- expect(results).toEqual(Array.from({ length: 100 }, (_, i) => i + 1));
38
- });
39
- });
40
-
41
- describe('resetSequence', () => {
42
- beforeEach(() => {
43
- faker.resetAllSequences();
44
- });
45
-
46
- it('should reset a specific sequence to 0', () => {
47
- faker.sequence('test');
48
- faker.sequence('test');
49
- expect(faker.sequence('test')).toBe(3);
50
-
51
- faker.resetSequence('test');
52
- expect(faker.sequence('test')).toBe(1);
53
- });
54
-
55
- it('should reset a specific sequence to a custom value', () => {
56
- faker.sequence('test');
57
- faker.resetSequence('test', 10);
58
- expect(faker.sequence('test')).toBe(11);
59
- });
60
-
61
- it('should create a new sequence if it does not exist', () => {
62
- faker.resetSequence('new', 5);
63
- expect(faker.sequence('new')).toBe(6);
64
- });
65
-
66
- it('should not affect other sequences', () => {
67
- faker.sequence('test1');
68
- faker.sequence('test1');
69
- faker.sequence('test2');
70
-
71
- faker.resetSequence('test1');
72
-
73
- expect(faker.sequence('test1')).toBe(1);
74
- expect(faker.sequence('test2')).toBe(2);
75
- });
76
- });
77
-
78
- describe('resetAllSequences', () => {
79
- it('should reset all sequences', () => {
80
- faker.sequence('test1');
81
- faker.sequence('test1');
82
- faker.sequence('test2');
83
- faker.sequence('test2');
84
- faker.sequence('test2');
85
-
86
- faker.resetAllSequences();
87
-
88
- expect(faker.sequence('test1')).toBe(1);
89
- expect(faker.sequence('test2')).toBe(1);
90
- expect(faker.sequence()).toBe(1);
91
- });
92
- });
93
-
94
- describe('identifier', () => {
95
- beforeEach(() => {
96
- faker.resetAllSequences();
97
- });
98
-
99
- it('should include sequence number in identifier', () => {
100
- const id1 = faker.identifier();
101
- const id2 = faker.identifier();
102
-
103
- // Both should be different because of the sequence
104
- expect(id1).not.toBe(id2);
105
-
106
- // Should end with sequence numbers
107
- expect(id1).toMatch(/1$/);
108
- expect(id2).toMatch(/2$/);
109
- });
110
-
111
- it('should use custom suffix when provided', () => {
112
- const id = faker.identifier('customSuffix');
113
- expect(id).toMatch(/\.customSuffix$/);
114
- });
115
- });
116
-
117
- describe('timestamps', () => {
118
- it('should return createdAt and updatedAt dates', () => {
119
- const { createdAt, updatedAt } = faker.timestamps();
120
-
121
- expect(createdAt).toBeInstanceOf(Date);
122
- expect(updatedAt).toBeInstanceOf(Date);
123
- expect(createdAt.getTime()).toBeLessThanOrEqual(updatedAt.getTime());
124
- expect(updatedAt.getTime()).toBeLessThanOrEqual(Date.now());
125
- });
126
-
127
- it('should have milliseconds set to 0', () => {
128
- const { createdAt, updatedAt } = faker.timestamps();
129
-
130
- expect(createdAt.getMilliseconds()).toBe(0);
131
- expect(updatedAt.getMilliseconds()).toBe(0);
132
- });
133
- });
134
-
135
- describe('price', () => {
136
- it('should return a number', () => {
137
- const result = faker.price();
138
- expect(typeof result).toBe('number');
139
- expect(result).toBeGreaterThan(0);
140
- });
141
- });
142
-
143
- describe('coordinates', () => {
144
- const center = { lat: 40.7128, lng: -74.006 }; // New York City
145
-
146
- describe('within', () => {
147
- it('should generate a coordinate within the given radius', () => {
148
- const radius = 1000; // 1km
149
- const result = faker.coordinates.within(center, radius);
150
-
151
- expect(result).toHaveProperty('lat');
152
- expect(result).toHaveProperty('lng');
153
- expect(typeof result.lat).toBe('number');
154
- expect(typeof result.lng).toBe('number');
155
-
156
- // Calculate distance using Haversine formula
157
- const R = 6378137; // Earth's radius in meters
158
- const dLat = ((result.lat - center.lat) * Math.PI) / 180;
159
- const dLng = ((result.lng - center.lng) * Math.PI) / 180;
160
- const a =
161
- Math.sin(dLat / 2) * Math.sin(dLat / 2) +
162
- Math.cos((center.lat * Math.PI) / 180) *
163
- Math.cos((result.lat * Math.PI) / 180) *
164
- Math.sin(dLng / 2) *
165
- Math.sin(dLng / 2);
166
- const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
167
- const distance = R * c;
168
-
169
- expect(distance).toBeLessThanOrEqual(radius);
170
- });
171
-
172
- it('should generate different coordinates on multiple calls', () => {
173
- const radius = 1000;
174
- const results = Array.from({ length: 10 }, () =>
175
- faker.coordinates.within(center, radius),
176
- );
177
-
178
- // Not all results should be identical
179
- const uniqueLats = new Set(results.map((r) => r.lat));
180
- expect(uniqueLats.size).toBeGreaterThan(1);
181
- });
182
- });
183
-
184
- describe('outside', () => {
185
- it('should generate a coordinate outside the minimum radius', () => {
186
- const minRadius = 1000; // 1km
187
- const maxRadius = 5000; // 5km
188
- const result = faker.coordinates.outside(center, minRadius, maxRadius);
189
-
190
- expect(result).toHaveProperty('lat');
191
- expect(result).toHaveProperty('lng');
192
- expect(typeof result.lat).toBe('number');
193
- expect(typeof result.lng).toBe('number');
194
-
195
- // Calculate distance using Haversine formula
196
- const R = 6378137;
197
- const dLat = ((result.lat - center.lat) * Math.PI) / 180;
198
- const dLng = ((result.lng - center.lng) * Math.PI) / 180;
199
- const a =
200
- Math.sin(dLat / 2) * Math.sin(dLat / 2) +
201
- Math.cos((center.lat * Math.PI) / 180) *
202
- Math.cos((result.lat * Math.PI) / 180) *
203
- Math.sin(dLng / 2) *
204
- Math.sin(dLng / 2);
205
- const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
206
- const distance = R * c;
207
-
208
- expect(distance).toBeGreaterThanOrEqual(minRadius);
209
- expect(distance).toBeLessThanOrEqual(maxRadius);
210
- });
211
-
212
- it('should generate different coordinates on multiple calls', () => {
213
- const results = Array.from({ length: 10 }, () =>
214
- faker.coordinates.outside(center, 1000, 5000),
215
- );
216
-
217
- const uniqueLats = new Set(results.map((r) => r.lat));
218
- expect(uniqueLats.size).toBeGreaterThan(1);
219
- });
220
-
221
- it('should normalize longitude to valid range', () => {
222
- // Use a center near the antimeridian
223
- const pacificCenter = { lat: 0, lng: 179 };
224
- const result = faker.coordinates.outside(pacificCenter, 100000, 500000);
225
-
226
- expect(result.lng).toBeGreaterThanOrEqual(-180);
227
- expect(result.lng).toBeLessThanOrEqual(180);
228
- });
229
- });
230
- });
231
- });