test: add orm store, model, and relation tests
This commit is contained in:
1 parent
d321e2fd1e
commit
703f6cd845
3 files changed
+279
No files matched your search
@@ -0,0 +1,116 @@
|
||||
require 'minitest/autorun'
|
||||
require 'prism'
|
||||
require 'tmpdir'
|
||||
|
||||
class OrmStoreTest < Minitest::Test
|
||||
def setup
|
||||
@dir = Dir.mktmpdir('prism-store')
|
||||
@path = File.join(@dir, 'test.pstore')
|
||||
@store = Prism::Orm::Store.new(@path)
|
||||
end
|
||||
|
||||
def teardown
|
||||
FileUtils.remove_entry(@dir)
|
||||
end
|
||||
|
||||
def test_create_table_and_insert
|
||||
@store.create_table(:users, %w[id name])
|
||||
id = @store.insert(:users, name: 'foksiu')
|
||||
assert_equal 1, id
|
||||
assert_equal({ 'id' => 1, 'name' => 'foksiu' }, @store.find(:users, 1))
|
||||
end
|
||||
|
||||
def test_create_table_twice_raises
|
||||
@store.create_table(:users, %w[id name])
|
||||
assert_raises(Prism::Orm::Store::TableExists) { @store.create_table(:users, %w[id name]) }
|
||||
end
|
||||
|
||||
def test_insert_assigns_incrementing_ids
|
||||
@store.create_table(:users, %w[id name])
|
||||
first = @store.insert(:users, name: 'a')
|
||||
second = @store.insert(:users, name: 'b')
|
||||
assert_equal 1, first
|
||||
assert_equal 2, second
|
||||
end
|
||||
|
||||
def test_update_merges_attributes
|
||||
@store.create_table(:users, %w[id name role])
|
||||
id = @store.insert(:users, name: 'foksiu', role: 'admin')
|
||||
@store.update(:users, id, role: 'owner')
|
||||
row = @store.find(:users, id)
|
||||
assert_equal 'foksiu', row['name']
|
||||
assert_equal 'owner', row['role']
|
||||
end
|
||||
|
||||
def test_update_missing_record_raises
|
||||
@store.create_table(:users, %w[id name])
|
||||
assert_raises(Prism::Orm::Store::RecordNotFound) { @store.update(:users, 999, name: 'nope') }
|
||||
end
|
||||
|
||||
def test_delete_removes_row
|
||||
@store.create_table(:users, %w[id name])
|
||||
id = @store.insert(:users, name: 'foksiu')
|
||||
@store.delete(:users, id)
|
||||
assert_nil @store.find(:users, id)
|
||||
end
|
||||
|
||||
def test_all_returns_every_row
|
||||
@store.create_table(:users, %w[id name])
|
||||
@store.insert(:users, name: 'a')
|
||||
@store.insert(:users, name: 'b')
|
||||
assert_equal ['a', 'b'], @store.all(:users).map { |row| row['name'] }
|
||||
end
|
||||
|
||||
def test_count
|
||||
@store.create_table(:users, %w[id name])
|
||||
@store.insert(:users, name: 'a')
|
||||
@store.insert(:users, name: 'b')
|
||||
assert_equal 2, @store.count(:users)
|
||||
end
|
||||
|
||||
def test_unknown_table_raises
|
||||
assert_raises(Prism::Orm::Store::UnknownTable) { @store.find(:ghosts, 1) }
|
||||
end
|
||||
|
||||
def test_add_column_defaults_existing_rows
|
||||
@store.create_table(:users, %w[id name])
|
||||
id = @store.insert(:users, name: 'foksiu')
|
||||
@store.add_column(:users, :active, default: true)
|
||||
assert_equal true, @store.find(:users, id)['active']
|
||||
assert_includes @store.columns(:users), 'active'
|
||||
end
|
||||
|
||||
def test_remove_column_strips_existing_rows
|
||||
@store.create_table(:users, %w[id name role])
|
||||
id = @store.insert(:users, name: 'foksiu', role: 'admin')
|
||||
@store.remove_column(:users, :role)
|
||||
refute @store.find(:users, id).key?('role')
|
||||
refute_includes @store.columns(:users), 'role'
|
||||
end
|
||||
|
||||
def test_drop_table
|
||||
@store.create_table(:users, %w[id name])
|
||||
@store.drop_table(:users)
|
||||
refute @store.table_exists?(:users)
|
||||
end
|
||||
|
||||
def test_migration_bookkeeping
|
||||
assert_empty @store.applied_migrations
|
||||
@store.record_migration('20260101000000')
|
||||
assert_equal ['20260101000000'], @store.applied_migrations
|
||||
@store.record_migration('20260101000000')
|
||||
assert_equal ['20260101000000'], @store.applied_migrations, 'recording twice must not duplicate'
|
||||
@store.forget_migration('20260101000000')
|
||||
assert_empty @store.applied_migrations
|
||||
end
|
||||
|
||||
def test_data_survives_reopening_the_store
|
||||
@store.create_table(:users, %w[id name])
|
||||
@store.insert(:users, name: 'persisted-foksiu')
|
||||
|
||||
reopened = Prism::Orm::Store.new(@path)
|
||||
row = reopened.find(:users, 1)
|
||||
refute_nil row
|
||||
assert_equal 'persisted-foksiu', row['name']
|
||||
end
|
||||
end
|
||||
Reference in new issue
Block a user