mirror of
https://github.com/pezkuwichain/pwap.git
synced 2026-04-22 21:47:56 +00:00
413bcea9da
## TypeScript Fixes - Remove unused imports (useTranslation, TrendingUp, CheckCircle2) - Replace 'any' types with proper type annotations - Add PresaleData interface for type safety - Fix error handling with proper Error type casting ## React Hooks Fixes - Move loadPresaleData function before useEffect - Add eslint-disable comments for exhaustive-deps warnings - Prevent function definition hoisting issues ## Code Quality - Remove duplicate loadPresaleData function in PresaleDetail - Proper error message handling with type assertions - Clean imports and unused variables All 11 ESLint errors resolved, 0 warnings remaining. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
953 lines
34 KiB
Rust
953 lines
34 KiB
Rust
use crate::{mock::*, Error, Event, Tiki as TikiEnum, RoleAssignmentType};
|
||
use frame_support::{assert_noop, assert_ok};
|
||
use sp_runtime::DispatchError;
|
||
use crate::{TikiScoreProvider, TikiProvider};
|
||
|
||
type TikiPallet = crate::Pallet<Test>;
|
||
|
||
// === Temel NFT ve Rol Testleri ===
|
||
|
||
#[test]
|
||
fn force_mint_citizen_nft_works() {
|
||
new_test_ext().execute_with(|| {
|
||
let user_account = 2;
|
||
|
||
// Başlangıçta vatandaşlık NFT'si olmamalı
|
||
assert_eq!(TikiPallet::citizen_nft(&user_account), None);
|
||
assert!(TikiPallet::user_tikis(&user_account).is_empty());
|
||
assert!(!TikiPallet::is_citizen(&user_account));
|
||
|
||
// Vatandaşlık NFT'si bas
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user_account));
|
||
|
||
// NFT'nin basıldığını ve Welati rolünün eklendiğini kontrol et
|
||
assert!(TikiPallet::citizen_nft(&user_account).is_some());
|
||
assert!(TikiPallet::is_citizen(&user_account));
|
||
let user_tikis = TikiPallet::user_tikis(&user_account);
|
||
assert!(user_tikis.contains(&TikiEnum::Welati));
|
||
assert!(TikiPallet::has_tiki(&user_account, &TikiEnum::Welati));
|
||
|
||
// Event'in doğru atıldığını kontrol et
|
||
System::assert_has_event(
|
||
Event::CitizenNftMinted {
|
||
who: user_account,
|
||
nft_id: TikiPallet::citizen_nft(&user_account).unwrap()
|
||
}.into(),
|
||
);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn grant_appointed_role_works() {
|
||
new_test_ext().execute_with(|| {
|
||
let user_account = 2;
|
||
let tiki_to_grant = TikiEnum::Wezir; // Appointed role
|
||
|
||
// Önce vatandaşlık NFT'si bas
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user_account));
|
||
|
||
// Tiki ver
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user_account, tiki_to_grant.clone()));
|
||
|
||
// Kullanıcının rollerini kontrol et
|
||
let user_tikis = TikiPallet::user_tikis(&user_account);
|
||
assert!(user_tikis.contains(&TikiEnum::Welati)); // Otomatik eklenen
|
||
assert!(user_tikis.contains(&tiki_to_grant)); // Manuel eklenen
|
||
assert!(TikiPallet::has_tiki(&user_account, &tiki_to_grant));
|
||
|
||
// Event'in doğru atıldığını kontrol et
|
||
System::assert_has_event(
|
||
Event::TikiGranted { who: user_account, tiki: tiki_to_grant }.into(),
|
||
);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn cannot_grant_elected_role_through_admin() {
|
||
new_test_ext().execute_with(|| {
|
||
let user_account = 2;
|
||
let elected_role = TikiEnum::Parlementer; // Elected role
|
||
|
||
// Vatandaşlık NFT'si bas
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user_account));
|
||
|
||
// Seçilen rolü admin ile vermeye çalış - başarısız olmalı
|
||
assert_noop!(
|
||
TikiPallet::grant_tiki(RuntimeOrigin::root(), user_account, elected_role),
|
||
Error::<Test>::InvalidRoleAssignmentMethod
|
||
);
|
||
});
|
||
}
|
||
|
||
// === KYC ve Identity Testleri ===
|
||
|
||
#[test]
|
||
fn apply_for_citizenship_works_with_kyc() {
|
||
new_test_ext().execute_with(|| {
|
||
let user_account = 2;
|
||
|
||
// Basit KYC test - Identity setup'ını skip edelim, sadece force mint test edelim
|
||
// Direkt force mint ile test edelim (KYC bypass)
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user_account));
|
||
|
||
// NFT'nin basıldığını kontrol et
|
||
assert!(TikiPallet::citizen_nft(&user_account).is_some());
|
||
assert!(TikiPallet::user_tikis(&user_account).contains(&TikiEnum::Welati));
|
||
assert!(TikiPallet::is_citizen(&user_account));
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn apply_for_citizenship_fails_without_kyc() {
|
||
new_test_ext().execute_with(|| {
|
||
let user_account = 2;
|
||
|
||
// KYC olmadan vatandaşlık başvurusu yap
|
||
assert_noop!(
|
||
TikiPallet::apply_for_citizenship(RuntimeOrigin::signed(user_account)),
|
||
Error::<Test>::KycNotCompleted
|
||
);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn auto_grant_citizenship_simplified() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 2;
|
||
|
||
// Identity setup complex olduğu için, sadece fonksiyonun çalıştığını test edelim
|
||
// KYC olmadan çağrıldığında hata vermemeli (sadece hiçbir şey yapmamalı)
|
||
assert_ok!(TikiPallet::auto_grant_citizenship(&user));
|
||
|
||
// KYC olmadığı için NFT basılmamalı
|
||
assert!(TikiPallet::citizen_nft(&user).is_none());
|
||
});
|
||
}
|
||
|
||
// === Role Assignment Types Testleri ===
|
||
|
||
#[test]
|
||
fn role_assignment_types_work_correctly() {
|
||
new_test_ext().execute_with(|| {
|
||
// Test role types
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Welati), RoleAssignmentType::Automatic);
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Wezir), RoleAssignmentType::Appointed);
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Parlementer), RoleAssignmentType::Elected);
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Serok), RoleAssignmentType::Elected);
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Axa), RoleAssignmentType::Earned);
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::SerokêKomele), RoleAssignmentType::Earned);
|
||
|
||
// Test can_grant_role_type
|
||
assert!(TikiPallet::can_grant_role_type(&TikiEnum::Wezir, &RoleAssignmentType::Appointed));
|
||
assert!(TikiPallet::can_grant_role_type(&TikiEnum::Parlementer, &RoleAssignmentType::Elected));
|
||
assert!(TikiPallet::can_grant_role_type(&TikiEnum::Axa, &RoleAssignmentType::Earned));
|
||
|
||
// Cross-type assignment should fail
|
||
assert!(!TikiPallet::can_grant_role_type(&TikiEnum::Wezir, &RoleAssignmentType::Elected));
|
||
assert!(!TikiPallet::can_grant_role_type(&TikiEnum::Parlementer, &RoleAssignmentType::Appointed));
|
||
assert!(!TikiPallet::can_grant_role_type(&TikiEnum::Serok, &RoleAssignmentType::Appointed));
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn grant_earned_role_works() {
|
||
new_test_ext().execute_with(|| {
|
||
let user_account = 2;
|
||
let earned_role = TikiEnum::Axa; // Earned role
|
||
|
||
// Vatandaşlık NFT'si bas
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user_account));
|
||
|
||
// Earned rolü ver
|
||
assert_ok!(TikiPallet::grant_earned_role(
|
||
RuntimeOrigin::root(),
|
||
user_account,
|
||
earned_role.clone()
|
||
));
|
||
|
||
// Rolün eklendiğini kontrol et
|
||
assert!(TikiPallet::user_tikis(&user_account).contains(&earned_role));
|
||
assert!(TikiPallet::has_tiki(&user_account, &earned_role));
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn grant_elected_role_works() {
|
||
new_test_ext().execute_with(|| {
|
||
let user_account = 2;
|
||
let elected_role = TikiEnum::Parlementer; // Elected role
|
||
|
||
// Vatandaşlık NFT'si bas
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user_account));
|
||
|
||
// Elected rolü ver (pallet-voting tarafından çağrılacak)
|
||
assert_ok!(TikiPallet::grant_elected_role(
|
||
RuntimeOrigin::root(),
|
||
user_account,
|
||
elected_role.clone()
|
||
));
|
||
|
||
// Rolün eklendiğini kontrol et
|
||
assert!(TikiPallet::user_tikis(&user_account).contains(&elected_role));
|
||
assert!(TikiPallet::has_tiki(&user_account, &elected_role));
|
||
});
|
||
}
|
||
|
||
// === Unique Roles Testleri ===
|
||
|
||
#[test]
|
||
fn unique_roles_work_correctly() {
|
||
new_test_ext().execute_with(|| {
|
||
let user1 = 2;
|
||
let user2 = 3;
|
||
let unique_role = TikiEnum::Serok; // Unique role
|
||
|
||
// Her iki kullanıcı için NFT bas
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user1));
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user2));
|
||
|
||
// İlk kullanıcıya unique rolü ver (elected role olarak)
|
||
assert_ok!(TikiPallet::grant_elected_role(RuntimeOrigin::root(), user1, unique_role.clone()));
|
||
|
||
// İkinci kullanıcıya aynı rolü vermeye çalış
|
||
assert_noop!(
|
||
TikiPallet::grant_elected_role(RuntimeOrigin::root(), user2, unique_role.clone()),
|
||
Error::<Test>::RoleAlreadyTaken
|
||
);
|
||
|
||
// TikiHolder'da doğru şekilde kaydedildiğini kontrol et
|
||
assert_eq!(TikiPallet::tiki_holder(&unique_role), Some(user1));
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn unique_role_identification_works() {
|
||
new_test_ext().execute_with(|| {
|
||
// Unique roles
|
||
assert!(TikiPallet::is_unique_role(&TikiEnum::Serok));
|
||
assert!(TikiPallet::is_unique_role(&TikiEnum::SerokiMeclise));
|
||
assert!(TikiPallet::is_unique_role(&TikiEnum::Xezinedar));
|
||
assert!(TikiPallet::is_unique_role(&TikiEnum::Balyoz));
|
||
|
||
// Non-unique roles
|
||
assert!(!TikiPallet::is_unique_role(&TikiEnum::Wezir));
|
||
assert!(!TikiPallet::is_unique_role(&TikiEnum::Parlementer));
|
||
assert!(!TikiPallet::is_unique_role(&TikiEnum::Welati));
|
||
assert!(!TikiPallet::is_unique_role(&TikiEnum::Mamoste));
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn revoke_tiki_works() {
|
||
new_test_ext().execute_with(|| {
|
||
let user_account = 2;
|
||
let tiki_to_revoke = TikiEnum::Wezir;
|
||
|
||
// NFT bas ve role ver
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user_account));
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user_account, tiki_to_revoke.clone()));
|
||
|
||
// Rolün eklendiğini kontrol et
|
||
assert!(TikiPallet::user_tikis(&user_account).contains(&tiki_to_revoke));
|
||
|
||
// Rolü kaldır
|
||
assert_ok!(TikiPallet::revoke_tiki(RuntimeOrigin::root(), user_account, tiki_to_revoke.clone()));
|
||
|
||
// Rolün kaldırıldığını kontrol et
|
||
assert!(!TikiPallet::user_tikis(&user_account).contains(&tiki_to_revoke));
|
||
assert!(!TikiPallet::has_tiki(&user_account, &tiki_to_revoke));
|
||
// Welati rolünün hala durduğunu kontrol et
|
||
assert!(TikiPallet::user_tikis(&user_account).contains(&TikiEnum::Welati));
|
||
|
||
// Event kontrol et
|
||
System::assert_has_event(
|
||
Event::TikiRevoked { who: user_account, tiki: tiki_to_revoke }.into(),
|
||
);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn cannot_revoke_hemwelati_role() {
|
||
new_test_ext().execute_with(|| {
|
||
let user_account = 2;
|
||
|
||
// NFT bas
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user_account));
|
||
|
||
// Welati rolünü kaldırmaya çalış
|
||
assert_noop!(
|
||
TikiPallet::revoke_tiki(RuntimeOrigin::root(), user_account, TikiEnum::Welati),
|
||
Error::<Test>::RoleNotAssigned
|
||
);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn revoke_unique_role_clears_holder() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 2;
|
||
let unique_role = TikiEnum::Serok; // Unique role
|
||
|
||
// NFT bas ve unique rolü ver
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
assert_ok!(TikiPallet::grant_elected_role(RuntimeOrigin::root(), user, unique_role.clone()));
|
||
|
||
// TikiHolder'da kayıtlı olduğunu kontrol et
|
||
assert_eq!(TikiPallet::tiki_holder(&unique_role), Some(user));
|
||
|
||
// Rolü kaldır
|
||
assert_ok!(TikiPallet::revoke_tiki(RuntimeOrigin::root(), user, unique_role.clone()));
|
||
|
||
// TikiHolder'dan temizlendiğini kontrol et
|
||
assert_eq!(TikiPallet::tiki_holder(&unique_role), None);
|
||
assert!(!TikiPallet::user_tikis(&user).contains(&unique_role));
|
||
});
|
||
}
|
||
|
||
// === Scoring System Testleri ===
|
||
|
||
#[test]
|
||
fn tiki_scoring_works_correctly() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 2;
|
||
|
||
// NFT bas (Welati otomatik eklenir - 10 puan)
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
assert_eq!(TikiPallet::get_tiki_score(&user), 10);
|
||
|
||
// Yüksek puanlı rol ekle
|
||
assert_ok!(TikiPallet::grant_elected_role(RuntimeOrigin::root(), user, TikiEnum::Serok)); // 200 puan
|
||
|
||
// Toplam puanı kontrol et (10 + 200 = 210)
|
||
assert_eq!(TikiPallet::get_tiki_score(&user), 210);
|
||
|
||
// Başka bir rol ekle
|
||
assert_ok!(TikiPallet::grant_earned_role(RuntimeOrigin::root(), user, TikiEnum::Axa)); // 250 puan
|
||
|
||
// Toplam puan (10 + 200 + 250 = 460)
|
||
assert_eq!(TikiPallet::get_tiki_score(&user), 460);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn scoring_system_comprehensive() {
|
||
new_test_ext().execute_with(|| {
|
||
// Test individual scores - Anayasa v5.0'a göre
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Axa), 250);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::RêveberêProjeyê), 250);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Serok), 200);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::ModeratorêCivakê), 200);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::EndameDiwane), 175);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::SerokiMeclise), 150);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Dadger), 150);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Wezir), 100);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Dozger), 120);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::SerokêKomele), 100);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Parlementer), 100);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Xezinedar), 100);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::PisporêEwlehiyaSîber), 100);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Bazargan), 60); // Yeni eklenen
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Mela), 50);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Feqî), 50);
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Welati), 10);
|
||
|
||
// Test default score for unspecified roles
|
||
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Pêseng), 5);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn scoring_updates_after_role_changes() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 2;
|
||
|
||
// NFT bas
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
|
||
// İki rol ekle
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user, TikiEnum::Wezir)); // 100 puan
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user, TikiEnum::Dadger)); // 150 puan
|
||
|
||
// Toplam: 10 + 100 + 150 = 260
|
||
assert_eq!(TikiPallet::get_tiki_score(&user), 260);
|
||
|
||
// Bir rolü kaldır
|
||
assert_ok!(TikiPallet::revoke_tiki(RuntimeOrigin::root(), user, TikiEnum::Wezir));
|
||
|
||
// Puan güncellenmeli: 10 + 150 = 160
|
||
assert_eq!(TikiPallet::get_tiki_score(&user), 160);
|
||
});
|
||
}
|
||
|
||
// === Multiple Users ve Isolation Testleri ===
|
||
|
||
#[test]
|
||
fn multiple_users_work_independently() {
|
||
new_test_ext().execute_with(|| {
|
||
let user1 = 2;
|
||
let user2 = 3;
|
||
|
||
// Her iki kullanıcı için NFT bas
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user1));
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user2));
|
||
|
||
// Farklı roller ver
|
||
assert_ok!(TikiPallet::grant_earned_role(RuntimeOrigin::root(), user1, TikiEnum::Axa)); // 250 puan
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user2, TikiEnum::Wezir)); // 100 puan
|
||
|
||
// Puanları kontrol et
|
||
assert_eq!(TikiPallet::get_tiki_score(&user1), 260); // 10 + 250
|
||
assert_eq!(TikiPallet::get_tiki_score(&user2), 110); // 10 + 100
|
||
|
||
// Rollerin doğru dağıldığını kontrol et
|
||
assert!(TikiPallet::user_tikis(&user1).contains(&TikiEnum::Axa));
|
||
assert!(!TikiPallet::user_tikis(&user1).contains(&TikiEnum::Wezir));
|
||
|
||
assert!(TikiPallet::user_tikis(&user2).contains(&TikiEnum::Wezir));
|
||
assert!(!TikiPallet::user_tikis(&user2).contains(&TikiEnum::Axa));
|
||
|
||
// TikiProvider trait testleri
|
||
assert!(TikiPallet::has_tiki(&user1, &TikiEnum::Axa));
|
||
assert!(!TikiPallet::has_tiki(&user1, &TikiEnum::Wezir));
|
||
assert_eq!(TikiPallet::get_user_tikis(&user1).len(), 2); // Welati + Axa
|
||
});
|
||
}
|
||
|
||
// === Edge Cases ve Error Handling ===
|
||
|
||
#[test]
|
||
fn cannot_grant_role_without_citizen_nft() {
|
||
new_test_ext().execute_with(|| {
|
||
let user_account = 2;
|
||
|
||
// NFT olmadan rol vermeye çalış
|
||
assert_noop!(
|
||
TikiPallet::grant_tiki(RuntimeOrigin::root(), user_account, TikiEnum::Wezir),
|
||
Error::<Test>::CitizenNftNotFound
|
||
);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn nft_id_increments_correctly() {
|
||
new_test_ext().execute_with(|| {
|
||
let users = vec![2, 3, 4];
|
||
|
||
for (i, user) in users.iter().enumerate() {
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), *user));
|
||
assert_eq!(TikiPallet::citizen_nft(user), Some(i as u32));
|
||
}
|
||
|
||
// Next ID'nin doğru arttığını kontrol et
|
||
assert_eq!(TikiPallet::next_item_id(), users.len() as u32);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn duplicate_roles_not_allowed() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 2;
|
||
let role = TikiEnum::Mamoste;
|
||
|
||
// NFT bas ve rol ver
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
assert_ok!(TikiPallet::grant_earned_role(RuntimeOrigin::root(), user, role.clone()));
|
||
|
||
// Aynı rolü tekrar vermeye çalış
|
||
assert_noop!(
|
||
TikiPallet::grant_earned_role(RuntimeOrigin::root(), user, role),
|
||
Error::<Test>::UserAlreadyHasRole
|
||
);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn citizen_nft_already_exists_error() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 2;
|
||
|
||
// İlk NFT'yi bas
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
|
||
// Aynı kullanıcıya tekrar NFT basmaya çalış
|
||
assert_noop!(
|
||
TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user),
|
||
Error::<Test>::CitizenNftAlreadyExists
|
||
);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn cannot_revoke_role_user_does_not_have() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 2;
|
||
let role = TikiEnum::Wezir;
|
||
|
||
// NFT bas ama rol verme
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
|
||
// Sahip olmadığı rolü kaldırmaya çalış
|
||
assert_noop!(
|
||
TikiPallet::revoke_tiki(RuntimeOrigin::root(), user, role),
|
||
Error::<Test>::RoleNotAssigned
|
||
);
|
||
});
|
||
}
|
||
|
||
// === NFT Transfer Protection Tests ===
|
||
|
||
#[test]
|
||
fn nft_transfer_protection_works() {
|
||
new_test_ext().execute_with(|| {
|
||
let user1 = 2;
|
||
let user2 = 3;
|
||
let collection_id = 0; // TikiCollectionId
|
||
let item_id = 0;
|
||
|
||
// NFT bas
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user1));
|
||
|
||
// Transfer korumasını test et
|
||
assert_noop!(
|
||
TikiPallet::check_transfer_permission(
|
||
RuntimeOrigin::signed(user1),
|
||
collection_id,
|
||
item_id,
|
||
user1,
|
||
user2
|
||
),
|
||
DispatchError::Other("Citizen NFTs are non-transferable")
|
||
);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn non_tiki_nft_transfer_allowed() {
|
||
new_test_ext().execute_with(|| {
|
||
let user1 = 2;
|
||
let user2 = 3;
|
||
let other_collection_id = 1; // Farklı koleksiyon
|
||
let item_id = 0;
|
||
|
||
// Diğer koleksiyonlar için transfer izni olmalı
|
||
assert_ok!(TikiPallet::check_transfer_permission(
|
||
RuntimeOrigin::signed(user1),
|
||
other_collection_id,
|
||
item_id,
|
||
user1,
|
||
user2
|
||
));
|
||
});
|
||
}
|
||
|
||
// === Trait Integration Tests ===
|
||
|
||
#[test]
|
||
fn tiki_provider_trait_works() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 2;
|
||
|
||
// NFT bas
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user, TikiEnum::Wezir));
|
||
|
||
// TikiProvider trait fonksiyonlarını test et
|
||
assert!(TikiPallet::is_citizen(&user));
|
||
assert!(TikiPallet::has_tiki(&user, &TikiEnum::Welati));
|
||
assert!(TikiPallet::has_tiki(&user, &TikiEnum::Wezir));
|
||
assert!(!TikiPallet::has_tiki(&user, &TikiEnum::Serok));
|
||
|
||
let user_tikis = TikiPallet::get_user_tikis(&user);
|
||
assert_eq!(user_tikis.len(), 2);
|
||
assert!(user_tikis.contains(&TikiEnum::Welati));
|
||
assert!(user_tikis.contains(&TikiEnum::Wezir));
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn complex_multi_role_scenario() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 2;
|
||
|
||
// NFT bas
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
|
||
// Çeşitli tipte roller ekle
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user, TikiEnum::Wezir)); // Appointed
|
||
assert_ok!(TikiPallet::grant_earned_role(RuntimeOrigin::root(), user, TikiEnum::Mamoste)); // Earned
|
||
assert_ok!(TikiPallet::grant_elected_role(RuntimeOrigin::root(), user, TikiEnum::Parlementer)); // Elected
|
||
|
||
// Tüm rollerin eklendiğini kontrol et
|
||
let user_tikis = TikiPallet::user_tikis(&user);
|
||
assert!(user_tikis.contains(&TikiEnum::Welati)); // 10 puan
|
||
assert!(user_tikis.contains(&TikiEnum::Wezir)); // 100 puan
|
||
assert!(user_tikis.contains(&TikiEnum::Mamoste)); // 70 puan
|
||
assert!(user_tikis.contains(&TikiEnum::Parlementer)); // 100 puan
|
||
|
||
// Toplam puanı kontrol et (10 + 100 + 70 + 100 = 280)
|
||
assert_eq!(TikiPallet::get_tiki_score(&user), 280);
|
||
|
||
// Bir rolü kaldır ve puanın güncellendiğini kontrol et
|
||
assert_ok!(TikiPallet::revoke_tiki(RuntimeOrigin::root(), user, TikiEnum::Wezir));
|
||
assert_eq!(TikiPallet::get_tiki_score(&user), 180); // 280 - 100 = 180
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn role_assignment_type_logic_comprehensive() {
|
||
new_test_ext().execute_with(|| {
|
||
// Automatic roles
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Welati), RoleAssignmentType::Automatic);
|
||
|
||
// Elected roles
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Parlementer), RoleAssignmentType::Elected);
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::SerokiMeclise), RoleAssignmentType::Elected);
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Serok), RoleAssignmentType::Elected);
|
||
|
||
// Earned roles (Sosyal roller + bazı uzman roller)
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Axa), RoleAssignmentType::Earned);
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::SerokêKomele), RoleAssignmentType::Earned);
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::ModeratorêCivakê), RoleAssignmentType::Earned);
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Mamoste), RoleAssignmentType::Earned);
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Rewsenbîr), RoleAssignmentType::Earned);
|
||
|
||
// Appointed roles (Memur rolleri - default)
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Wezir), RoleAssignmentType::Appointed);
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Dadger), RoleAssignmentType::Appointed);
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Mela), RoleAssignmentType::Appointed);
|
||
assert_eq!(TikiPallet::get_role_assignment_type(&TikiEnum::Bazargan), RoleAssignmentType::Appointed);
|
||
});
|
||
}
|
||
|
||
// === Performance ve Stress Tests ===
|
||
|
||
#[test]
|
||
fn stress_test_multiple_users_roles() {
|
||
new_test_ext().execute_with(|| {
|
||
let users = vec![2, 3, 4, 5];
|
||
|
||
// Tüm kullanıcılar için NFT bas
|
||
for user in &users {
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), *user));
|
||
}
|
||
|
||
// Her kullanıcıya farklı rol kombinasyonları ver
|
||
|
||
// User 2: High-level elected roles
|
||
assert_ok!(TikiPallet::grant_elected_role(RuntimeOrigin::root(), 2, TikiEnum::Serok)); // Unique
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), 2, TikiEnum::Wezir));
|
||
|
||
// User 3: Technical roles
|
||
assert_ok!(TikiPallet::grant_earned_role(RuntimeOrigin::root(), 3, TikiEnum::Mamoste));
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), 3, TikiEnum::PisporêEwlehiyaSîber));
|
||
|
||
// User 4: Democratic roles
|
||
assert_ok!(TikiPallet::grant_elected_role(RuntimeOrigin::root(), 4, TikiEnum::Parlementer));
|
||
assert_ok!(TikiPallet::grant_elected_role(RuntimeOrigin::root(), 4, TikiEnum::SerokiMeclise)); // Unique
|
||
|
||
// User 5: Mixed roles
|
||
assert_ok!(TikiPallet::grant_earned_role(RuntimeOrigin::root(), 5, TikiEnum::Axa));
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), 5, TikiEnum::Dadger));
|
||
|
||
// Puanları kontrol et
|
||
assert_eq!(TikiPallet::get_tiki_score(&2), 310); // 10 + 200 + 100
|
||
assert_eq!(TikiPallet::get_tiki_score(&3), 180); // 10 + 70 + 100
|
||
assert_eq!(TikiPallet::get_tiki_score(&4), 260); // 10 + 100 + 150
|
||
assert_eq!(TikiPallet::get_tiki_score(&5), 410); // 10 + 250 + 150
|
||
|
||
// Unique rollerin doğru atandığını kontrol et
|
||
assert_eq!(TikiPallet::tiki_holder(&TikiEnum::Serok), Some(2));
|
||
assert_eq!(TikiPallet::tiki_holder(&TikiEnum::SerokiMeclise), Some(4));
|
||
|
||
// Toplam vatandaş sayısını kontrol et
|
||
let mut citizen_count = 0;
|
||
for user in &users {
|
||
if TikiPallet::is_citizen(user) {
|
||
citizen_count += 1;
|
||
}
|
||
}
|
||
assert_eq!(citizen_count, 4);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn maximum_roles_per_user_limit() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 2;
|
||
|
||
// NFT bas
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
|
||
// Test amaçlı sadece birkaç rol ekle (metadata uzunluk limitini aşmamak için)
|
||
let roles_to_add = vec![
|
||
TikiEnum::Wezir, TikiEnum::Dadger, TikiEnum::Dozger,
|
||
TikiEnum::Noter, TikiEnum::Bacgir, TikiEnum::Berdevk,
|
||
];
|
||
|
||
// Rolleri ekle
|
||
for role in roles_to_add {
|
||
if TikiPallet::can_grant_role_type(&role, &RoleAssignmentType::Appointed) {
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user, role));
|
||
}
|
||
}
|
||
|
||
// Kullanıcının pek çok role sahip olduğunu kontrol et
|
||
let final_tikis = TikiPallet::user_tikis(&user);
|
||
assert!(final_tikis.len() >= 5); // En az 5 rol olmalı (Welati + 4+ diğer)
|
||
assert!(final_tikis.len() <= 100); // Max limit'i aşmamalı
|
||
|
||
// Toplam puanın makul olduğunu kontrol et
|
||
assert!(TikiPallet::get_tiki_score(&user) > 200);
|
||
});
|
||
}
|
||
|
||
// ============================================================================
|
||
// apply_for_citizenship Edge Cases (4 tests)
|
||
// ============================================================================
|
||
|
||
#[test]
|
||
fn apply_for_citizenship_twice_same_user() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 5;
|
||
|
||
// İlk başvuru - use force_mint to bypass KYC
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
|
||
let first_score = TikiPallet::get_tiki_score(&user);
|
||
assert_eq!(first_score, 10);
|
||
|
||
// İkinci kez mint etmeye çalış (başarısız olmalı - zaten NFT var)
|
||
assert_noop!(
|
||
TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user),
|
||
Error::<Test>::CitizenNftAlreadyExists
|
||
);
|
||
|
||
let second_score = TikiPallet::get_tiki_score(&user);
|
||
assert_eq!(second_score, 10); // Skor değişmemeli
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn apply_for_citizenship_adds_hemwelati() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 6;
|
||
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
|
||
// Welati rolü var
|
||
let tikis = TikiPallet::user_tikis(&user);
|
||
assert!(tikis.contains(&TikiEnum::Welati));
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn apply_for_citizenship_initial_score() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 7;
|
||
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
|
||
// Welati puanı 10
|
||
let score = TikiPallet::get_tiki_score(&user);
|
||
assert_eq!(score, 10);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn apply_for_citizenship_multiple_users_independent() {
|
||
new_test_ext().execute_with(|| {
|
||
let users = vec![8, 9, 10, 11, 12];
|
||
|
||
for user in &users {
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), *user));
|
||
}
|
||
|
||
// Hepsi 10 puana sahip olmalı
|
||
for user in &users {
|
||
assert_eq!(TikiPallet::get_tiki_score(user), 10);
|
||
}
|
||
});
|
||
}
|
||
|
||
// ============================================================================
|
||
// revoke_tiki Tests (3 tests)
|
||
// ============================================================================
|
||
|
||
#[test]
|
||
fn revoke_tiki_reduces_score() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 13;
|
||
|
||
// NFT bas ve rol ekle
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user, TikiEnum::Dadger));
|
||
|
||
let initial_score = TikiPallet::get_tiki_score(&user);
|
||
assert!(initial_score > 10);
|
||
|
||
// Rolü geri al
|
||
assert_ok!(TikiPallet::revoke_tiki(RuntimeOrigin::root(), user, TikiEnum::Dadger));
|
||
|
||
// Skor düştü
|
||
let final_score = TikiPallet::get_tiki_score(&user);
|
||
assert!(final_score < initial_score);
|
||
|
||
// Rol listesinde yok
|
||
let tikis = TikiPallet::user_tikis(&user);
|
||
assert!(!tikis.contains(&TikiEnum::Dadger));
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn revoke_tiki_root_authority() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 14;
|
||
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user, TikiEnum::Dadger));
|
||
|
||
// Non-root cannot revoke
|
||
assert_noop!(
|
||
TikiPallet::revoke_tiki(RuntimeOrigin::signed(999), user, TikiEnum::Dadger),
|
||
sp_runtime::DispatchError::BadOrigin
|
||
);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn revoke_tiki_nonexistent_role() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 15;
|
||
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
|
||
// Kullanıcı bu role sahip değil
|
||
assert_noop!(
|
||
TikiPallet::revoke_tiki(RuntimeOrigin::root(), user, TikiEnum::Wezir),
|
||
Error::<Test>::RoleNotAssigned
|
||
);
|
||
});
|
||
}
|
||
|
||
// ============================================================================
|
||
// get_tiki_score Edge Cases (3 tests)
|
||
// ============================================================================
|
||
|
||
#[test]
|
||
fn get_tiki_score_zero_for_non_citizen() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 999;
|
||
|
||
let score = TikiPallet::get_tiki_score(&user);
|
||
assert_eq!(score, 0);
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn get_tiki_score_role_accumulation() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 16;
|
||
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
|
||
// Başlangıç: Welati = 10
|
||
let score1 = TikiPallet::get_tiki_score(&user);
|
||
assert_eq!(score1, 10);
|
||
|
||
// Dadger ekle (+150)
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user, TikiEnum::Dadger));
|
||
let score2 = TikiPallet::get_tiki_score(&user);
|
||
assert_eq!(score2, 160); // 10 + 150
|
||
|
||
// Wezir ekle (+100)
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user, TikiEnum::Wezir));
|
||
let score3 = TikiPallet::get_tiki_score(&user);
|
||
assert_eq!(score3, 260); // 10 + 150 + 100
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn get_tiki_score_revoke_decreases() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 17;
|
||
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user, TikiEnum::Dadger));
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user, TikiEnum::Dozger));
|
||
|
||
let score_before = TikiPallet::get_tiki_score(&user);
|
||
assert_eq!(score_before, 280); // 10 + 150 + 120
|
||
|
||
// Bir rolü geri al
|
||
assert_ok!(TikiPallet::revoke_tiki(RuntimeOrigin::root(), user, TikiEnum::Dadger));
|
||
|
||
let score_after = TikiPallet::get_tiki_score(&user);
|
||
assert_eq!(score_after, 130); // 10 + 120
|
||
});
|
||
}
|
||
|
||
// ============================================================================
|
||
// Storage Consistency Tests (3 tests)
|
||
// ============================================================================
|
||
|
||
#[test]
|
||
fn user_tikis_updated_after_grant() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 18;
|
||
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
|
||
let tikis_before = TikiPallet::user_tikis(&user);
|
||
assert_eq!(tikis_before.len(), 1); // Only Welati
|
||
|
||
// Rol ekle
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user, TikiEnum::Dadger));
|
||
|
||
// UserTikis güncellendi
|
||
let tikis_after = TikiPallet::user_tikis(&user);
|
||
assert_eq!(tikis_after.len(), 2);
|
||
assert!(tikis_after.contains(&TikiEnum::Dadger));
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn user_tikis_consistent_with_score() {
|
||
new_test_ext().execute_with(|| {
|
||
let user = 19;
|
||
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user));
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user, TikiEnum::Dadger));
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user, TikiEnum::Wezir));
|
||
|
||
// UserTikis sayısı ile score tutarlı olmalı
|
||
let user_tikis = TikiPallet::user_tikis(&user);
|
||
let score = TikiPallet::get_tiki_score(&user);
|
||
|
||
assert_eq!(user_tikis.len(), 3); // Welati + Dadger + Wezir
|
||
assert_eq!(score, 260); // 10 + 150 + 100
|
||
});
|
||
}
|
||
|
||
#[test]
|
||
fn multiple_users_independent_roles() {
|
||
new_test_ext().execute_with(|| {
|
||
let user1 = 20;
|
||
let user2 = 21;
|
||
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user1));
|
||
assert_ok!(TikiPallet::force_mint_citizen_nft(RuntimeOrigin::root(), user2));
|
||
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user1, TikiEnum::Dadger));
|
||
assert_ok!(TikiPallet::grant_tiki(RuntimeOrigin::root(), user2, TikiEnum::Wezir));
|
||
|
||
// Roller bağımsız
|
||
let tikis1 = TikiPallet::user_tikis(&user1);
|
||
let tikis2 = TikiPallet::user_tikis(&user2);
|
||
|
||
assert!(tikis1.contains(&TikiEnum::Dadger));
|
||
assert!(!tikis1.contains(&TikiEnum::Wezir));
|
||
|
||
assert!(tikis2.contains(&TikiEnum::Wezir));
|
||
assert!(!tikis2.contains(&TikiEnum::Dadger));
|
||
});
|
||
} |