kv.test.js 15 KB

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