straywild/tests/profile_title_validation.gd

151 lines
5.1 KiB
GDScript

extends SceneTree
func _initialize() -> void:
_run.call_deferred()
func _run() -> void:
_validate_profile_defaults_and_legacy_data()
_validate_network_payloads()
_validate_peer_registry_title()
await _validate_profile_layout()
print("Profile title validation: PASS")
quit(0)
func _validate_profile_defaults_and_legacy_data() -> void:
var preferences := NetworkProfilePreferences.new()
assert(preferences.display_name == "stray")
assert(preferences.title == "newbie")
assert(NetworkProfilePreferences.is_valid_title("trail guide"))
assert(not NetworkProfilePreferences.is_valid_title(""))
assert(not NetworkProfilePreferences.is_valid_title("x".repeat(
NetworkProtocol.MAX_PLAYER_TITLE_LENGTH + 1
)))
preferences.profile_id = "profile-id"
preferences.created_at_unix = 1
var save_data := preferences.to_save_data()
assert(str(save_data.get("title", "")) == "newbie")
assert(NetworkProfilePreferences.validate_save_data(save_data))
# Title was added without invalidating existing per-save character records.
var legacy_save := save_data.duplicate(true)
legacy_save.erase("title")
assert(NetworkProfilePreferences.validate_save_data(legacy_save))
legacy_save["title"] = 7
assert(not NetworkProfilePreferences.validate_save_data(legacy_save))
preferences.free()
func _validate_network_payloads() -> void:
var appearance := CharacterCustomizationCatalog.default_snapshot()
var fingerprint := "a".repeat(64)
var hello := NetworkProtocol.make_client_hello(
"profile-id",
"stray",
"client-nonce",
appearance,
fingerprint,
PackedByteArray(),
"trail guide",
)
assert(NetworkProtocol.validate_client_hello(hello).is_empty())
assert(str(hello.get("player_title", "")) == "trail guide")
var invalid_hello := hello.duplicate(true)
invalid_hello["player_title"] = ""
assert(not NetworkProtocol.validate_client_hello(invalid_hello).is_empty())
var check_request := {
"request_id": "check",
"session_id": "session",
"display_name": "stray",
}
assert(NetworkProfileProtocol.valid_check_request(check_request))
var apply_request := check_request.duplicate(true)
apply_request.merge({
"player_title": "trail guide",
"appearance": appearance,
"use_anyway": false,
"sender_fingerprint": fingerprint,
"sender_signature": PackedByteArray(),
})
assert(NetworkProfileProtocol.valid_apply_request(apply_request))
var signed_fields := NetworkProfileProtocol.signature_fields(apply_request)
assert(signed_fields.has("trail guide"))
apply_request.erase("player_title")
assert(not NetworkProfileProtocol.valid_apply_request(apply_request))
func _validate_peer_registry_title() -> void:
var registry := PeerRegistry.new()
assert(registry.add_peer(
2,
"profile-id",
"stray",
NetworkProtocol.PROTOCOL_VERSION,
"",
"",
PackedStringArray(),
"trail guide",
))
assert(registry.get_peer(2).title == "trail guide")
assert(registry.update_title(2, "river scout"))
assert(registry.get_peer(2).title == "river scout")
assert(not registry.update_title(2, ""))
assert(not registry.add_peer(
3,
"invalid-profile",
"stray",
NetworkProtocol.PROTOCOL_VERSION,
"",
"",
PackedStringArray(),
"",
))
func _validate_profile_layout() -> void:
root.size = Vector2i(1280, 720)
var page := ProfilePage.new()
page.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
root.add_child(page)
await process_frame
await process_frame
var name_label := page.get("_name_label") as Label
var name_edit := page.get("_name_edit") as LineEdit
var title_edit := page.get("_title_edit") as LineEdit
var identity := page.find_child("IdentityFingerprint", true, false) as Label
var identity_stack := page.find_child(
"ProfileIdentityStack", true, false
) as VBoxContainer
var experience_row := page.find_child(
"ProfileExperienceRow", true, false
) as HBoxContainer
assert(name_label != null and name_edit != null and title_edit != null)
assert(name_label.text == "name")
assert(identity != null and identity_stack != null and experience_row != null)
assert(name_edit.placeholder_text == "stray")
assert(title_edit.placeholder_text == "newbie")
assert(title_edit.global_position.y > name_edit.global_position.y)
assert(is_equal_approx(title_edit.position.x, name_edit.position.x))
assert(identity.get_parent() == identity_stack)
assert(experience_row.get_parent() == identity_stack)
assert(identity.horizontal_alignment == HORIZONTAL_ALIGNMENT_RIGHT)
assert(identity_stack.global_position.x > name_edit.global_position.x)
assert(name_label.tooltip_text.contains(
"Shown to other players in multiplayer."
))
page.call("_set_name_status", "Name is available in this game.")
assert(name_label.tooltip_text.contains(
"Name is available in this game."
))
for visible_label: Label in page.find_children("*", "Label", true, false):
if visible_label.visible:
assert(visible_label.text != "Shown to other players in multiplayer.")
assert(visible_label.text != "Name is available in this game.")
var account_controls: Array = page.call("_account_controller_controls")
assert(name_edit in account_controls)
assert(title_edit in account_controls)
page.queue_free()
for _frame: int in 4:
await process_frame