kv.test.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. window.kvTests = [
  2. testSetKeyWithValue = async function() {
  3. try {
  4. const result = await puter.kv.set('testKey', 'testValue');
  5. assert(result === true, "Failed to set key with value");
  6. pass("testSetKeyWithValue passed");
  7. } catch (error) {
  8. fail("testSetKeyWithValue failed:", error);
  9. }
  10. },
  11. testUpdateKey = async function() {
  12. try {
  13. await puter.kv.set('updateKey', 'initialValue');
  14. const result = await puter.kv.set('updateKey', 'updatedValue');
  15. assert(result === true, "Failed to update existing key");
  16. pass("testUpdateKey passed");
  17. } catch (error) {
  18. fail("testUpdateKey failed:", error);
  19. }
  20. },
  21. testKeySizeLimit = async function() {
  22. try {
  23. const largeKey = 'a'.repeat(1025); // 1 KB + 1 byte
  24. await puter.kv.set(largeKey, 'value');
  25. fail("testKeySizeLimit failed: No error thrown for large key");
  26. } catch (error) {
  27. pass("testKeySizeLimit passed:", error.message);
  28. }
  29. },
  30. testInvalidParameters = async function() {
  31. try {
  32. await puter.kv.set(undefined, 'value');
  33. fail("testInvalidParameters failed: No error thrown for undefined key");
  34. } catch (error) {
  35. pass("testInvalidParameters passed:", error.message);
  36. }
  37. },
  38. // testEmptyKey should fail
  39. testEmptyKey = async function() {
  40. try {
  41. await puter.kv.set('', 'value');
  42. fail("testEmptyKey failed: No error thrown for empty key");
  43. } catch (error) {
  44. pass("testEmptyKey passed:", error.message);
  45. }
  46. },
  47. testSetNullValue = async function() {
  48. try {
  49. const result = await puter.kv.set('nullValueKey', null);
  50. assert(result === true, "Failed to set null value");
  51. pass("testSetNullValue passed");
  52. } catch (error) {
  53. fail("testSetNullValue failed:", error);
  54. }
  55. },
  56. testSetObjectValue = async function() {
  57. try {
  58. const result = await puter.kv.set('objectKey', { a: 1 });
  59. assert(result === true, "Failed to set object as value");
  60. pass("testSetObjectValue passed");
  61. } catch (error) {
  62. fail("testSetObjectValue failed:", error);
  63. }
  64. },
  65. testSetKeyWithSpecialCharacters = async function() {
  66. try {
  67. const result = await puter.kv.set('special@Key#', 'value');
  68. assert(result === true, "Failed to set key with special characters");
  69. pass("testSetKeyWithSpecialCharacters passed");
  70. } catch (error) {
  71. fail("testSetKeyWithSpecialCharacters failed:", error);
  72. }
  73. },
  74. testSetLargeValue = async function() {
  75. try {
  76. const largeValue = 'a'.repeat(10000); // 10 KB
  77. const result = await puter.kv.set('largeValueKey', largeValue);
  78. assert(result === true, "Failed to set large value");
  79. pass("testSetLargeValue passed");
  80. } catch (error) {
  81. fail("testSetLargeValue failed:", error);
  82. }
  83. },
  84. testSetBooleanValue = async function() {
  85. try {
  86. const result = await puter.kv.set('booleanKey', true);
  87. assert(result === true, "Failed to set boolean value");
  88. pass("testSetBooleanValue passed");
  89. } catch (error) {
  90. fail("testSetBooleanValue failed:", error);
  91. }
  92. },
  93. testSetNumericKey = async function() {
  94. try {
  95. const result = await puter.kv.set(123, 'value');
  96. assert(result === true, "Failed to set numeric key");
  97. pass("testSetNumericKey passed");
  98. } catch (error) {
  99. fail("testSetNumericKey failed:", error);
  100. }
  101. },
  102. testSetConcurrentKeys = async function() {
  103. try {
  104. const promises = [puter.kv.set('key1', 'value1'), puter.kv.set('key2', 'value2')];
  105. const results = await Promise.all(promises);
  106. assert(results.every(result => result === true), "Failed to set concurrent keys");
  107. pass("testSetConcurrentKeys passed");
  108. } catch (error) {
  109. fail("testSetConcurrentKeys failed:", error);
  110. }
  111. },
  112. testSetValueAndRetrieve = async function() {
  113. try {
  114. await puter.kv.set('retrieveKey', 'testValue');
  115. const value = await puter.kv.get('retrieveKey');
  116. assert(value === 'testValue', "Failed to retrieve correct value");
  117. pass("testSetValueAndRetrieve passed");
  118. } catch (error) {
  119. fail("testSetValueAndRetrieve failed:", error);
  120. }
  121. },
  122. testUpdateValueAndRetrieve = async function() {
  123. try {
  124. await puter.kv.set('updateKey', 'initialValue');
  125. await puter.kv.set('updateKey', 'updatedValue');
  126. const value = await puter.kv.get('updateKey');
  127. assert(value === 'updatedValue', "Failed to retrieve updated value");
  128. pass("testUpdateValueAndRetrieve passed");
  129. } catch (error) {
  130. fail("testUpdateValueAndRetrieve failed:", error);
  131. }
  132. },
  133. testSetNumericValueAndRetrieve = async function() {
  134. try {
  135. await puter.kv.set('numericKey', 123);
  136. const value = await puter.kv.get('numericKey');
  137. assert(value === 123, "Failed to retrieve numeric value");
  138. pass("testSetNumericValueAndRetrieve passed");
  139. } catch (error) {
  140. fail("testSetNumericValueAndRetrieve failed:", error);
  141. }
  142. },
  143. testSetBooleanValueAndRetrieve = async function() {
  144. try {
  145. await puter.kv.set('booleanKey', true);
  146. const value = await puter.kv.get('booleanKey');
  147. assert(value === true, "Failed to retrieve boolean value");
  148. pass("testSetBooleanValueAndRetrieve passed");
  149. } catch (error) {
  150. fail("testSetBooleanValueAndRetrieve failed:", error);
  151. }
  152. },
  153. testSetAndDeleteKey = async function() {
  154. try {
  155. await puter.kv.set('deleteKey', 'value');
  156. const result = await puter.kv.del('deleteKey');
  157. assert(result === true, "Failed to delete key");
  158. pass("testSetAndDeleteKey passed");
  159. } catch (error) {
  160. fail("testSetAndDeleteKey failed:", error);
  161. }
  162. },
  163. // if key does not exist, get() should return null
  164. testGetNonexistentKey = async function() {
  165. try {
  166. const value = await puter.kv.get('nonexistentKey_102mk');
  167. assert(value === null, "Failed to return `null` for nonexistent key");
  168. pass("testGetNonexistentKey passed");
  169. } catch (error) {
  170. fail("testGetNonexistentKey failed:", error);
  171. }
  172. },
  173. // string key and object value
  174. testSetObjectValue = async function() {
  175. try {
  176. const result = await puter.kv.set('objectKey', { a: 1 });
  177. assert(result === true, "Failed to set object as value");
  178. const value = await puter.kv.get('objectKey');
  179. assert(value.a === 1, "Failed to retrieve object value");
  180. pass("testSetObjectValue passed");
  181. } catch (error) {
  182. fail("testSetObjectValue failed:", error);
  183. }
  184. },
  185. // string key and array value
  186. testSetArrayValue = async function() {
  187. try {
  188. const result = await puter.kv.set('arrayKey', [1, 2, 3]);
  189. assert(result === true, "Failed to set array as value");
  190. const value = await puter.kv.get('arrayKey');
  191. assert(value[0] === 1, "Failed to retrieve array value");
  192. pass("testSetArrayValue passed");
  193. } catch (error) {
  194. fail("testSetArrayValue failed:", error);
  195. }
  196. },
  197. testSetKeyWithSpecialCharactersAndRetrieve = async function() {
  198. try {
  199. await puter.kv.set('special@Key#', 'value');
  200. const value = await puter.kv.get('special@Key#');
  201. assert(value === 'value', "Failed to retrieve value for key with special characters");
  202. pass("testSetKeyWithSpecialCharactersAndRetrieve passed");
  203. } catch (error) {
  204. fail("testSetKeyWithSpecialCharactersAndRetrieve failed:", error);
  205. }
  206. },
  207. testConcurrentSetOperations = async function() {
  208. try {
  209. const promises = [puter.kv.set('key1', 'value1'), puter.kv.set('key2', 'value2')];
  210. const results = await Promise.all(promises);
  211. assert(results.every(result => result === true), "Failed to set concurrent keys");
  212. pass("testConcurrentSetOperations passed");
  213. } catch (error) {
  214. fail("testConcurrentSetOperations failed:", error);
  215. }
  216. },
  217. //test flush: create a bunch of keys, flush, then check if they exist
  218. testFlush = async function() {
  219. try {
  220. const keys = [];
  221. for(let i = 0; i < 10; i++){
  222. keys.push('key' + i);
  223. }
  224. await Promise.all(keys.map(key => puter.kv.set(key, 'value')));
  225. await puter.kv.flush();
  226. const results = await Promise.all(keys.map(key => puter.kv.get(key)));
  227. assert(results.every(result => result === null), "Failed to flush keys");
  228. pass("testFlush passed");
  229. } catch (error) {
  230. fail("testFlush failed:", error);
  231. }
  232. },
  233. // incr
  234. testIncr = async function() {
  235. try {
  236. const result = await puter.kv.incr('incrKey');
  237. assert(result === 1, "Failed to increment key");
  238. pass("testIncr passed");
  239. } catch (error) {
  240. fail("testIncr failed:", error);
  241. }
  242. },
  243. // decr
  244. testDecr = async function() {
  245. try {
  246. const result = await puter.kv.decr('decrKey');
  247. assert(result === -1, "Failed to decrement key");
  248. pass("testDecr passed");
  249. } catch (error) {
  250. fail("testDecr failed:", error);
  251. }
  252. },
  253. // incr existing key
  254. testIncrExistingKey = async function() {
  255. try {
  256. await puter.kv.set('incrKey', 1);
  257. const result = await puter.kv.incr('incrKey');
  258. assert(result === 2, "Failed to increment existing key");
  259. pass("testIncrExistingKey passed");
  260. } catch (error) {
  261. fail("testIncrExistingKey failed:", error);
  262. }
  263. },
  264. // decr existing key
  265. testIncrExistingKey = async function() {
  266. try {
  267. await puter.kv.set('decrKey', 2);
  268. const result = await puter.kv.decr('decrKey');
  269. assert(result === 1, "Failed to decrement existing key");
  270. pass("testDecrExistingKey passed");
  271. } catch (error) {
  272. fail("testDecrExistingKey failed:", error);
  273. }
  274. },
  275. // incr by amount
  276. testIncrByAmount = async function() {
  277. try {
  278. await puter.kv.set('incrKey', 1);
  279. const result = await puter.kv.incr('incrKey', 5);
  280. assert(result === 6, "Failed to increment key by amount");
  281. pass("testIncrByAmount passed");
  282. } catch (error) {
  283. fail("testIncrByAmount failed:", error);
  284. }
  285. },
  286. // decr by amount
  287. testDecrByAmount = async function() {
  288. try {
  289. await puter.kv.set('decrKey', 10);
  290. const result = await puter.kv.decr('decrKey', 5);
  291. assert(result === 5, "Failed to decrement key by amount");
  292. pass("testDecrByAmount passed");
  293. } catch (error) {
  294. fail("testDecrByAmount failed:", error);
  295. }
  296. },
  297. // incr by amount existing key
  298. testIncrByAmountExistingKey = async function() {
  299. try {
  300. await puter.kv.set('incrKey', 1);
  301. const result = await puter.kv.incr('incrKey', 5);
  302. assert(result === 6, "Failed to increment existing key by amount");
  303. pass("testIncrByAmountExistingKey passed");
  304. } catch (error) {
  305. fail("testIncrByAmountExistingKey failed:", error);
  306. }
  307. },
  308. // decr by amount existing key
  309. testDecrByAmountExistingKey= async function() {
  310. try {
  311. await puter.kv.set('decrKey', 10);
  312. const result = await puter.kv.decr('decrKey', 5);
  313. assert(result === 5, "Failed to decrement existing key by amount");
  314. pass("testDecrByAmountExistingKey passed");
  315. } catch (error) {
  316. fail("testDecrByAmountExistingKey failed:", error);
  317. }
  318. },
  319. // incr by negative amount
  320. testIncrByNegativeAmount = async function() {
  321. try {
  322. await puter.kv.set('incrKey', 1);
  323. const result = await puter.kv.incr('incrKey', -5);
  324. assert(result === -4, "Failed to increment key by negative amount");
  325. pass("testIncrByNegativeAmount passed");
  326. } catch (error) {
  327. fail("testIncrByNegativeAmount failed:", error);
  328. }
  329. },
  330. // decr by negative amount
  331. testDecrByNegativeAmount = async function() {
  332. try {
  333. await puter.kv.set('decrKey', 10);
  334. const result = await puter.kv.decr('decrKey', -5);
  335. assert(result === 15, "Failed to decrement key by negative amount");
  336. pass("testDecrByNegativeAmount passed");
  337. } catch (error) {
  338. fail("testDecrByNegativeAmount failed:", error);
  339. }
  340. },
  341. // list keys
  342. testListKeys = async function() {
  343. try {
  344. const keys = [];
  345. // flush first
  346. await puter.kv.flush();
  347. // create 10 keys
  348. for(let i = 0; i < 10; i++){
  349. keys.push('key' + i);
  350. }
  351. // set all keys
  352. await Promise.all(keys.map(key => puter.kv.set(key, 'value')));
  353. // list keys
  354. const result = await puter.kv.list();
  355. assert(result.length === 10, "Failed to list keys");
  356. pass("testListKeys passed");
  357. } catch (error) {
  358. fail("testListKeys failed:", error);
  359. }
  360. },
  361. // list keys using glob
  362. testListKeysGlob = async function() {
  363. try {
  364. const keys = [];
  365. // flush first
  366. await puter.kv.flush();
  367. // create 10 keys
  368. for(let i = 0; i < 10; i++){
  369. keys.push('key' + i);
  370. }
  371. // set all keys
  372. await Promise.all(keys.map(key => puter.kv.set(key, 'value')));
  373. // list keys
  374. const result = await puter.kv.list('k*');
  375. assert(result.length === 10, "Failed to list keys using glob");
  376. pass("testListKeysGlob passed");
  377. } catch (error) {
  378. fail("testListKeysGlob failed:", error);
  379. }
  380. },
  381. ]