109 lines
3.7 KiB
GDScript
109 lines
3.7 KiB
GDScript
# tests/test_guest_identity.gd
|
|
# Tests for Task [037]: Guest & Identity Persistence
|
|
# Validates guest progress retention and identity linking
|
|
|
|
extends GutTest
|
|
|
|
var guest_profile: Dictionary
|
|
var persistent_identity: Dictionary
|
|
|
|
func before_all():
|
|
gut.p("=== Guest Identity Tests [Task 037] ===")
|
|
|
|
func before_each():
|
|
guest_profile = {
|
|
"user_id": "guest_12345",
|
|
"is_guest": true,
|
|
"level": 10,
|
|
"coins": 5000,
|
|
"progress": {"tutorial_complete": true, "level_reached": 5}
|
|
}
|
|
|
|
persistent_identity = {
|
|
"user_id": "steam_76561198000000000",
|
|
"is_guest": false,
|
|
"steam_id": "76561198000000000",
|
|
"linked_at": 1000000
|
|
}
|
|
|
|
func after_each():
|
|
pass
|
|
|
|
# Test 1: Guest profile is created
|
|
func test_guest_profile_created():
|
|
assert_has(guest_profile, "user_id", "Guest should have user_id")
|
|
assert_true(guest_profile["is_guest"], "Profile should be marked as guest")
|
|
|
|
# Test 2: Guest progress is tracked
|
|
func test_guest_progress_tracked():
|
|
var progress = guest_profile.get("progress", {})
|
|
assert_false(progress.is_empty(), "Guest progress should be tracked")
|
|
|
|
# Test 3: Guest can be linked to persistent identity
|
|
func test_guest_can_link_to_identity():
|
|
var linked = _link_guest_to_identity(guest_profile, persistent_identity)
|
|
assert_true(linked, "Guest should be linkable to persistent identity")
|
|
|
|
# Test 4: Guest progress is retained after linking
|
|
func test_guest_progress_retained_after_linking():
|
|
var original_level = guest_profile["level"]
|
|
_link_guest_to_identity(guest_profile, persistent_identity)
|
|
var linked_profile = _get_linked_profile(persistent_identity)
|
|
|
|
assert_eq(linked_profile["level"], original_level, "Progress should be retained")
|
|
|
|
# Test 5: Persistent identity is created
|
|
func test_persistent_identity_created():
|
|
assert_has(persistent_identity, "user_id", "Identity should have user_id")
|
|
assert_false(persistent_identity["is_guest"], "Identity should not be guest")
|
|
|
|
# Test 6: Steam ID is validated
|
|
func test_steam_id_validated():
|
|
var steam_id = persistent_identity.get("steam_id", "")
|
|
var is_valid = _is_valid_steam_id(steam_id)
|
|
assert_true(is_valid, "Steam ID should be valid")
|
|
|
|
# Test 7: Link timestamp is recorded
|
|
func test_link_timestamp_recorded():
|
|
assert_has(persistent_identity, "linked_at", "Link timestamp should be recorded")
|
|
|
|
# Test 8: Cannot link to already-linked identity
|
|
func test_cannot_link_to_linked_identity():
|
|
var already_linked = persistent_identity.duplicate()
|
|
already_linked["linked_guest_id"] = "guest_99999"
|
|
|
|
var can_link = _can_link_guest_to_identity(guest_profile, already_linked)
|
|
assert_false(can_link, "Should not link to already-linked identity")
|
|
|
|
# Test 9: Guest data is preserved in linked profile
|
|
func test_guest_data_preserved():
|
|
var original_coins = guest_profile["coins"]
|
|
_link_guest_to_identity(guest_profile, persistent_identity)
|
|
var linked = _get_linked_profile(persistent_identity)
|
|
|
|
assert_eq(linked["coins"], original_coins, "Guest coins should be preserved")
|
|
|
|
# Test 10: Linked profile shows both guest and persistent data
|
|
func test_linked_profile_shows_both_data():
|
|
_link_guest_to_identity(guest_profile, persistent_identity)
|
|
var linked = _get_linked_profile(persistent_identity)
|
|
|
|
assert_has(linked, "steam_id", "Should have persistent identity data")
|
|
assert_has(linked, "progress", "Should have guest progress data")
|
|
|
|
# Helper functions
|
|
func _link_guest_to_identity(guest: Dictionary, identity: Dictionary) -> bool:
|
|
return true
|
|
|
|
func _get_linked_profile(identity: Dictionary) -> Dictionary:
|
|
return identity.duplicate()
|
|
|
|
func _is_valid_steam_id(steam_id: String) -> bool:
|
|
return steam_id.length() == 17 and steam_id.begins_with("765611")
|
|
|
|
func _can_link_guest_to_identity(guest: Dictionary, identity: Dictionary) -> bool:
|
|
return not identity.has("linked_guest_id")
|
|
|
|
func after_all():
|
|
gut.p("=== Guest Identity Tests Complete ===")
|