diff options
Diffstat (limited to 'spec/models/ml/model_spec.rb')
-rw-r--r-- | spec/models/ml/model_spec.rb | 73 |
1 files changed, 66 insertions, 7 deletions
diff --git a/spec/models/ml/model_spec.rb b/spec/models/ml/model_spec.rb index 397ea23dd85..42d8ed5c0c5 100644 --- a/spec/models/ml/model_spec.rb +++ b/spec/models/ml/model_spec.rb @@ -3,24 +3,27 @@ require 'spec_helper' RSpec.describe Ml::Model, feature_category: :mlops do + let_it_be(:project1) { create(:project) } + let_it_be(:project2) { create(:project) } + let_it_be(:existing_model) { create(:ml_models, name: 'an_existing_model', project: project1) } + let_it_be(:another_existing_model) { create(:ml_models, name: 'an_existing_model', project: project2) } + let_it_be(:valid_name) { 'a_valid_name' } + let_it_be(:default_experiment) { create(:ml_experiments, name: valid_name, project: project1) } + describe 'associations' do it { is_expected.to belong_to(:project) } it { is_expected.to have_one(:default_experiment) } it { is_expected.to have_many(:versions) } + it { is_expected.to have_one(:latest_version).class_name('Ml::ModelVersion').inverse_of(:model) } end describe '#valid?' do using RSpec::Parameterized::TableSyntax - let_it_be(:project) { create(:project) } - let_it_be(:existing_model) { create(:ml_models, name: 'an_existing_model', project: project) } - let_it_be(:valid_name) { 'a_valid_name' } - let_it_be(:default_experiment) { create(:ml_experiments, name: valid_name, project: project) } - let(:name) { valid_name } subject(:errors) do - m = described_class.new(name: name, project: project, default_experiment: default_experiment) + m = described_class.new(name: name, project: project1, default_experiment: default_experiment) m.validate m.errors end @@ -52,11 +55,67 @@ RSpec.describe Ml::Model, feature_category: :mlops do context 'when model version project is different than model project' do before do - allow(default_experiment).to receive(:project_id).and_return(project.id + 1) + allow(default_experiment).to receive(:project_id).and_return(project1.id + 1) end it { expect(errors).to include(:default_experiment) } end end + + describe '.by_project' do + subject { described_class.by_project(project1) } + + it { is_expected.to match_array([existing_model]) } + end + + describe '.including_latest_version' do + subject { described_class.including_latest_version } + + it 'loads latest version' do + expect(subject.first.association_cached?(:latest_version)).to be(true) + end + end + end + + describe '.find_or_create' do + subject(:find_or_create) { described_class.find_or_create(project, name, experiment) } + + let(:name) { existing_model.name } + let(:project) { existing_model.project } + let(:experiment) { default_experiment } + + context 'when model name does not exist in the project' do + let(:name) { 'new_model' } + let(:experiment) { build(:ml_experiments, name: name, project: project) } + + it 'creates a model', :aggregate_failures do + expect { find_or_create }.to change { Ml::Model.count }.by(1) + + expect(find_or_create.name).to eq(name) + expect(find_or_create.project).to eq(project) + expect(find_or_create.default_experiment).to eq(experiment) + end + end + + context 'when model name exists but project is different' do + let(:project) { create(:project) } + let(:experiment) { build(:ml_experiments, name: name, project: project) } + + it 'creates a model', :aggregate_failures do + expect { find_or_create }.to change { Ml::Model.count }.by(1) + + expect(find_or_create.name).to eq(name) + expect(find_or_create.project).to eq(project) + expect(find_or_create.default_experiment).to eq(experiment) + end + end + + context 'when model exists' do + it 'fetches existing model', :aggregate_failures do + expect { find_or_create }.not_to change { Ml::Model.count } + + expect(find_or_create).to eq(existing_model) + end + end end end |