diff options
Diffstat (limited to 'spec/requests/projects/ml/models_controller_spec.rb')
-rw-r--r-- | spec/requests/projects/ml/models_controller_spec.rb | 74 |
1 files changed, 70 insertions, 4 deletions
diff --git a/spec/requests/projects/ml/models_controller_spec.rb b/spec/requests/projects/ml/models_controller_spec.rb index 8569f2396d3..b4402ad9a27 100644 --- a/spec/requests/projects/ml/models_controller_spec.rb +++ b/spec/requests/projects/ml/models_controller_spec.rb @@ -3,13 +3,15 @@ require 'spec_helper' RSpec.describe Projects::Ml::ModelsController, feature_category: :mlops do - let_it_be(:project) { create(:project, :repository) } + let_it_be(:project) { create(:project) } let_it_be(:user) { project.first_owner } let_it_be(:model1) { create(:ml_models, :with_versions, project: project) } let_it_be(:model2) { create(:ml_models, project: project) } + let_it_be(:model3) { create(:ml_models, project: project) } let_it_be(:model_in_different_project) { create(:ml_models) } let(:model_registry_enabled) { true } + let(:params) { {} } before do allow(Ability).to receive(:allowed?).and_call_original @@ -39,7 +41,7 @@ RSpec.describe Projects::Ml::ModelsController, feature_category: :mlops do it 'fetches the correct models' do index_request - expect(assigns(:models)).to match_array([model1, model2]) + expect(assigns(:paginator).records).to match_array([model3, model2, model1]) end it 'does not perform N+1 sql queries' do @@ -58,11 +60,75 @@ RSpec.describe Projects::Ml::ModelsController, feature_category: :mlops do is_expected.to have_gitlab_http_status(:not_found) end end + + describe 'pagination' do + before do + stub_const("Projects::Ml::ModelsController::MAX_MODELS_PER_PAGE", 2) + end + + it 'paginates', :aggregate_failures do + list_models + + paginator = assigns(:paginator) + + expect(paginator.records).to match_array([model3, model2]) + + list_models({ cursor: paginator.cursor_for_next_page }) + + expect(assigns(:paginator).records.first).to eq(model1) + end + end + end + + describe 'show' do + let(:model_id) { model1.id } + let(:request_project) { model1.project } + + subject(:show_request) do + show_model + response + end + + before do + show_request + end + + it 'renders the template' do + is_expected.to render_template('projects/ml/models/show') + end + + it 'fetches the correct model' do + show_request + + expect(assigns(:model)).to eq(model1) + end + + context 'when model id does not exist' do + let(:model_id) { non_existing_record_id } + + it { is_expected.to have_gitlab_http_status(:not_found) } + end + + context 'when model project does not match project id' do + let(:request_project) { model_in_different_project.project } + + it { is_expected.to have_gitlab_http_status(:not_found) } + end + + context 'when user does not have access' do + let(:model_registry_enabled) { false } + + it { is_expected.to have_gitlab_http_status(:not_found) } + end end private - def list_models - get project_ml_models_path(project) + def list_models(new_params = nil) + get project_ml_models_path(project), params: new_params || params + end + + def show_model + get project_ml_model_path(request_project, model_id) end end |