From 4f07d4c06c68aba15003576dd4df62b1af3aa716 Mon Sep 17 00:00:00 2001 From: Christian Bruckmayer Date: Tue, 14 Feb 2017 19:16:21 +0100 Subject: [PATCH] [webui] Refactoring user requests datatables - Moved logic from controller to RequestsDatatable class - Fix request sorting ordering by column (introduced by 509370a) Fixes #2572 --- .../javascripts/webui/application.js.erb | 1 + .../javascripts/webui/application/user.js | 32 ++++ .../app/controllers/webui/user_controller.rb | 41 +---- .../webui/users/bs_requests_controller.rb | 14 ++ .../app/controllers/webui/webui_controller.rb | 20 --- src/api/app/helpers/webui/request_helper.rb | 12 ++ src/api/app/helpers/webui/webui_helper.rb | 8 +- src/api/app/models/bs_request/data_table.rb | 77 ++++++++++ .../app/models/bs_request/data_table_row.rb | 36 +++++ .../app/views/shared/_single_request.json.erb | 33 ---- .../app/views/webui/user/_requests.html.haml | 11 ++ src/api/app/views/webui/user/show.html.erb | 16 +- .../webui/users/bs_requests/index.json.erb | 21 +++ src/api/config/routes.rb | 9 +- .../controllers/webui/user_controller_spec.rb | 11 +- .../users/bs_requests_controller_spec.rb | 27 ++++ .../models/bs_request/data_table_row_spec.rb | 23 +++ .../spec/models/bs_request/data_table_spec.rb | 141 ++++++++++++++++++ .../spec/routing/webui/users/requests_spec.rb | 9 ++ .../webui/request_controller_test.rb | 6 +- 20 files changed, 428 insertions(+), 120 deletions(-) create mode 100644 src/api/app/assets/javascripts/webui/application/user.js create mode 100644 src/api/app/controllers/webui/users/bs_requests_controller.rb create mode 100644 src/api/app/models/bs_request/data_table.rb create mode 100644 src/api/app/models/bs_request/data_table_row.rb delete mode 100644 src/api/app/views/shared/_single_request.json.erb create mode 100644 src/api/app/views/webui/user/_requests.html.haml create mode 100644 src/api/app/views/webui/users/bs_requests/index.json.erb create mode 100644 src/api/spec/controllers/webui/users/bs_requests_controller_spec.rb create mode 100644 src/api/spec/models/bs_request/data_table_row_spec.rb create mode 100644 src/api/spec/models/bs_request/data_table_spec.rb create mode 100644 src/api/spec/routing/webui/users/requests_spec.rb diff --git a/src/api/app/assets/javascripts/webui/application.js.erb b/src/api/app/assets/javascripts/webui/application.js.erb index 778de483e19..a9d6f52ed93 100644 --- a/src/api/app/assets/javascripts/webui/application.js.erb +++ b/src/api/app/assets/javascripts/webui/application.js.erb @@ -38,6 +38,7 @@ //= require webui/application/attribute //= require webui/application/main //= require webui/application/repository_tab +//= require webui/application/user <% require_asset 'webui/application/image_templates' if Feature.active?(:image_templates) %> function remove_dialog() { diff --git a/src/api/app/assets/javascripts/webui/application/user.js b/src/api/app/assets/javascripts/webui/application/user.js new file mode 100644 index 00000000000..e7831a0721f --- /dev/null +++ b/src/api/app/assets/javascripts/webui/application/user.js @@ -0,0 +1,32 @@ +$( document ).ready(function() { + var url = $('.requests-datatable').first().data('source'); + var options = { + order: [[0,'desc']], + info: false, + columnDefs: [ + // We only allow ordering for created, requester and priority. + // Columns: created, source, target, requester, type, priority. + { orderable: false, targets: [1,2,4,6,] } + ], + paging: 25, + pagingType: "full_numbers", + processing: true, + serverSide: true, + ajax: { + url: url, + data: { dataTableId: null } + } + }; + + options.ajax.data.dataTableId = 'requests_in_table'; + $('#requests_in_table').dataTable(options); + + options.ajax.data.dataTableId = 'requests_out_table'; + $('#requests_out_table').dataTable(options); + + options.ajax.data.dataTableId = 'requests_declined_table'; + $('#requests_declined_table').dataTable(options); + + options.ajax.data.dataTableId = 'all_requests_table'; + $('#all_requests_table').dataTable(options); +}); diff --git a/src/api/app/controllers/webui/user_controller.rb b/src/api/app/controllers/webui/user_controller.rb index ad7512b3ebe..2afc5a714d5 100644 --- a/src/api/app/controllers/webui/user_controller.rb +++ b/src/api/app/controllers/webui/user_controller.rb @@ -2,7 +2,7 @@ require 'event' class Webui::UserController < Webui::WebuiController - before_action :check_display_user, only: [:show, :edit, :requests, :list_my, :delete, :save, :confirm, :admin, :lock] + before_action :check_display_user, only: [:show, :edit, :list_my, :delete, :save, :confirm, :admin, :lock] before_action :require_login, only: [:edit, :save, :notifications, :update_notifications, :index] before_action :require_admin, only: [:edit, :delete, :lock, :confirm, :admin, :index] @@ -71,45 +71,6 @@ def home end end - # Request from the user - def requests - sortable_fields = { - 0 => :created_at, - 3 => :creator, - 5 => :priority - } - sorting_field = sortable_fields[params['order[0][column]'].to_i] - sorting_field ||= :created_at - sorting_dir = params['order[0][dir]'].try(:to_sym) - sorting_dir = :asc unless ["asc", "desc"].include?(params['order[0][dir]']) - search = params[:search] ? params[:search].permit![:value] : "" - request_methods = { - 'all_requests_table' => :requests, - 'requests_out_table' => :outgoing_requests, - 'requests_declined_table' => :declined_requests, - 'requests_in_table' => :incoming_requests, - 'reviews_in_table' => :involved_reviews - } - # Depending on the table that is requesting we call the appropiate user method - request_method = request_methods[params[:dataTableId]] || :requests - @requests = @displayed_user.send(request_method, search) - @requests_count = @requests.count - @requests = @requests.offset(params[:start].to_i).limit(params[:length].to_i).reorder(sorting_field => sorting_dir) - respond_to do |format| - # For jquery dataTable - format.json { - render_json_response_for_dataTable( - draw: params[:draw].to_i + 1, - total_records_count: @displayed_user.send(request_method).count, - total_filtered_records_count: @requests_count, - records: @requests.includes(:bs_request_actions) - ) do |request| - render_to_string(partial: "shared/single_request.json", locals: { req: request, no_target: true, hide_state: true }).to_s.split(',') - end - } - end - end - def save unless User.current.is_admin? if User.current != @displayed_user diff --git a/src/api/app/controllers/webui/users/bs_requests_controller.rb b/src/api/app/controllers/webui/users/bs_requests_controller.rb new file mode 100644 index 00000000000..b890be4404a --- /dev/null +++ b/src/api/app/controllers/webui/users/bs_requests_controller.rb @@ -0,0 +1,14 @@ +module Webui + module Users + class BsRequestsController < WebuiController + before_action :check_display_user + + def index + @requests_data_table = BsRequest::DataTable.new(params, @displayed_user) + respond_to do |format| + format.json + end + end + end + end +end diff --git a/src/api/app/controllers/webui/webui_controller.rb b/src/api/app/controllers/webui/webui_controller.rb index f01601d185d..ce29569402f 100644 --- a/src/api/app/controllers/webui/webui_controller.rb +++ b/src/api/app/controllers/webui/webui_controller.rb @@ -114,26 +114,6 @@ def valid_xml_id(rawid) protected - # Renders a json response for jquery dataTables - def render_json_response_for_dataTable(options) - options[:draw] ||= 1 - options[:total_records_count] ||= 0 - options[:total_displayed_records] ||= 0 - response = { - draw: options[:draw].to_i, - recordsTotal: options[:total_records_count].to_i, - recordsFiltered: options[:total_filtered_records_count].to_i, - data: options[:records].map do |record| - if block_given? - yield record - else - record - end - end - } - render json: Yajl::Encoder.encode(response) - end - def require_login if User.current.nil? || User.current.is_nobody? render(text: 'Please login') && (return false) if request.xhr? diff --git a/src/api/app/helpers/webui/request_helper.rb b/src/api/app/helpers/webui/request_helper.rb index 25356f9f230..4237836fe91 100644 --- a/src/api/app/helpers/webui/request_helper.rb +++ b/src/api/app/helpers/webui/request_helper.rb @@ -81,4 +81,16 @@ def priority_number(prio) "4" end end + + def target_project_link(row) + result = '' + if row.target_project + if row.target_package && row.source_package != row.target_package + result = project_or_package_link(project: row.target_project, package: row.target_package, trim_to: 40, short: true) + else + result = project_or_package_link(project: row.target_project, trim_to: 40, short: true) + end + end + result + end end diff --git a/src/api/app/helpers/webui/webui_helper.rb b/src/api/app/helpers/webui/webui_helper.rb index 5e4695334a9..1f6e42f6185 100644 --- a/src/api/app/helpers/webui/webui_helper.rb +++ b/src/api/app/helpers/webui/webui_helper.rb @@ -36,7 +36,7 @@ def user_icon(user, size = 20, css_class = nil, alt = nil) user = User.find_by_login!(user) unless user.is_a? User alt ||= user.realname alt = user.login if alt.empty? - image_tag(url_for(controller: :user, action: :user_icon, icon: user.login, size: size), + image_tag(url_for(controller: '/webui/user', action: :user_icon, icon: user.login, size: size), width: size, height: size, alt: alt, class: css_class) end @@ -300,13 +300,13 @@ def link_to_package(prj, pkg, opts) opts[:short] = true # for project out += link_to_project(prj, opts) + ' / ' + link_to_if(pkg, opts[:package_text], - { controller: 'package', action: 'show', + { controller: '/webui/package', action: 'show', project: opts[:project], package: opts[:package] }, { class: 'package', title: opts[:package] }) if opts[:rev] && pkg out += ' ('.html_safe + link_to("revision #{elide(opts[:rev], 10)}", - { controller: 'package', action: 'show', + { controller: '/webui/package', action: 'show', project: opts[:project], package: opts[:package], rev: opts[:rev] }, { class: 'package', title: opts[:rev] }) + ')'.html_safe end @@ -322,7 +322,7 @@ def link_to_project(prj, opts) end project_text = opts[:trim_to].nil? ? opts[:project_text] : elide(opts[:project_text], opts[:trim_to]) out + link_to_if(prj, project_text, - { controller: 'project', action: 'show', project: opts[:project] }, + { controller: '/webui/project', action: 'show', project: opts[:project] }, { class: 'project', title: opts[:project] }) end diff --git a/src/api/app/models/bs_request/data_table.rb b/src/api/app/models/bs_request/data_table.rb new file mode 100644 index 00000000000..e6b3022f48c --- /dev/null +++ b/src/api/app/models/bs_request/data_table.rb @@ -0,0 +1,77 @@ +class BsRequest + class DataTable + def initialize(params, user) + @params = params + @user = user + end + + def rows + requests.map { |request| BsRequest::DataTableRow.new(request) } + end + + def draw + @params[:draw].to_i + 1 + end + + def records_total + requests_query.count + end + + def count_requests + requests_query(search).count + end + + private + + def requests + @requests ||= fetch_requests + end + + def requests_query(search = nil) + request_methods = { + 'all_requests_table' => :requests, + 'requests_out_table' => :outgoing_requests, + 'requests_declined_table' => :declined_requests, + 'requests_in_table' => :incoming_requests, + 'reviews_in_table' => :involved_reviews + } + + request_method = request_methods[@params[:dataTableId]] || :requests + @user.send(request_method, search) + end + + def fetch_requests + requests_query(search).offset(offset).limit(limit).reorder(sort_column => sort_direction).includes(:bs_request_actions) + end + + def search + @params[:search] ? @params[:search][:value] : '' + end + + def offset + @params[:start].to_i + end + + def limit + @params[:length].to_i + end + + def order_params + @params.fetch(:order, {}).fetch('0', {}) + end + + def sort_column + # defaults to :created_at + { + 0 => :created_at, + 3 => :creator, + 5 => :priority + }[order_params.fetch(:column, nil).to_i] + end + + def sort_direction + # defaults to :desc + order_params[:dir].try(:to_sym) == :asc ? :asc : :desc + end + end +end diff --git a/src/api/app/models/bs_request/data_table_row.rb b/src/api/app/models/bs_request/data_table_row.rb new file mode 100644 index 00000000000..6e2c7c5961a --- /dev/null +++ b/src/api/app/models/bs_request/data_table_row.rb @@ -0,0 +1,36 @@ +class BsRequest + class DataTableRow + attr_accessor :request + delegate :created_at, :number, :creator, :priority, to: :request + + def initialize(request) + @request = request + end + + def source_package + cache[:source_package] + end + + def source_project + cache[:source_project] + end + + def request_type + cache[:request_type] + end + + def target_project + cache[:target_project] + end + + def target_package + cache[:target_package] + end + + private + + def cache + @cache ||= ApplicationController.helpers.common_parts(request) + end + end +end diff --git a/src/api/app/views/shared/_single_request.json.erb b/src/api/app/views/shared/_single_request.json.erb deleted file mode 100644 index 0907f8ef990..00000000000 --- a/src/api/app/views/shared/_single_request.json.erb +++ /dev/null @@ -1,33 +0,0 @@ -<% elide_len ||= no_target ? 80 : 40 - cp = common_parts(req) - source_package = cp[:source_package] - source_project = cp[:source_project] - request_type = cp[:request_type] - target_package = cp[:target_package] - target_project = cp[:target_project] --%> -<%= fuzzy_time(req.created_at, false) %>, -<%= project_or_package_link(project: source_project, package: source_package, creator: req.creator, trim_to: elide_len, short: true) %>, -<% if target_project %> - <% if !@project || @project.name != target_project %> - <% if target_package && source_package != target_package %> - <%= project_or_package_link(project: target_project, package: target_package, trim_to: elide_len, short: true) %> - <% else %> - <%= project_or_package_link(project: target_project, trim_to: elide_len, short: true) %> - <% end %> - <% else %> - <% if target_package %> - <%= project_or_package_link(project: target_project, package: target_package, trim_to: elide_len, short: true) %> - <% elsif request_type == :delete %> - This project - <% end %> - <% end %> -<% end %>, -<%= user_with_realname_and_icon(req['creator'], short: true) %>, -<%= request_type %>, - <% if !hide_state %> - <%= req.state %>, - <% end %> -<%= req.priority %>, -<%= link_to(sprite_tag('req-showdiff', title: "Show request ##{req.number}"), - { :controller => :request, :action => :show, :number => req.number }, { :class => 'request_link' }) %> diff --git a/src/api/app/views/webui/user/_requests.html.haml b/src/api/app/views/webui/user/_requests.html.haml new file mode 100644 index 00000000000..7160563a2b7 --- /dev/null +++ b/src/api/app/views/webui/user/_requests.html.haml @@ -0,0 +1,11 @@ +%table.requests-datatable.compact{ 'data-source' => user_requests_path(@displayed_user), id: id, width: '100%'} + %thead + %tr + %th Created + %th Source + %th Target + %th Requester + %th Type + %th Priority + %th +%tbody diff --git a/src/api/app/views/webui/user/show.html.erb b/src/api/app/views/webui/user/show.html.erb index 9a23958ac73..c8e35fb0ee9 100644 --- a/src/api/app/views/webui/user/show.html.erb +++ b/src/api/app/views/webui/user/show.html.erb @@ -148,23 +148,23 @@
- <%= render(:partial => 'shared/requests', :locals => { :request_table_id => 'requests_in_table', :hide_state => true, :serverProcessing => true }) %> + <%= render(partial: 'requests', locals: { id: 'requests_in_table' }) %>
- <%= render(:partial => 'shared/requests', :locals => { :request_table_id => 'requests_out_table', :hide_state => true, :serverProcessing => true }) %> + <%= render(partial: 'requests', locals: { id: 'requests_out_table' }) %>
- <%= render(:partial => 'shared/requests', :locals => { :request_table_id => 'requests_declined_table', :hide_state => true, :serverProcessing => true }) %> + <%= render(partial: 'requests', locals: { id: 'requests_declined_table' }) %>
- <%= render(:partial => 'shared/requests', :locals => { :request_table_id => 'all_requests_table', :hide_state => true, :serverProcessing => true }) %> + <%= render(partial: 'requests', locals: { id: 'all_requests_table' }) %>
diff --git a/src/api/app/views/webui/users/bs_requests/index.json.erb b/src/api/app/views/webui/users/bs_requests/index.json.erb new file mode 100644 index 00000000000..bde6c3c9e43 --- /dev/null +++ b/src/api/app/views/webui/users/bs_requests/index.json.erb @@ -0,0 +1,21 @@ +{ + "draw": "<%= @requests_data_table.draw %>", + "recordsTotal": "<%= @requests_data_table.records_total %>", + "recordsFiltered": "<%= @requests_data_table.count_requests %>", + "data": [ + <% @requests_data_table.rows.each.with_index do |row,index | %> + [ + "<%= escape_javascript(fuzzy_time(row.created_at, false)) %>", + "<%= escape_javascript(project_or_package_link(project: row.source_project, package: row.source_package, creator: row.creator, trim_to: 40, short: true)) %>", + "<%= escape_javascript(target_project_link(row)) %>", + "<%= escape_javascript(user_with_realname_and_icon(row.creator, short: true)) %>", + "<%= escape_javascript(row.request_type) %>", + "<%= escape_javascript(row.priority) %>", + "<%= escape_javascript(link_to(sprite_tag('req-showdiff', title: "Show request ##{row.number}"), request_show_path(row.number), { class: :request_link })) %>" + ] + <% unless index == @requests_data_table.rows.length - 1 %> + , + <% end %> + <% end %> + ] +} diff --git a/src/api/config/routes.rb b/src/api/config/routes.rb index 2e8e609076b..22145757031 100644 --- a/src/api/config/routes.rb +++ b/src/api/config/routes.rb @@ -316,16 +316,21 @@ def self.public_or_about_path?(request) get 'user/show/:user' => :show, constraints: cons, as: 'user_show' get 'user/icon/:icon' => :user_icon, constraints: cons, as: 'user_icon' - get 'user/requests/:user' => :requests, constraints: cons, as: 'user_requests' # Only here to make old /home url's work get 'home/' => :home, as: 'home' get 'home/my_work' => :home get 'home/list_my' => :home - get 'home/requests' => :requests get 'home/home_project' => :home_project get 'user/:user/icon' => :icon, constraints: cons end + # Hardcoding this routes is necessary because we rely on the :user parameter + # in check_display_user before filter. Overwriting of the parameter is not + # possible for nested resources atm. + controller 'webui/users/bs_requests' do + get 'users/(:user)/requests' => :index, as: 'user_requests' + end + controller 'webui/groups' do get 'groups' => :index get 'group/show/:title' => :show, constraints: {:title => /[^\/]*/}, as: 'group_show' diff --git a/src/api/spec/controllers/webui/user_controller_spec.rb b/src/api/spec/controllers/webui/user_controller_spec.rb index 292410f4183..015857a48a2 100644 --- a/src/api/spec/controllers/webui/user_controller_spec.rb +++ b/src/api/spec/controllers/webui/user_controller_spec.rb @@ -5,7 +5,7 @@ let!(:non_admin_user) { create(:confirmed_user, login: "moi") } let!(:admin_user) { create(:admin_user, login: "king") } let(:deleted_user) { create(:deleted_user) } - let!(:non_admin_user_request) { create(:bs_request, creator: non_admin_user, commenter: non_admin_user) } + let!(:non_admin_user_request) { create(:bs_request, priority: 'critical', creator: non_admin_user, commenter: non_admin_user) } it { is_expected.to use_before_action(:require_login) } it { is_expected.to use_before_action(:require_admin) } @@ -107,15 +107,6 @@ skip end - describe "GET #requests" do - before { login non_admin_user } - - it 'renders the requests as json' do - get :requests, { format: :json } - expect(response.body).to eq({ draw: 1, recordsTotal: 1, recordsFiltered: 1, data: [] }.to_json) - end - end - describe "POST #save" do context "when user is updating its own profile" do context "with valid data" do diff --git a/src/api/spec/controllers/webui/users/bs_requests_controller_spec.rb b/src/api/spec/controllers/webui/users/bs_requests_controller_spec.rb new file mode 100644 index 00000000000..ce2ab6b7e44 --- /dev/null +++ b/src/api/spec/controllers/webui/users/bs_requests_controller_spec.rb @@ -0,0 +1,27 @@ +require 'rails_helper' + +RSpec.describe Webui::Users::BsRequestsController do + let(:user) { create(:confirmed_user, login: "tom") } + + it { is_expected.to use_before_action(:check_display_user) } + + describe 'GET #index' do + before do + get :index, user: user, format: :json, length: 10, start: 0 + end + + it { expect(response).to have_http_status(:success) } + it { expect(subject).to render_template(:index) } + + context 'with several requests belonging to different users' do + let(:another_user) { create(:confirmed_user, login: "moi") } + let!(:bs_request) { create(:bs_request, creator: user, commenter: user) } + let!(:another_bs_request) { create(:bs_request, creator: another_user, commenter: another_user) } + + it 'only renders requests belonging to the user' do + expect(assigns(:requests_data_table).rows.first.created_at).to eq(bs_request.created_at) + expect(assigns(:requests_data_table).rows.length).to eq(1) + end + end + end +end diff --git a/src/api/spec/models/bs_request/data_table_row_spec.rb b/src/api/spec/models/bs_request/data_table_row_spec.rb new file mode 100644 index 00000000000..e4d9a0889b0 --- /dev/null +++ b/src/api/spec/models/bs_request/data_table_row_spec.rb @@ -0,0 +1,23 @@ +require 'rails_helper' + +RSpec.describe BsRequest::DataTableRow do + let!(:user) { create(:confirmed_user, login: 'moi') } + let(:request) { create(:bs_request) } + let(:row) { BsRequest::DataTableRow .new(request) } + + describe '#created_at' do + it { expect(row.created_at).to eq(request.created_at) } + end + + describe '#priority' do + it { expect(row.priority).to eq(request.priority) } + end + + describe '#number' do + it { expect(row.number).to eq(request.number) } + end + + describe '#creator' do + it { expect(row.creator).to eq(request.creator) } + end +end diff --git a/src/api/spec/models/bs_request/data_table_spec.rb b/src/api/spec/models/bs_request/data_table_spec.rb new file mode 100644 index 00000000000..f606947f305 --- /dev/null +++ b/src/api/spec/models/bs_request/data_table_spec.rb @@ -0,0 +1,141 @@ +require 'rails_helper' + +RSpec.describe BsRequest::DataTable do + let!(:user) { create(:confirmed_user, login: 'moi') } + let(:source_project) { create(:project_with_package) } + let(:source_package) { source_project.packages.first } + let(:target_project) { create(:project_with_package) } + let(:target_package) { target_project.packages.first } + let!(:request_one) do + create(:bs_request_with_submit_action, + creator: user, + priority: 'critical', + source_project: source_project, + source_package: source_package, + target_project: target_project, + target_package: target_package) + end + let!(:request_two) do + create(:bs_request_with_submit_action, + created_at: 2.days.ago, + creator: user, + source_project: source_project, + source_package: source_package, + target_project: target_project, + target_package: target_package) + end + + describe '#rows' do + context 'with no :order parameter' do + let(:rows) do + BsRequest::DataTable.new({ length: 10, start: 0 }, user).rows + end + + it 'defaults to sort by :created_at :desc' do + expect(rows.first.created_at).to eq(request_one.created_at) + expect(rows.second.created_at).to eq(request_two.created_at) + end + end + + context 'with :order parameter set to :asc direction' do + let(:rows) do + BsRequest::DataTable.new({ length: 10, start: 0, order: { '0' => { dir: :asc } } }, user).rows + end + + it 'respects sort by :asc direction parameter' do + expect(rows.first.created_at).to eq(request_two.created_at) + expect(rows.second.created_at).to eq(request_one.created_at) + end + end + + context 'with :order parameter set to a column number' do + let(:rows) do + BsRequest::DataTable.new({ length: 10, start: 0, order: { '0' => { column: 5 } } }, user).rows + end + + it 'respects sort by column priority parameter' do + expect(rows.first.priority).to eq('moderate') + expect(rows.second.priority).to eq('critical') + end + end + + context 'with a search value parameter set' do + let(:rows) do + BsRequest::DataTable.new({ length: 10, start: 0, search: { value: 'critical' } }, user).rows + end + + it 'respects sort by column priority parameter' do + expect(rows.length).to eq(1) + expect(rows.first.priority).to eq('critical') + end + end + + context 'with many requests' do + let!(:bs_requests) do + create_list(:bs_request_with_submit_action, + 9, + created_at: 1.day.ago, + creator: user, + source_project: source_project, + source_package: source_package, + target_project: target_project, + target_package: target_package) + end + + context 'with :length parameter set to 10 and :start set to 0' do + let(:rows) { BsRequest::DataTable.new({ length: 10, start: 0 }, user).rows } + + it 'returns an array containing the first 10 requests' do + expect(rows.length).to eq(10) + expect(rows.first.created_at).to eq(request_one.created_at) + end + end + + context 'with :length parameter set to 10 and :start set to 10' do + let(:rows) { BsRequest::DataTable.new({ length: 10, start: 10 }, user).rows } + + it 'returns an array containing the last request' do + expect(rows.length).to eq(1) + expect(rows.first.created_at).to eq(request_two.created_at) + end + end + end + end + + describe '#draw' do + let(:request_data_table) { BsRequest::DataTable.new({ draw: 3 }, user) } + + subject { request_data_table.draw } + + it { is_expected.to eq(4) } + end + + describe '#records_total' do + let(:request_data_table) { BsRequest::DataTable.new({ search: { value: 'critical' } }, user) } + + context 'with many requests' do + let!(:bs_requests) do + create_list(:bs_request_with_submit_action, + 9, + created_at: 1.day.ago, + creator: user, + source_project: source_project, + source_package: source_package, + target_project: target_project, + target_package: target_package) + end + + subject { request_data_table.records_total } + + it { is_expected.to eq(11) } + end + end + + describe '#count_requests' do + let(:request_data_table) { BsRequest::DataTable.new({ search: { value: 'critical' } }, user) } + + subject { request_data_table.count_requests } + + it { is_expected.to eq(1) } + end +end diff --git a/src/api/spec/routing/webui/users/requests_spec.rb b/src/api/spec/routing/webui/users/requests_spec.rb new file mode 100644 index 00000000000..c9e61f04a16 --- /dev/null +++ b/src/api/spec/routing/webui/users/requests_spec.rb @@ -0,0 +1,9 @@ +require 'rails_helper' + +RSpec.describe '/users/:user/requests routes' do + let(:user) { Faker::Name.first_name } + it do + expect(get("/users/#{user}/requests")) + .to route_to('webui/users/bs_requests#index', user: user) + end +end diff --git a/src/api/test/functional/webui/request_controller_test.rb b/src/api/test/functional/webui/request_controller_test.rb index 97f0c058315..79ecbf22a53 100644 --- a/src/api/test/functional/webui/request_controller_test.rb +++ b/src/api/test/functional/webui/request_controller_test.rb @@ -293,11 +293,11 @@ def test_requests_display_as_king # spec/controllers/webui/request_controller_sp end def test_requests # spec/controllers/webui/user_controller_spec.rb - get "/home/requests.json" + get "/users/requests.json" assert_response :success result = ActiveSupport::JSON.decode(@response.body) - assert_equal 1, result["draw"] - assert_equal 0, result["recordsTotal"] + assert_equal "1", result["draw"] + assert_equal "0", result["recordsTotal"] assert_equal [], result["data"] end