Add human-readable descriptions to Puter.js tests

This commit is contained in:
jelveh
2025-07-05 10:50:06 -07:00
parent 1fb1edd621
commit 779ee8d5d2
4 changed files with 1179 additions and 942 deletions
+32 -23
View File
@@ -83,9 +83,6 @@ const testChatWithMessageArrayCore = async function(model) {
// Check that content is present and not empty
assert(result.message.content.length > 0, "message content should not be empty");
// Check that index is 0 (first/only response)
assert(result.index === 0, "index should be 0 for single response");
};
// Function to generate test functions for a specific model
@@ -93,30 +90,42 @@ const generateTestsForModel = function(model) {
const modelName = model.replace(/[^a-zA-Z0-9]/g, '_'); // Sanitize model name for function names
return {
[`testChatBasicPrompt_${modelName}`]: async function() {
try {
await testChatBasicPromptCore(model);
pass(`testChatBasicPrompt_${modelName} passed`);
} catch (error) {
fail(`testChatBasicPrompt_${modelName} failed:`, error);
[`testChatBasicPrompt_${modelName}`]: {
name: `testChatBasicPrompt_${modelName}`,
description: `Test basic AI chat prompt with ${model} model and verify response structure`,
test: async function() {
try {
await testChatBasicPromptCore(model);
pass(`testChatBasicPrompt_${modelName} passed`);
} catch (error) {
fail(`testChatBasicPrompt_${modelName} failed:`, error);
}
}
},
[`testChatWithParameters_${modelName}`]: async function() {
try {
await testChatWithParametersCore(model);
pass(`testChatWithParameters_${modelName} passed`);
} catch (error) {
fail(`testChatWithParameters_${modelName} failed:`, error);
[`testChatWithParameters_${modelName}`]: {
name: `testChatWithParameters_${modelName}`,
description: `Test AI chat with parameters (temperature, max_tokens) using ${model} model`,
test: async function() {
try {
await testChatWithParametersCore(model);
pass(`testChatWithParameters_${modelName} passed`);
} catch (error) {
fail(`testChatWithParameters_${modelName} failed:`, error);
}
}
},
[`testChatWithMessageArray_${modelName}`]: async function() {
try {
await testChatWithMessageArrayCore(model);
pass(`testChatWithMessageArray_${modelName} passed`);
} catch (error) {
fail(`testChatWithMessageArray_${modelName} failed:`, error);
[`testChatWithMessageArray_${modelName}`]: {
name: `testChatWithMessageArray_${modelName}`,
description: `Test AI chat with message array format using ${model} model`,
test: async function() {
try {
await testChatWithMessageArrayCore(model);
pass(`testChatWithMessageArray_${modelName} passed`);
} catch (error) {
fail(`testChatWithMessageArray_${modelName} failed:`, error);
}
}
},
};
@@ -128,8 +137,8 @@ const generateAllTests = function() {
TEST_MODELS.forEach(model => {
const modelTests = generateTestsForModel(model);
Object.values(modelTests).forEach(testFunc => {
allTests.push(testFunc);
Object.values(modelTests).forEach(test => {
allTests.push(test);
});
});
File diff suppressed because it is too large Load Diff
+493 -406
View File
@@ -1,419 +1,506 @@
/* eslint-disable */
// TODO: Make these more compatible with eslint
window.kvTests = [
testSetKeyWithValue = async function() {
try {
const result = await puter.kv.set('testKey', 'testValue');
assert(result === true, "Failed to set key with value");
pass("testSetKeyWithValue passed");
} catch (error) {
fail("testSetKeyWithValue failed:", error);
}
},
testUpdateKey = async function() {
try {
await puter.kv.set('updateKey', 'initialValue');
const result = await puter.kv.set('updateKey', 'updatedValue');
assert(result === true, "Failed to update existing key");
pass("testUpdateKey passed");
} catch (error) {
fail("testUpdateKey failed:", error);
}
},
testKeySizeLimit = async function() {
try {
const largeKey = 'a'.repeat(1025); // 1 KB + 1 byte
await puter.kv.set(largeKey, 'value');
fail("testKeySizeLimit failed: No error thrown for large key");
} catch (error) {
pass("testKeySizeLimit passed:", error.message);
}
},
testInvalidParameters = async function() {
try {
await puter.kv.set(undefined, 'value');
fail("testInvalidParameters failed: No error thrown for undefined key");
} catch (error) {
pass("testInvalidParameters passed:", error.message);
}
},
// testEmptyKey should fail
testEmptyKey = async function() {
try {
await puter.kv.set('', 'value');
fail("testEmptyKey failed: No error thrown for empty key");
} catch (error) {
pass("testEmptyKey passed:", error.message);
}
},
testSetNullValue = async function() {
try {
const result = await puter.kv.set('nullValueKey', null);
assert(result === true, "Failed to set null value");
pass("testSetNullValue passed");
} catch (error) {
fail("testSetNullValue failed:", error);
}
},
testSetObjectValue = async function() {
try {
const result = await puter.kv.set('objectKey', { a: 1 });
assert(result === true, "Failed to set object as value");
pass("testSetObjectValue passed");
} catch (error) {
fail("testSetObjectValue failed:", error);
}
},
testSetKeyWithSpecialCharacters = async function() {
try {
const result = await puter.kv.set('special@Key#', 'value');
assert(result === true, "Failed to set key with special characters");
pass("testSetKeyWithSpecialCharacters passed");
} catch (error) {
fail("testSetKeyWithSpecialCharacters failed:", error);
}
},
testSetLargeValue = async function() {
try {
const largeValue = 'a'.repeat(10000); // 10 KB
const result = await puter.kv.set('largeValueKey', largeValue);
assert(result === true, "Failed to set large value");
pass("testSetLargeValue passed");
} catch (error) {
fail("testSetLargeValue failed:", error);
}
},
testSetBooleanValue = async function() {
try {
const result = await puter.kv.set('booleanKey', true);
assert(result === true, "Failed to set boolean value");
pass("testSetBooleanValue passed");
} catch (error) {
fail("testSetBooleanValue failed:", error);
}
},
testSetNumericKey = async function() {
try {
const result = await puter.kv.set(123, 'value');
assert(result === true, "Failed to set numeric key");
pass("testSetNumericKey passed");
} catch (error) {
fail("testSetNumericKey failed:", error);
}
},
testSetConcurrentKeys = async function() {
try {
const promises = [puter.kv.set('key1', 'value1'), puter.kv.set('key2', 'value2')];
const results = await Promise.all(promises);
assert(results.every(result => result === true), "Failed to set concurrent keys");
pass("testSetConcurrentKeys passed");
} catch (error) {
fail("testSetConcurrentKeys failed:", error);
}
},
testSetValueAndRetrieve = async function() {
try {
await puter.kv.set('retrieveKey', 'testValue');
const value = await puter.kv.get('retrieveKey');
assert(value === 'testValue', "Failed to retrieve correct value");
pass("testSetValueAndRetrieve passed");
} catch (error) {
fail("testSetValueAndRetrieve failed:", error);
}
},
testUpdateValueAndRetrieve = async function() {
try {
await puter.kv.set('updateKey', 'initialValue');
await puter.kv.set('updateKey', 'updatedValue');
const value = await puter.kv.get('updateKey');
assert(value === 'updatedValue', "Failed to retrieve updated value");
pass("testUpdateValueAndRetrieve passed");
} catch (error) {
fail("testUpdateValueAndRetrieve failed:", error);
}
},
testSetNumericValueAndRetrieve = async function() {
try {
await puter.kv.set('numericKey', 123);
const value = await puter.kv.get('numericKey');
assert(value === 123, "Failed to retrieve numeric value");
pass("testSetNumericValueAndRetrieve passed");
} catch (error) {
fail("testSetNumericValueAndRetrieve failed:", error);
}
},
testSetBooleanValueAndRetrieve = async function() {
try {
await puter.kv.set('booleanKey', true);
const value = await puter.kv.get('booleanKey');
assert(value === true, "Failed to retrieve boolean value");
pass("testSetBooleanValueAndRetrieve passed");
} catch (error) {
fail("testSetBooleanValueAndRetrieve failed:", error);
}
},
testSetAndDeleteKey = async function() {
try {
await puter.kv.set('deleteKey', 'value');
const result = await puter.kv.del('deleteKey');
assert(result === true, "Failed to delete key");
pass("testSetAndDeleteKey passed");
} catch (error) {
fail("testSetAndDeleteKey failed:", error);
}
},
// if key does not exist, get() should return null
testGetNonexistentKey = async function() {
try {
const value = await puter.kv.get('nonexistentKey_102mk');
assert(value === null, "Failed to return `null` for nonexistent key");
pass("testGetNonexistentKey passed");
} catch (error) {
fail("testGetNonexistentKey failed:", error);
}
},
// string key and object value
testSetObjectValue = async function() {
try {
const result = await puter.kv.set('objectKey', { a: 1 });
assert(result === true, "Failed to set object as value");
const value = await puter.kv.get('objectKey');
assert(value.a === 1, "Failed to retrieve object value");
pass("testSetObjectValue passed");
} catch (error) {
fail("testSetObjectValue failed:", error);
}
},
// string key and array value
testSetArrayValue = async function() {
try {
const result = await puter.kv.set('arrayKey', [1, 2, 3]);
assert(result === true, "Failed to set array as value");
const value = await puter.kv.get('arrayKey');
assert(value[0] === 1, "Failed to retrieve array value");
pass("testSetArrayValue passed");
} catch (error) {
fail("testSetArrayValue failed:", error);
}
},
testSetKeyWithSpecialCharactersAndRetrieve = async function() {
try {
await puter.kv.set('special@Key#', 'value');
const value = await puter.kv.get('special@Key#');
assert(value === 'value', "Failed to retrieve value for key with special characters");
pass("testSetKeyWithSpecialCharactersAndRetrieve passed");
} catch (error) {
fail("testSetKeyWithSpecialCharactersAndRetrieve failed:", error);
}
},
testConcurrentSetOperations = async function() {
try {
const promises = [puter.kv.set('key1', 'value1'), puter.kv.set('key2', 'value2')];
const results = await Promise.all(promises);
assert(results.every(result => result === true), "Failed to set concurrent keys");
pass("testConcurrentSetOperations passed");
} catch (error) {
fail("testConcurrentSetOperations failed:", error);
}
},
//test flush: create a bunch of keys, flush, then check if they exist
testFlush = async function() {
try {
const keys = [];
for(let i = 0; i < 10; i++){
keys.push('key' + i);
{
name: "testSetKeyWithValue",
description: "Test setting a key-value pair and verify it returns true",
test: async function() {
try {
const result = await puter.kv.set('testKey', 'testValue');
assert(result === true, "Failed to set key with value");
pass("testSetKeyWithValue passed");
} catch (error) {
fail("testSetKeyWithValue failed:", error);
}
await Promise.all(keys.map(key => puter.kv.set(key, 'value')));
await puter.kv.flush();
const results = await Promise.all(keys.map(key => puter.kv.get(key)));
assert(results.every(result => result === null), "Failed to flush keys");
pass("testFlush passed");
} catch (error) {
fail("testFlush failed:", error);
}
},
// incr
testIncr = async function() {
try {
const result = await puter.kv.incr(puter.randName());
assert(result === 1, "Failed to increment key");
pass("testIncr passed");
} catch (error) {
fail("testIncr failed:", error);
}
},
// decr
testDecr = async function() {
try {
const result = await puter.kv.decr(puter.randName());
assert(result === -1, "Failed to decrement key");
pass("testDecr passed");
} catch (error) {
fail("testDecr failed:", error);
}
},
// incr existing key
testIncrExistingKey = async function() {
try {
await puter.kv.set('incrKey', 1);
const result = await puter.kv.incr('incrKey');
assert(result === 2, "Failed to increment existing key");
pass("testIncrExistingKey passed");
} catch (error) {
fail("testIncrExistingKey failed:", error);
}
},
// decr existing key
testIncrExistingKey = async function() {
try {
await puter.kv.set('decrKey', 2);
const result = await puter.kv.decr('decrKey');
assert(result === 1, "Failed to decrement existing key");
pass("testDecrExistingKey passed");
} catch (error) {
fail("testDecrExistingKey failed:", error);
}
},
// incr by amount
testIncrByAmount = async function() {
try {
await puter.kv.set('incrKey', 1);
const result = await puter.kv.incr('incrKey', 5);
assert(result === 6, "Failed to increment key by amount");
pass("testIncrByAmount passed");
} catch (error) {
fail("testIncrByAmount failed:", error);
}
},
// decr by amount
testDecrByAmount = async function() {
try {
await puter.kv.set('decrKey', 10);
const result = await puter.kv.decr('decrKey', 5);
assert(result === 5, "Failed to decrement key by amount");
pass("testDecrByAmount passed");
} catch (error) {
fail("testDecrByAmount failed:", error);
}
},
// incr by amount existing key
testIncrByAmountExistingKey = async function() {
try {
await puter.kv.set('incrKey', 1);
const result = await puter.kv.incr('incrKey', 5);
assert(result === 6, "Failed to increment existing key by amount");
pass("testIncrByAmountExistingKey passed");
} catch (error) {
fail("testIncrByAmountExistingKey failed:", error);
}
},
// decr by amount existing key
testDecrByAmountExistingKey= async function() {
try {
await puter.kv.set('decrKey', 10);
const result = await puter.kv.decr('decrKey', 5);
assert(result === 5, "Failed to decrement existing key by amount");
pass("testDecrByAmountExistingKey passed");
} catch (error) {
fail("testDecrByAmountExistingKey failed:", error);
}
},
// incr by negative amount
testIncrByNegativeAmount = async function() {
try {
await puter.kv.set('incrKey', 1);
const result = await puter.kv.incr('incrKey', -5);
assert(result === -4, "Failed to increment key by negative amount");
pass("testIncrByNegativeAmount passed");
} catch (error) {
fail("testIncrByNegativeAmount failed:", error);
}
},
// decr by negative amount
testDecrByNegativeAmount = async function() {
try {
await puter.kv.set('decrKey', 10);
const result = await puter.kv.decr('decrKey', -5);
assert(result === 15, "Failed to decrement key by negative amount");
pass("testDecrByNegativeAmount passed");
} catch (error) {
fail("testDecrByNegativeAmount failed:", error);
}
},
// list keys
testListKeys = async function() {
try {
const keys = [];
// flush first
await puter.kv.flush();
// create 10 keys
for(let i = 0; i < 10; i++){
keys.push('key' + i);
{
name: "testUpdateKey",
description: "Test updating an existing key with a new value and verify it returns true",
test: async function() {
try {
await puter.kv.set('updateKey', 'initialValue');
const result = await puter.kv.set('updateKey', 'updatedValue');
assert(result === true, "Failed to update existing key");
pass("testUpdateKey passed");
} catch (error) {
fail("testUpdateKey failed:", error);
}
// set all keys
await Promise.all(keys.map(key => puter.kv.set(key, 'value')));
// list keys
const result = await puter.kv.list();
assert(result.length === 10, "Failed to list keys");
pass("testListKeys passed");
} catch (error) {
fail("testListKeys failed:", error);
}
},
// list keys using glob
testListKeysGlob = async function() {
try {
const keys = [];
// flush first
await puter.kv.flush();
// create 10 keys
for(let i = 0; i < 10; i++){
keys.push('key' + i);
{
name: "testKeySizeLimit",
description: "Test setting a key that exceeds the size limit and verify it throws an error",
test: async function() {
try {
const largeKey = 'a'.repeat(1025); // 1 KB + 1 byte
await puter.kv.set(largeKey, 'value');
fail("testKeySizeLimit failed: No error thrown for large key");
} catch (error) {
pass("testKeySizeLimit passed:", error.message);
}
}
},
{
name: "testInvalidParameters",
description: "Test setting a key with invalid parameters and verify it throws an error",
test: async function() {
try {
await puter.kv.set(undefined, 'value');
fail("testInvalidParameters failed: No error thrown for undefined key");
} catch (error) {
pass("testInvalidParameters passed:", error.message);
}
}
},
{
name: "testEmptyKey",
description: "Test setting an empty key and verify it throws an error",
test: async function() {
try {
await puter.kv.set('', 'value');
fail("testEmptyKey failed: No error thrown for empty key");
} catch (error) {
pass("testEmptyKey passed:", error.message);
}
}
},
{
name: "testSetNullValue",
description: "Test setting a null value and verify it returns true",
test: async function() {
try {
const result = await puter.kv.set('nullValueKey', null);
assert(result === true, "Failed to set null value");
pass("testSetNullValue passed");
} catch (error) {
fail("testSetNullValue failed:", error);
}
}
},
{
name: "testSetObjectValue",
description: "Test setting an object as a value and verify it returns true",
test: async function() {
try {
const result = await puter.kv.set('objectKey', { a: 1 });
assert(result === true, "Failed to set object as value");
pass("testSetObjectValue passed");
} catch (error) {
fail("testSetObjectValue failed:", error);
}
}
},
{
name: "testSetKeyWithSpecialCharacters",
description: "Test setting a key with special characters and verify it returns true",
test: async function() {
try {
const result = await puter.kv.set('special@Key#', 'value');
assert(result === true, "Failed to set key with special characters");
pass("testSetKeyWithSpecialCharacters passed");
} catch (error) {
fail("testSetKeyWithSpecialCharacters failed:", error);
}
}
},
{
name: "testSetLargeValue",
description: "Test setting a large value and verify it returns true",
test: async function() {
try {
const largeValue = 'a'.repeat(10000); // 10 KB
const result = await puter.kv.set('largeValueKey', largeValue);
assert(result === true, "Failed to set large value");
pass("testSetLargeValue passed");
} catch (error) {
fail("testSetLargeValue failed:", error);
}
}
},
{
name: "testSetBooleanValue",
description: "Test setting a boolean value and verify it returns true",
test: async function() {
try {
const result = await puter.kv.set('booleanKey', true);
assert(result === true, "Failed to set boolean value");
pass("testSetBooleanValue passed");
} catch (error) {
fail("testSetBooleanValue failed:", error);
}
}
},
{
name: "testSetNumericKey",
description: "Test setting a numeric key and verify it returns true",
test: async function() {
try {
const result = await puter.kv.set(123, 'value');
assert(result === true, "Failed to set numeric key");
pass("testSetNumericKey passed");
} catch (error) {
fail("testSetNumericKey failed:", error);
}
}
},
{
name: "testSetConcurrentKeys",
description: "Test setting multiple keys concurrently and verify all return true",
test: async function() {
try {
const promises = [puter.kv.set('key1', 'value1'), puter.kv.set('key2', 'value2')];
const results = await Promise.all(promises);
assert(results.every(result => result === true), "Failed to set concurrent keys");
pass("testSetConcurrentKeys passed");
} catch (error) {
fail("testSetConcurrentKeys failed:", error);
}
}
},
{
name: "testSetValueAndRetrieve",
description: "Test setting a value and then retrieving it to verify it matches",
test: async function() {
try {
await puter.kv.set('retrieveKey', 'testValue');
const value = await puter.kv.get('retrieveKey');
assert(value === 'testValue', "Failed to retrieve correct value");
pass("testSetValueAndRetrieve passed");
} catch (error) {
fail("testSetValueAndRetrieve failed:", error);
}
}
},
{
name: "testUpdateValueAndRetrieve",
description: "Test updating a value and then retrieving it to verify it matches the updated value",
test: async function() {
try {
await puter.kv.set('updateKey', 'initialValue');
await puter.kv.set('updateKey', 'updatedValue');
const value = await puter.kv.get('updateKey');
assert(value === 'updatedValue', "Failed to retrieve updated value");
pass("testUpdateValueAndRetrieve passed");
} catch (error) {
fail("testUpdateValueAndRetrieve failed:", error);
}
}
},
{
name: "testSetNumericValueAndRetrieve",
description: "Test setting a numeric value and then retrieving it to verify it matches",
test: async function() {
try {
await puter.kv.set('numericKey', 123);
const value = await puter.kv.get('numericKey');
assert(value === 123, "Failed to retrieve numeric value");
pass("testSetNumericValueAndRetrieve passed");
} catch (error) {
fail("testSetNumericValueAndRetrieve failed:", error);
}
}
},
{
name: "testSetBooleanValueAndRetrieve",
description: "Test setting a boolean value and then retrieving it to verify it matches",
test: async function() {
try {
await puter.kv.set('booleanKey', true);
const value = await puter.kv.get('booleanKey');
assert(value === true, "Failed to retrieve boolean value");
pass("testSetBooleanValueAndRetrieve passed");
} catch (error) {
fail("testSetBooleanValueAndRetrieve failed:", error);
}
}
},
{
name: "testSetAndDeleteKey",
description: "Test setting a key and then deleting it to verify it returns true",
test: async function() {
try {
await puter.kv.set('deleteKey', 'value');
const result = await puter.kv.del('deleteKey');
assert(result === true, "Failed to delete key");
pass("testSetAndDeleteKey passed");
} catch (error) {
fail("testSetAndDeleteKey failed:", error);
}
}
},
{
name: "testGetNonexistentKey",
description: "Test getting a non-existent key and verify it returns null",
test: async function() {
try {
const value = await puter.kv.get('nonexistentKey_102mk');
assert(value === null, "Failed to return `null` for nonexistent key");
pass("testGetNonexistentKey passed");
} catch (error) {
fail("testGetNonexistentKey failed:", error);
}
}
},
{
name: "testSetObjectValueAndRetrieve",
description: "Test setting an object value and then retrieving it to verify it matches",
test: async function() {
try {
const result = await puter.kv.set('objectKey', { a: 1 });
assert(result === true, "Failed to set object as value");
const value = await puter.kv.get('objectKey');
assert(value.a === 1, "Failed to retrieve object value");
pass("testSetObjectValueAndRetrieve passed");
} catch (error) {
fail("testSetObjectValueAndRetrieve failed:", error);
}
}
},
{
name: "testSetArrayValue",
description: "Test setting an array as a value and verify it returns true",
test: async function() {
try {
const result = await puter.kv.set('arrayKey', [1, 2, 3]);
assert(result === true, "Failed to set array as value");
const value = await puter.kv.get('arrayKey');
assert(value[0] === 1, "Failed to retrieve array value");
pass("testSetArrayValue passed");
} catch (error) {
fail("testSetArrayValue failed:", error);
}
}
},
{
name: "testSetKeyWithSpecialCharactersAndRetrieve",
description: "Test setting a key with special characters and then retrieving it to verify it matches",
test: async function() {
try {
await puter.kv.set('special@Key#', 'value');
const value = await puter.kv.get('special@Key#');
assert(value === 'value', "Failed to retrieve value for key with special characters");
pass("testSetKeyWithSpecialCharactersAndRetrieve passed");
} catch (error) {
fail("testSetKeyWithSpecialCharactersAndRetrieve failed:", error);
}
}
},
{
name: "testConcurrentSetOperations",
description: "Test setting multiple keys concurrently and verify all return true",
test: async function() {
try {
const promises = [puter.kv.set('key1', 'value1'), puter.kv.set('key2', 'value2')];
const results = await Promise.all(promises);
assert(results.every(result => result === true), "Failed to set concurrent keys");
pass("testConcurrentSetOperations passed");
} catch (error) {
fail("testConcurrentSetOperations failed:", error);
}
}
},
{
name: "testFlush",
description: "Test flushing a bunch of keys and verify they no longer exist",
test: async function() {
try {
const keys = [];
for(let i = 0; i < 10; i++){
keys.push('key' + i);
}
await Promise.all(keys.map(key => puter.kv.set(key, 'value')));
await puter.kv.flush();
const results = await Promise.all(keys.map(key => puter.kv.get(key)));
assert(results.every(result => result === null), "Failed to flush keys");
pass("testFlush passed");
} catch (error) {
fail("testFlush failed:", error);
}
}
},
{
name: "testIncr",
description: "Test incrementing a key and verify it returns 1",
test: async function() {
try {
const result = await puter.kv.incr(puter.randName());
assert(result === 1, "Failed to increment key");
pass("testIncr passed");
} catch (error) {
fail("testIncr failed:", error);
}
}
},
{
name: "testDecr",
description: "Test decrementing a key and verify it returns -1",
test: async function() {
try {
const result = await puter.kv.decr(puter.randName());
assert(result === -1, "Failed to decrement key");
pass("testDecr passed");
} catch (error) {
fail("testDecr failed:", error);
}
}
},
{
name: "testIncrExistingKey",
description: "Test incrementing an existing key and verify it returns 2",
test: async function() {
try {
await puter.kv.set('incrKey', 1);
const result = await puter.kv.incr('incrKey');
assert(result === 2, "Failed to increment existing key");
pass("testIncrExistingKey passed");
} catch (error) {
fail("testIncrExistingKey failed:", error);
}
}
},
{
name: "testDecrExistingKey",
description: "Test decrementing an existing key and verify it returns 1",
test: async function() {
try {
await puter.kv.set('decrKey', 2);
const result = await puter.kv.decr('decrKey');
assert(result === 1, "Failed to decrement existing key");
pass("testDecrExistingKey passed");
} catch (error) {
fail("testDecrExistingKey failed:", error);
}
}
},
{
name: "testIncrByAmount",
description: "Test incrementing a key by a specified amount and verify it returns the correct value",
test: async function() {
try {
await puter.kv.set('incrKey', 1);
const result = await puter.kv.incr('incrKey', 5);
assert(result === 6, "Failed to increment key by amount");
pass("testIncrByAmount passed");
} catch (error) {
fail("testIncrByAmount failed:", error);
}
}
},
{
name: "testDecrByAmount",
description: "Test decrementing a key by a specified amount and verify it returns the correct value",
test: async function() {
try {
await puter.kv.set('decrKey', 10);
const result = await puter.kv.decr('decrKey', 5);
assert(result === 5, "Failed to decrement key by amount");
pass("testDecrByAmount passed");
} catch (error) {
fail("testDecrByAmount failed:", error);
}
}
},
{
name: "testIncrByAmountExistingKey",
description: "Test incrementing an existing key by a specified amount and verify it returns the correct value",
test: async function() {
try {
await puter.kv.set('incrKey', 1);
const result = await puter.kv.incr('incrKey', 5);
assert(result === 6, "Failed to increment existing key by amount");
pass("testIncrByAmountExistingKey passed");
} catch (error) {
fail("testIncrByAmountExistingKey failed:", error);
}
}
},
{
name: "testDecrByAmountExistingKey",
description: "Test decrementing an existing key by a specified amount and verify it returns the correct value",
test: async function() {
try {
await puter.kv.set('decrKey', 10);
const result = await puter.kv.decr('decrKey', 5);
assert(result === 5, "Failed to decrement existing key by amount");
pass("testDecrByAmountExistingKey passed");
} catch (error) {
fail("testDecrByAmountExistingKey failed:", error);
}
}
},
{
name: "testIncrByNegativeAmount",
description: "Test incrementing a key by a negative amount and verify it returns the correct value",
test: async function() {
try {
await puter.kv.set('incrKey', 1);
const result = await puter.kv.incr('incrKey', -5);
assert(result === -4, "Failed to increment key by negative amount");
pass("testIncrByNegativeAmount passed");
} catch (error) {
fail("testIncrByNegativeAmount failed:", error);
}
}
},
{
name: "testDecrByNegativeAmount",
description: "Test decrementing a key by a negative amount and verify it returns the correct value",
test: async function() {
try {
await puter.kv.set('decrKey', 10);
const result = await puter.kv.decr('decrKey', -5);
assert(result === 15, "Failed to decrement key by negative amount");
pass("testDecrByNegativeAmount passed");
} catch (error) {
fail("testDecrByNegativeAmount failed:", error);
}
}
},
{
name: "testListKeys",
description: "Test listing all keys and verify the count is correct",
test: async function() {
try {
const keys = [];
// flush first
await puter.kv.flush();
// create 10 keys
for(let i = 0; i < 10; i++){
keys.push('key' + i);
}
// set all keys
await Promise.all(keys.map(key => puter.kv.set(key, 'value')));
// list keys
const result = await puter.kv.list();
assert(result.length === 10, "Failed to list keys");
pass("testListKeys passed");
} catch (error) {
fail("testListKeys failed:", error);
}
}
},
{
name: "testListKeysGlob",
description: "Test listing keys using a glob pattern and verify the count is correct",
test: async function() {
try {
const keys = [];
// flush first
await puter.kv.flush();
// create 10 keys
for(let i = 0; i < 10; i++){
keys.push('key' + i);
}
// set all keys
await Promise.all(keys.map(key => puter.kv.set(key, 'value')));
// list keys
const result = await puter.kv.list('k*');
assert(result.length === 10, "Failed to list keys using glob");
pass("testListKeysGlob passed");
} catch (error) {
fail("testListKeysGlob failed:", error);
}
// set all keys
await Promise.all(keys.map(key => puter.kv.set(key, 'value')));
// list keys
const result = await puter.kv.list('k*');
assert(result.length === 10, "Failed to list keys using glob");
pass("testListKeysGlob passed");
} catch (error) {
fail("testListKeysGlob failed:", error);
}
},
]
+65 -11
View File
@@ -50,10 +50,19 @@
}
.test-container label{
display: block;
margin-left: 5px;
}
.test-container input{
float: left;
}
.test-name {
color: #727272;
}
.test-description {
font-size: 12px;
color: #262626;
margin-top: 2px;
}
.test-run-button {
margin-left: 10px;
background-color: #4c84af;
@@ -109,13 +118,46 @@
throw err;
}
// Function to get test name and description
function getTestInfo(test) {
if (typeof test === 'function') {
return {
name: test.name,
description: test.description || 'No description provided'
};
} else if (typeof test === 'object' && test.name && test.test) {
return {
name: test.name,
description: test.description || 'No description provided'
};
}
return {
name: 'Unknown Test',
description: 'No description provided'
};
}
// Function to execute a test
async function executeTest(test) {
if (typeof test === 'function') {
return await test();
} else if (typeof test === 'object' && test.test) {
return await test.test();
}
throw new Error('Invalid test format');
}
// print the test name with checkbox for each test
$('#tests').append('<h2>File System Tests</h2>');
for (let i = 0; i < fsTests.length; i++) {
const testInfo = getTestInfo(fsTests[i]);
$('#tests').append(`<div class="test-container" id="fsTests-container-${i}">
<div class="test-checkbox-container">
<input type="checkbox" class="test-checkbox" id="fsTests${i}" checked>
<label for="fsTests${i}">${fsTests[i].name}</label><br>
<label for="fsTests${i}">
<div class="test-name">${testInfo.name}</div>
<div class="test-description">${testInfo.description}</div>
</label><br>
<button class="test-run-button" onclick="runSingleTest('fs', ${i})">Run Test</button>
</div>
</div>`);
@@ -123,10 +165,14 @@
$('#tests').append('<h2>Key Value Tests</h2>');
for (let i = 0; i < kvTests.length; i++) {
const testInfo = getTestInfo(kvTests[i]);
$('#tests').append(`<div class="test-container" id="kvTests-container-${i}">
<div class="test-checkbox-container">
<input type="checkbox" class="test-checkbox" id="kvTests${i}" checked>
<label for="kvTests${i}">${kvTests[i].name}</label><br>
<label for="kvTests${i}">
<div class="test-name">${testInfo.name}</div>
<div class="test-description">${testInfo.description}</div>
</label><br>
<button class="test-run-button" onclick="runSingleTest('kv', ${i})">Run Test</button>
</div>
</div>`);
@@ -134,10 +180,14 @@
$('#tests').append('<h2>AI Tests</h2>');
for (let i = 0; i < aiTests.length; i++) {
const testInfo = getTestInfo(aiTests[i]);
$('#tests').append(`<div class="test-container" id="aiTests-container-${i}">
<div class="test-checkbox-container">
<input type="checkbox" class="test-checkbox" id="aiTests${i}" checked>
<label for="aiTests${i}">${aiTests[i].name}</label><br>
<label for="aiTests${i}">
<div class="test-name">${testInfo.name}</div>
<div class="test-description">${testInfo.description}</div>
</label><br>
<button class="test-run-button" onclick="runSingleTest('ai', ${i})">Run Test</button>
</div>
</div>`);
@@ -168,11 +218,12 @@
$(`#${containerId} pre`).remove();
try {
await tests[index]();
await executeTest(tests[index]);
// make this test's container green
$(`#${containerId}`).css('background-color', '#85e085');
} catch (e) {
console.error(`${testType.toUpperCase()} Test failed:`, tests[index].name, e);
const testInfo = getTestInfo(tests[index]);
console.error(`${testType.toUpperCase()} Test failed:`, testInfo.name, e);
// make this test's container red
$(`#${containerId}`).css('background-color', '#ffbfbf');
// message - show full error information including JSON details
@@ -194,12 +245,13 @@
for (let i = 0; i < fsTests.length; i++) {
if (document.getElementById(`fsTests${i}`).checked) {
try{
await fsTests[i]();
await executeTest(fsTests[i]);
// make this test's container green
$(`#fsTests-container-${i}`).css('background-color', '#85e085');
} catch (e) {
console.error('FS Test failed:', fsTests[i].name, e);
const testInfo = getTestInfo(fsTests[i]);
console.error('FS Test failed:', testInfo.name, e);
// make this test's container red
$(`#fsTests-container-${i}`).css('background-color', '#ffbfbf');
// message - show full error information including JSON details
@@ -215,12 +267,13 @@
for (let i = 0; i < kvTests.length; i++) {
if (document.getElementById(`kvTests${i}`).checked) {
try{
await kvTests[i]();
await executeTest(kvTests[i]);
// make this test's container green
$(`#kvTests-container-${i}`).css('background-color', '#85e085');
} catch (e) {
console.error('KV Test failed:', kvTests[i].name, e);
const testInfo = getTestInfo(kvTests[i]);
console.error('KV Test failed:', testInfo.name, e);
// make this test's container red
$(`#kvTests-container-${i}`).css('background-color', '#ff8484');
// message - show full error information including JSON details
@@ -236,12 +289,13 @@
for (let i = 0; i < aiTests.length; i++) {
if (document.getElementById(`aiTests${i}`).checked) {
try{
await aiTests[i]();
await executeTest(aiTests[i]);
// make this test's container green
$(`#aiTests-container-${i}`).css('background-color', '#85e085');
} catch (e) {
console.error('AI Test failed:', aiTests[i].name, e);
const testInfo = getTestInfo(aiTests[i]);
console.error('AI Test failed:', testInfo.name, e);
// make this test's container red
$(`#aiTests-container-${i}`).css('background-color', '#ff8484');
// message - show full error information including JSON details