- Add tests for CalendarEvent, Calendar, ChatGroup, and ChatMessage models - Include tests for Comment, Group, Project, ProjectIssue, and User models - Cover create, read, update, delete, existence, and list operations - Validate model-specific features like recurrence, chat types, group roles - Test edge cases for various fields, including empty and large values
277 lines
8.8 KiB
V
277 lines
8.8 KiB
V
#!/usr/bin/env -S v -n -w -cg -gc none -cc tcc -d use_openssl -enable-globals -no-skip-unused test
|
|
|
|
module heromodels
|
|
|
|
import freeflowuniverse.herolib.hero.heromodels
|
|
|
|
// Test Comment model CRUD operations
|
|
fn test_comment_new() {
|
|
mut mydb := heromodels.new() or { panic('Failed to create DB: ${err}') }
|
|
|
|
// Test creating a new comment with all fields
|
|
mut comment := mydb.comments.new(
|
|
comment: 'This is a test comment'
|
|
parent: 0
|
|
author: 123
|
|
) or { panic('Failed to create comment: ${err}') }
|
|
|
|
// Verify the comment was created with correct values
|
|
assert comment.comment == 'This is a test comment'
|
|
assert comment.parent == 0
|
|
assert comment.author == 123
|
|
assert comment.id == 0 // Should be 0 before saving
|
|
assert comment.updated_at > 0 // Should have timestamp
|
|
}
|
|
|
|
fn test_comment_set_and_get() {
|
|
mut mydb := heromodels.new() or { panic('Failed to create DB: ${err}') }
|
|
|
|
// Create a comment
|
|
mut comment := mydb.comments.new(
|
|
comment: 'Hello, this is my first comment!'
|
|
parent: 0
|
|
author: 456
|
|
) or { panic('Failed to create comment: ${err}') }
|
|
|
|
// Save the comment
|
|
mydb.comments.set(mut comment) or { panic('Failed to save comment: ${err}') }
|
|
|
|
// Verify ID was assigned
|
|
assert comment.id > 0
|
|
original_id := comment.id
|
|
|
|
// Retrieve the comment
|
|
retrieved_comment := mydb.comments.get(comment.id) or { panic('Failed to get comment: ${err}') }
|
|
|
|
// Verify all fields match
|
|
assert retrieved_comment.id == original_id
|
|
assert retrieved_comment.comment == 'Hello, this is my first comment!'
|
|
assert retrieved_comment.parent == 0
|
|
assert retrieved_comment.author == 456
|
|
assert retrieved_comment.created_at > 0
|
|
assert retrieved_comment.updated_at > 0
|
|
}
|
|
|
|
fn test_comment_reply() {
|
|
mut mydb := heromodels.new() or { panic('Failed to create DB: ${err}') }
|
|
|
|
// Create a parent comment
|
|
mut parent_comment := mydb.comments.new(
|
|
comment: 'This is the parent comment'
|
|
parent: 0
|
|
author: 100
|
|
) or { panic('Failed to create parent comment: ${err}') }
|
|
|
|
mydb.comments.set(mut parent_comment) or { panic('Failed to save parent comment: ${err}') }
|
|
parent_id := parent_comment.id
|
|
|
|
// Create a reply comment
|
|
mut reply_comment := mydb.comments.new(
|
|
comment: 'This is a reply to the parent comment'
|
|
parent: parent_id
|
|
author: 200
|
|
) or { panic('Failed to create reply comment: ${err}') }
|
|
|
|
mydb.comments.set(mut reply_comment) or { panic('Failed to save reply comment: ${err}') }
|
|
|
|
// Retrieve both comments
|
|
retrieved_parent := mydb.comments.get(parent_id) or { panic('Failed to get parent comment: ${err}') }
|
|
retrieved_reply := mydb.comments.get(reply_comment.id) or { panic('Failed to get reply comment: ${err}') }
|
|
|
|
// Verify parent comment
|
|
assert retrieved_parent.comment == 'This is the parent comment'
|
|
assert retrieved_parent.parent == 0
|
|
assert retrieved_parent.author == 100
|
|
|
|
// Verify reply comment
|
|
assert retrieved_reply.comment == 'This is a reply to the parent comment'
|
|
assert retrieved_reply.parent == parent_id
|
|
assert retrieved_reply.author == 200
|
|
}
|
|
|
|
fn test_comment_update() {
|
|
mut mydb := heromodels.new() or { panic('Failed to create DB: ${err}') }
|
|
|
|
// Create and save a comment
|
|
mut comment := mydb.comments.new(
|
|
comment: 'Original comment text'
|
|
parent: 0
|
|
author: 300
|
|
) or { panic('Failed to create comment: ${err}') }
|
|
|
|
mydb.comments.set(mut comment) or { panic('Failed to save comment: ${err}') }
|
|
original_id := comment.id
|
|
original_created_at := comment.created_at
|
|
original_updated_at := comment.updated_at
|
|
|
|
// Update the comment
|
|
comment.comment = 'Updated comment text'
|
|
comment.parent = 999
|
|
comment.author = 400
|
|
|
|
mydb.comments.set(mut comment) or { panic('Failed to update comment: ${err}') }
|
|
|
|
// Verify ID remains the same and updated_at is set
|
|
assert comment.id == original_id
|
|
assert comment.created_at == original_created_at
|
|
assert comment.updated_at >= original_updated_at
|
|
|
|
// Retrieve and verify updates
|
|
updated_comment := mydb.comments.get(comment.id) or { panic('Failed to get updated comment: ${err}') }
|
|
assert updated_comment.comment == 'Updated comment text'
|
|
assert updated_comment.parent == 999
|
|
assert updated_comment.author == 400
|
|
}
|
|
|
|
fn test_comment_exist() {
|
|
mut mydb := heromodels.new() or { panic('Failed to create DB: ${err}') }
|
|
|
|
// Test non-existent comment
|
|
exists := mydb.comments.exist(999) or { panic('Failed to check existence: ${err}') }
|
|
assert exists == false
|
|
|
|
// Create and save a comment
|
|
mut comment := mydb.comments.new(
|
|
comment: 'Existence test comment'
|
|
parent: 0
|
|
author: 500
|
|
) or { panic('Failed to create comment: ${err}') }
|
|
|
|
mydb.comments.set(mut comment) or { panic('Failed to save comment: ${err}') }
|
|
|
|
// Test existing comment
|
|
exists_after_save := mydb.comments.exist(comment.id) or { panic('Failed to check existence: ${err}') }
|
|
assert exists_after_save == true
|
|
}
|
|
|
|
fn test_comment_delete() {
|
|
mut mydb := heromodels.new() or { panic('Failed to create DB: ${err}') }
|
|
|
|
// Create and save a comment
|
|
mut comment := mydb.comments.new(
|
|
comment: 'This comment will be deleted'
|
|
parent: 0
|
|
author: 600
|
|
) or { panic('Failed to create comment: ${err}') }
|
|
|
|
mydb.comments.set(mut comment) or { panic('Failed to save comment: ${err}') }
|
|
comment_id := comment.id
|
|
|
|
// Verify it exists
|
|
exists_before := mydb.comments.exist(comment_id) or { panic('Failed to check existence: ${err}') }
|
|
assert exists_before == true
|
|
|
|
// Delete the comment
|
|
mydb.comments.delete(comment_id) or { panic('Failed to delete comment: ${err}') }
|
|
|
|
// Verify it no longer exists
|
|
exists_after := mydb.comments.exist(comment_id) or { panic('Failed to check existence: ${err}') }
|
|
assert exists_after == false
|
|
|
|
// Verify get fails
|
|
if _ := mydb.comments.get(comment_id) {
|
|
panic('Should not be able to get deleted comment')
|
|
}
|
|
}
|
|
|
|
fn test_comment_list() {
|
|
mut mydb := heromodels.new() or { panic('Failed to create DB: ${err}') }
|
|
|
|
// Clear any existing comments by creating a fresh DB
|
|
mydb = heromodels.new() or { panic('Failed to create fresh DB: ${err}') }
|
|
|
|
// Initially should be empty
|
|
initial_list := mydb.comments.list() or { panic('Failed to list comments: ${err}') }
|
|
initial_count := initial_list.len
|
|
|
|
// Create multiple comments
|
|
mut comment1 := mydb.comments.new(
|
|
comment: 'First comment'
|
|
parent: 0
|
|
author: 700
|
|
) or { panic('Failed to create comment1: ${err}') }
|
|
|
|
mut comment2 := mydb.comments.new(
|
|
comment: 'Second comment'
|
|
parent: 0
|
|
author: 800
|
|
) or { panic('Failed to create comment2: ${err}') }
|
|
|
|
// Save both comments
|
|
mydb.comments.set(mut comment1) or { panic('Failed to save comment1: ${err}') }
|
|
mydb.comments.set(mut comment2) or { panic('Failed to save comment2: ${err}') }
|
|
|
|
// List comments
|
|
comment_list := mydb.comments.list() or { panic('Failed to list comments: ${err}') }
|
|
|
|
// Should have 2 more comments than initially
|
|
assert comment_list.len == initial_count + 2
|
|
|
|
// Find our comments in the list
|
|
mut found_comment1 := false
|
|
mut found_comment2 := false
|
|
|
|
for cmt in comment_list {
|
|
if cmt.comment == 'First comment' {
|
|
found_comment1 = true
|
|
assert cmt.author == 700
|
|
assert cmt.parent == 0
|
|
}
|
|
if cmt.comment == 'Second comment' {
|
|
found_comment2 = true
|
|
assert cmt.author == 800
|
|
assert cmt.parent == 0
|
|
}
|
|
}
|
|
|
|
assert found_comment1 == true
|
|
assert found_comment2 == true
|
|
}
|
|
|
|
fn test_comment_edge_cases() {
|
|
mut mydb := heromodels.new() or { panic('Failed to create DB: ${err}') }
|
|
|
|
// Test empty comment
|
|
mut empty_comment := mydb.comments.new(
|
|
comment: ''
|
|
parent: 0
|
|
author: 0
|
|
) or { panic('Failed to create empty comment: ${err}') }
|
|
|
|
mydb.comments.set(mut empty_comment) or { panic('Failed to save empty comment: ${err}') }
|
|
|
|
retrieved_empty := mydb.comments.get(empty_comment.id) or { panic('Failed to get empty comment: ${err}') }
|
|
assert retrieved_empty.comment == ''
|
|
assert retrieved_empty.parent == 0
|
|
assert retrieved_empty.author == 0
|
|
|
|
// Test very long comment
|
|
long_text := 'This is a very long comment. '.repeat(100)
|
|
mut long_comment := mydb.comments.new(
|
|
comment: long_text
|
|
parent: 12345
|
|
author: 99999
|
|
) or { panic('Failed to create long comment: ${err}') }
|
|
|
|
mydb.comments.set(mut long_comment) or { panic('Failed to save long comment: ${err}') }
|
|
|
|
retrieved_long := mydb.comments.get(long_comment.id) or { panic('Failed to get long comment: ${err}') }
|
|
assert retrieved_long.comment == long_text
|
|
assert retrieved_long.parent == 12345
|
|
assert retrieved_long.author == 99999
|
|
|
|
// Test comment with special characters
|
|
special_text := 'Comment with special chars: !@#$%^&*()_+-=[]{}|;:,.<>?/~`'
|
|
mut special_comment := mydb.comments.new(
|
|
comment: special_text
|
|
parent: 0
|
|
author: 1000
|
|
) or { panic('Failed to create special comment: ${err}') }
|
|
|
|
mydb.comments.set(mut special_comment) or { panic('Failed to save special comment: ${err}') }
|
|
|
|
retrieved_special := mydb.comments.get(special_comment.id) or { panic('Failed to get special comment: ${err}') }
|
|
assert retrieved_special.comment == special_text
|
|
assert retrieved_special.author == 1000
|
|
}
|