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