mirror of
https://github.com/pezkuwichain/pwap.git
synced 2026-04-22 22:57:55 +00:00
1295c36241
- Fixed TypeScript type assertion issues - Updated imports from api-augment/substrate to api-augment/bizinikiwi - Fixed imgConvert.mjs header and imports - Added @ts-expect-error for runtime-converted types - Fixed all @polkadot copyright headers to @pezkuwi
144 lines
5.2 KiB
JavaScript
144 lines
5.2 KiB
JavaScript
/**
|
|
* @file: trust.live.test.js
|
|
* @description: Live integration tests for the Trust pallet.
|
|
*
|
|
* @preconditions:
|
|
* 1. A local Pezkuwi dev node must be running and accessible at `ws://127.0.0.1:8082`.
|
|
* 2. The node must have the `trust`, `staking`, and `tiki` pallets.
|
|
* 3. The tests require a funded sudo account (`//Alice`).
|
|
*/
|
|
|
|
import { ApiPromise, WsProvider, Keyring } from '@pezkuwi/api';
|
|
import { BN } from '@pezkuwi/util';
|
|
import { jest } from '@jest/globals';
|
|
|
|
// ========================================
|
|
// TEST CONFIGURATION
|
|
// ========================================
|
|
|
|
const WS_ENDPOINT = 'ws://127.0.0.1:8082';
|
|
jest.setTimeout(90000); // 90 seconds
|
|
|
|
const UNITS = new BN('1000000000000'); // 10^12
|
|
|
|
// ========================================
|
|
// TEST SETUP & TEARDOWN
|
|
// ========================================
|
|
|
|
let api;
|
|
let keyring;
|
|
let sudo, user1;
|
|
|
|
// Helper to send a transaction and wait for it to be finalized
|
|
const sendAndFinalize = (tx, signer) => {
|
|
return new Promise((resolve, reject) => {
|
|
tx.signAndSend(signer, ({ status, dispatchError }) => {
|
|
if (status.isFinalized) {
|
|
if (dispatchError) {
|
|
const decoded = api.registry.findMetaError(dispatchError.asModule);
|
|
reject(new Error(`${decoded.section}.${decoded.name}`));
|
|
} else {
|
|
resolve();
|
|
}
|
|
}
|
|
}).catch(reject);
|
|
});
|
|
};
|
|
|
|
beforeAll(async () => {
|
|
const wsProvider = new WsProvider(WS_ENDPOINT);
|
|
api = await ApiPromise.create({ provider: wsProvider });
|
|
keyring = new Keyring({ type: 'sr25519' });
|
|
|
|
sudo = keyring.addFromUri('//Alice');
|
|
user1 = keyring.addFromUri('//Charlie');
|
|
|
|
console.log('Connected to node and initialized accounts for Trust tests.');
|
|
|
|
// --- Test Setup: Ensure user1 has some score components ---
|
|
console.log('Setting up user1 with score components (Staking and Tiki)...');
|
|
try {
|
|
// 1. Make user a citizen to avoid NotACitizen error
|
|
await sendAndFinalize(api.tx.tiki.forceMintCitizenNft(user1.address), sudo);
|
|
|
|
// 2. Bond some stake to get a staking score
|
|
const stakeAmount = UNITS.mul(new BN(500));
|
|
await sendAndFinalize(api.tx.staking.bond(stakeAmount, 'Staked'), user1);
|
|
|
|
console.log('User1 setup complete.');
|
|
} catch (e) {
|
|
console.warn(`Setup for user1 failed. Tests might not be accurate. Error: ${e.message}`);
|
|
}
|
|
}, 120000);
|
|
|
|
afterAll(async () => {
|
|
if (api) await api.disconnect();
|
|
});
|
|
|
|
// ========================================
|
|
// LIVE PALLET TESTS
|
|
// ========================================
|
|
|
|
describe('Trust Pallet Live Workflow', () => {
|
|
|
|
it('should allow root to recalculate trust score for a user', async () => {
|
|
console.log('Testing force_recalculate_trust_score...');
|
|
|
|
const scoreBefore = await api.query.trust.trustScoreOf(user1.address);
|
|
expect(scoreBefore.toNumber()).toBe(0); // Should be 0 initially
|
|
|
|
// Recalculate score as root
|
|
await sendAndFinalize(api.tx.trust.forceRecalculateTrustScore(user1.address), sudo);
|
|
|
|
const scoreAfter = await api.query.trust.trustScoreOf(user1.address);
|
|
// Score should be greater than zero because user has staking and tiki scores
|
|
expect(scoreAfter.toNumber()).toBeGreaterThan(0);
|
|
console.log(`Trust score for user1 successfully updated to ${scoreAfter.toNumber()}.`);
|
|
});
|
|
|
|
it('should NOT allow a non-root user to recalculate score', async () => {
|
|
console.log('Testing BadOrigin for force_recalculate_trust_score...');
|
|
|
|
await expect(
|
|
sendAndFinalize(api.tx.trust.forceRecalculateTrustScore(user1.address), user1)
|
|
).rejects.toThrow('system.BadOrigin');
|
|
console.log('Verified: Non-root cannot force a recalculation.');
|
|
});
|
|
|
|
it('should allow root to update all trust scores', async () => {
|
|
console.log('Testing update_all_trust_scores...');
|
|
|
|
// This transaction should succeed
|
|
await sendAndFinalize(api.tx.trust.updateAllTrustScores(), sudo);
|
|
|
|
// We can't easily verify the result without knowing all citizens,
|
|
// but we can confirm the transaction itself doesn't fail.
|
|
console.log('Successfully called update_all_trust_scores.');
|
|
|
|
// The score for user1 should still be what it was, as nothing has changed
|
|
const scoreAfterAll = await api.query.trust.trustScoreOf(user1.address);
|
|
expect(scoreAfterAll.toNumber()).toBeGreaterThan(0);
|
|
});
|
|
|
|
it('should NOT allow a non-root user to update all scores', async () => {
|
|
console.log('Testing BadOrigin for update_all_trust_scores...');
|
|
|
|
await expect(
|
|
sendAndFinalize(api.tx.trust.updateAllTrustScores(), user1)
|
|
).rejects.toThrow('system.BadOrigin');
|
|
console.log('Verified: Non-root cannot update all scores.');
|
|
});
|
|
|
|
it('should fail to calculate score for a non-citizen', async () => {
|
|
console.log('Testing failure for non-citizen...');
|
|
const nonCitizen = keyring.addFromUri('//Eve');
|
|
|
|
// This extrinsic requires root, but the underlying `calculate_trust_score` function
|
|
// should return a `NotACitizen` error, which is what we expect the extrinsic to fail with.
|
|
await expect(
|
|
sendAndFinalize(api.tx.trust.forceRecalculateTrustScore(nonCitizen.address), sudo)
|
|
).rejects.toThrow('trust.NotACitizen');
|
|
console.log('Verified: Cannot calculate score for a non-citizen.');
|
|
});
|
|
});
|