spec/query_spec.rb in rasti-db-1.5.0 vs spec/query_spec.rb in rasti-db-2.0.0
- old
+ new
@@ -1,23 +1,27 @@
require 'minitest_helper'
describe 'Query' do
before do
+ custom_db[:languages].insert name: 'Spanish'
+
1.upto(10) do |i|
db[:users].insert name: "User #{i}"
db[:people].insert user_id: i,
- document_number: i,
+ document_number: "document_#{i}",
first_name: "Name #{i}",
last_name: "Last Name #{i}",
- birth_date: Time.now
+ birth_date: Date.parse('2020-04-24')
+
+ db[:languages_people].insert language_id: 1, document_number: "document_#{i}"
end
- db[:posts].insert user_id: 2, title: 'Sample post', body: '...'
- db[:posts].insert user_id: 1, title: 'Another post', body: '...'
- db[:posts].insert user_id: 4, title: 'Best post', body: '...'
+ db[:posts].insert user_id: 2, title: 'Sample post', body: '...', language_id: 1
+ db[:posts].insert user_id: 1, title: 'Another post', body: '...', language_id: 1
+ db[:posts].insert user_id: 4, title: 'Best post', body: '...', language_id: 1
1.upto(3) { |i| db[:categories].insert name: "Category #{i}" }
db[:comments].insert post_id: 1, user_id: 5, text: 'Comment 1'
db[:comments].insert post_id: 1, user_id: 7, text: 'Comment 2'
@@ -28,16 +32,18 @@
db[:categories_posts].insert post_id: 2, category_id: 2
db[:categories_posts].insert post_id: 2, category_id: 3
db[:categories_posts].insert post_id: 3, category_id: 3
end
- let(:users_query) { Rasti::DB::Query.new collection_class: Users, dataset: db[:users] }
+ let(:users_query) { Rasti::DB::Query.new collection_class: Users, dataset: db[:users], environment: environment }
- let(:posts_query) { Rasti::DB::Query.new collection_class: Posts, dataset: db[:posts] }
+ let(:posts_query) { Rasti::DB::Query.new collection_class: Posts, dataset: db[:posts], environment: environment }
- let(:comments_query) { Rasti::DB::Query.new collection_class: Comments, dataset: db[:comments] }
+ let(:comments_query) { Rasti::DB::Query.new collection_class: Comments, dataset: db[:comments], environment: environment }
+ let(:languages_query) { Rasti::DB::Query.new collection_class: Languages, dataset: custom_db[:languages], environment: environment }
+
it 'Count' do
users_query.count.must_equal 10
end
it 'All' do
@@ -60,47 +66,69 @@
it 'Select attributes' do
posts_query.select_attributes(:id, :user_id).all.must_equal db[:posts].select(:id, :user_id).map { |r| Post.new r }
end
it 'Exclude attributes' do
- posts_query.exclude_attributes(:body).all.must_equal db[:posts].select(:id, :user_id, :title).map { |r| Post.new r }
+ posts_query.exclude_attributes(:body).all.must_equal db[:posts].select(:id, :user_id, :title, :language_id).map { |r| Post.new r }
end
it 'All attributes' do
posts_query.exclude_attributes(:body).all_attributes.all.must_equal db[:posts].map { |r| Post.new r }
end
it 'Select graph attributes' do
- person = Person.new db[:people].where(document_number: 2).select(:first_name, :last_name, :user_id).first
+ language = Language.new custom_db[:languages].where(id: 1).select(:id).first
+ person = Person.new db[:people].where(document_number: 'document_2').select(:document_number, :user_id).first.merge(languages: [language])
+
user = User.new db[:users].where(id: 2).select(:id).first.merge(person: person)
- post = Post.new db[:posts].where(id: 1).first.merge(user: user)
+ categories = db[:categories].where(id: [1,2]).select(:id).map { |c| Category.new c }
+ post = Post.new db[:posts].where(id: 1).first.merge(user: user, categories: categories)
+
+ selected_attributes = {
+ user: [:id],
+ 'user.person' => [:document_number, :user_id],
+ 'user.person.languages' => [:id],
+ categories: [:id]
+ }
+
posts_query.where(id: 1)
- .graph('user.person')
- .select_graph_attributes(user: [:id], 'user.person' => [:first_name, :last_name, :user_id])
+ .graph(*selected_attributes.keys)
+ .select_graph_attributes(selected_attributes)
.all
.must_equal [post]
end
it 'Exclude graph attributes' do
- person = Person.new db[:people].where(document_number: 2).select(:document_number, :last_name, :user_id).first
+ language = Language.new custom_db[:languages].where(id: 1).select(:id).first
+ person = Person.new db[:people].where(document_number: 'document_2').select(:document_number, :user_id).first.merge(languages: [language])
+
user = User.new db[:users].where(id: 2).select(:id).first.merge(person: person)
- post = Post.new db[:posts].where(id: 1).first.merge(user: user)
+ categories = db[:categories].where(id: [1,2]).select(:id).map { |c| Category.new c }
+ post = Post.new db[:posts].where(id: 1).first.merge(user: user, categories: categories)
+
+ excluded_attributes = {
+ user: [:name],
+ 'user.person' => [:first_name, :last_name, :birth_date],
+ 'user.person.languages' => [:name],
+ categories: [:name]
+ }
+
posts_query.where(id: 1)
- .graph('user.person')
- .exclude_graph_attributes(user: [:name], 'user.person' => [:first_name, :birth_date])
+ .graph(*excluded_attributes.keys)
+ .exclude_graph_attributes(excluded_attributes)
.all
.must_equal [post]
end
it 'All graph attributes' do
- person = Person.new db[:people].where(document_number: 2).first
+ person = Person.new db[:people].where(document_number: 'document_2').first
user = User.new db[:users].where(id: 2).select(:id).first.merge(person: person)
post = Post.new db[:posts].where(id: 1).first.merge(user: user)
@@ -139,21 +167,21 @@
]
end
it 'Order' do
posts_query.order(:title).all.must_equal [
- Post.new(id: 2, user_id: 1, title: 'Another post', body: '...'),
- Post.new(id: 3, user_id: 4, title: 'Best post', body: '...'),
- Post.new(id: 1, user_id: 2, title: 'Sample post', body: '...')
+ Post.new(id: 2, user_id: 1, title: 'Another post', body: '...', language_id: 1),
+ Post.new(id: 3, user_id: 4, title: 'Best post', body: '...', language_id: 1),
+ Post.new(id: 1, user_id: 2, title: 'Sample post', body: '...', language_id: 1)
]
end
it 'Reverse order' do
posts_query.reverse_order(:title).all.must_equal [
- Post.new(id: 1, user_id: 2, title: 'Sample post', body: '...'),
- Post.new(id: 3, user_id: 4, title: 'Best post', body: '...'),
- Post.new(id: 2, user_id: 1, title: 'Another post', body: '...')
+ Post.new(id: 1, user_id: 2, title: 'Sample post', body: '...', language_id: 1),
+ Post.new(id: 3, user_id: 4, title: 'Best post', body: '...', language_id: 1),
+ Post.new(id: 2, user_id: 1, title: 'Another post', body: '...', language_id: 1)
]
end
it 'Limit and offset' do
users_query.limit(1).offset(1).all.must_equal [User.new(id: 2, name: 'User 2')]
@@ -166,13 +194,38 @@
it 'Last' do
users_query.order(:id).last.must_equal User.new(id: 10, name: 'User 10')
end
it 'Graph' do
- users_query.graph(:posts).where(id: 1).first.must_equal User.new(id: 1, name: 'User 1', posts: [Post.new(id: 2, user_id: 1, title: 'Another post', body: '...')])
+ users_query.graph(:posts).where(id: 1).first.must_equal User.new(id: 1, name: 'User 1', posts: [Post.new(id: 2, user_id: 1, title: 'Another post', body: '...', language_id: 1)])
end
+ it 'Graph with multiple data sources' do
+ language = Language.new id: 1, name: 'Spanish'
+
+ person = Person.new user_id: 2,
+ document_number: 'document_2',
+ first_name: 'Name 2',
+ last_name: 'Last Name 2',
+ birth_date: Date.parse('2020-04-24'),
+ languages: [language]
+
+ user = User.new id: 2,
+ name: 'User 2',
+ person: person
+
+ post = Post.new id: 1,
+ user_id: 2,
+ user: user,
+ title: 'Sample post',
+ body: '...',
+ language_id: 1,
+ language: language
+
+ posts_query.where(id: 1).graph(:language, 'user.person.languages').first.must_equal post
+ end
+
it 'Any?' do
users_query.empty?.must_equal false
users_query.any?.must_equal true
end
@@ -206,32 +259,50 @@
it 'One to Many' do
users_query.join(:posts).where(title: 'Sample post').all.must_equal [User.new(id: 2, name: 'User 2')]
end
it 'Many to One' do
- posts_query.join(:user).where(name: 'User 4').all.must_equal [Post.new(id: 3, user_id: 4, title: 'Best post', body: '...')]
+ posts_query.join(:user).where(name: 'User 4').all.must_equal [Post.new(id: 3, user_id: 4, title: 'Best post', body: '...', language_id: 1)]
end
it 'One to One' do
- users_query.join(:person).where(document_number: 1).all.must_equal [User.new(id: 1, name: 'User 1')]
+ users_query.join(:person).where(document_number: 'document_1').all.must_equal [User.new(id: 1, name: 'User 1')]
end
it 'Many to Many' do
posts_query.join(:categories).where(name: 'Category 3').order(:id).all.must_equal [
- Post.new(id: 2, user_id: 1, title: 'Another post', body: '...'),
- Post.new(id: 3, user_id: 4, title: 'Best post', body: '...'),
+ Post.new(id: 2, user_id: 1, title: 'Another post', body: '...', language_id: 1),
+ Post.new(id: 3, user_id: 4, title: 'Best post', body: '...', language_id: 1),
]
end
it 'Nested' do
posts_query.join('categories', 'comments.user.person')
.where(Sequel[:categories][:name] => 'Category 2')
- .where(Sequel[:comments__user__person][:document_number] => 7)
+ .where(Sequel[:comments__user__person][:document_number] => 'document_7')
.all
- .must_equal [Post.new(id: 1, user_id: 2, title: 'Sample post', body: '...')]
+ .must_equal [Post.new(id: 1, user_id: 2, title: 'Sample post', body: '...', language_id: 1)]
end
+ describe 'Multiple data sources' do
+
+ it 'One to Many' do
+ error = proc { languages_query.join(:posts).all }.must_raise RuntimeError
+ error.message.must_equal 'Invalid join of multiple data sources: custom.languages > default.posts'
+ end
+
+ it 'Many to One' do
+ error = proc { posts_query.join(:language).all }.must_raise RuntimeError
+ error.message.must_equal 'Invalid join of multiple data sources: default.posts > custom.languages'
+ end
+
+ it 'Many to Many' do
+ error = proc { languages_query.join(:people).all }.must_raise RuntimeError
+ error.message.must_equal 'Invalid join of multiple data sources: custom.languages > default.people'
+ end
+ end
+
end
describe 'NQL' do
it 'Invalid expression' do
@@ -252,16 +323,16 @@
.sort
.must_equal [1, 2]
end
it 'Filter to 2nd order relation' do
- posts_query.nql('comments.user.person.document_number = 7')
+ posts_query.nql('comments.user.person.document_number = document_7')
.pluck(:id)
.must_equal [1]
end
it 'Filter combined' do
- posts_query.nql('(categories.id = 1 | categories.id = 3) & comments.user.person.document_number = 2')
+ posts_query.nql('(categories.id = 1 | categories.id = 3) & comments.user.person.document_number = document_2')
.pluck(:id)
.must_equal [2]
end
end
\ No newline at end of file