Merge pull request #992 from ZmagoD/zd_SCI_2015

setup models for repository list column [fixes SCI-2015]
This commit is contained in:
Zmago Devetak 2018-02-12 10:59:20 +01:00 committed by GitHub
commit ccba5d3eb3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 255 additions and 2 deletions

View file

@ -11,6 +11,7 @@ class Repository < ApplicationRecord
has_many :repository_table_states,
inverse_of: :repository, dependent: :destroy
has_many :report_elements, inverse_of: :repository, dependent: :destroy
has_many :repository_list_items, inverse_of: :repository, dependent: :destroy
auto_strip_attributes :name, nullify: false
validates :name,

View file

@ -6,6 +6,7 @@ class RepositoryColumn < ApplicationRecord
optional: true
has_many :repository_cells, dependent: :destroy
has_many :repository_rows, through: :repository_cells
has_many :repository_list_items, dependent: :destroy
enum data_type: Extends::REPOSITORY_DATA_TYPES

View file

@ -0,0 +1,15 @@
class RepositoryListItem < ApplicationRecord
has_many :repository_list_values, inverse_of: :repository_list_item
belongs_to :repository, inverse_of: :repository_list_items
belongs_to :repository_column, inverse_of: :repository_list_items
belongs_to :created_by,
foreign_key: :created_by_id,
class_name: 'User'
belongs_to :last_modified_by,
foreign_key: :last_modified_by_id,
class_name: 'User'
validates :data,
presence: true,
uniqueness: { scope: :repository_column, case_sensitive: false },
length: { maximum: Constants::TEXT_MAX_LENGTH }
end

View file

@ -0,0 +1,19 @@
class RepositoryListValue < ApplicationRecord
belongs_to :repository_list_item,
optional: true
belongs_to :created_by,
foreign_key: :created_by_id,
class_name: 'User'
belongs_to :last_modified_by,
foreign_key: :last_modified_by_id,
class_name: 'User'
has_one :repository_cell, as: :value, dependent: :destroy, inverse_of: :value
accepts_nested_attributes_for :repository_cell
validates :repository_cell, presence: true
def formatted
return '' unless repository_list_item
repository_list_item.data
end
end

View file

@ -41,7 +41,8 @@ class Extends
# Data type name should match corresponding model's name
REPOSITORY_DATA_TYPES = { RepositoryTextValue: 0,
RepositoryDateValue: 1 }
RepositoryDateValue: 1,
RepositoryListValue: 2 }
# List of implemented core API versions
API_VERSIONS = ['20170715']

View file

@ -0,0 +1,27 @@
class CreateRepositoryListValues < ActiveRecord::Migration[5.1]
def change
create_table :repository_list_items do |t|
t.references :repository, index: true, foreign_key: true
t.references :repository_column, index: true, foreign_key: true
t.text :data, index: true, using: :gin, null: false
t.references :created_by,
index: true,
foreign_key: { to_table: :users }
t.references :last_modified_by,
index: true,
foreign_key: { to_table: :users }
t.timestamps
end
create_table :repository_list_values do |t|
t.references :repository_list_item, index: true
t.references :created_by,
index: true,
foreign_key: { to_table: :users }
t.references :last_modified_by,
index: true,
foreign_key: { to_table: :users }
t.timestamps
end
end
end

View file

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20171026090804) do
ActiveRecord::Schema.define(version: 20180207095200) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@ -394,6 +394,32 @@ ActiveRecord::Schema.define(version: 20171026090804) do
t.integer "last_modified_by_id", null: false
end
create_table "repository_list_items", force: :cascade do |t|
t.bigint "repository_id"
t.bigint "repository_column_id"
t.text "data", null: false
t.bigint "created_by_id"
t.bigint "last_modified_by_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["created_by_id"], name: "index_repository_list_items_on_created_by_id"
t.index ["data"], name: "index_repository_list_items_on_data"
t.index ["last_modified_by_id"], name: "index_repository_list_items_on_last_modified_by_id"
t.index ["repository_column_id"], name: "index_repository_list_items_on_repository_column_id"
t.index ["repository_id"], name: "index_repository_list_items_on_repository_id"
end
create_table "repository_list_values", force: :cascade do |t|
t.bigint "repository_list_item_id"
t.bigint "created_by_id"
t.bigint "last_modified_by_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["created_by_id"], name: "index_repository_list_values_on_created_by_id"
t.index ["last_modified_by_id"], name: "index_repository_list_values_on_last_modified_by_id"
t.index ["repository_list_item_id"], name: "index_repository_list_values_on_repository_list_item_id"
end
create_table "repository_rows", id: :serial, force: :cascade do |t|
t.integer "repository_id"
t.integer "created_by_id", null: false
@ -854,6 +880,12 @@ ActiveRecord::Schema.define(version: 20171026090804) do
add_foreign_key "repository_columns", "users", column: "created_by_id"
add_foreign_key "repository_date_values", "users", column: "created_by_id"
add_foreign_key "repository_date_values", "users", column: "last_modified_by_id"
add_foreign_key "repository_list_items", "repositories"
add_foreign_key "repository_list_items", "repository_columns"
add_foreign_key "repository_list_items", "users", column: "created_by_id"
add_foreign_key "repository_list_items", "users", column: "last_modified_by_id"
add_foreign_key "repository_list_values", "users", column: "created_by_id"
add_foreign_key "repository_list_values", "users", column: "last_modified_by_id"
add_foreign_key "repository_rows", "users", column: "created_by_id"
add_foreign_key "repository_rows", "users", column: "last_modified_by_id"
add_foreign_key "repository_text_values", "users", column: "created_by_id"

View file

@ -0,0 +1,8 @@
FactoryBot.define do
factory :repository_list_item do
data ''
repository { Repository.first || create(:repository) }
created_by { User.first || association(:project_user) }
last_modified_by { User.first || association(:project_user) }
end
end

View file

@ -0,0 +1,6 @@
FactoryBot.define do
factory :repository_list_value do
created_by { User.first || association(:project_user) }
last_modified_by { User.first || association(:project_user) }
end
end

View file

@ -19,6 +19,7 @@ describe RepositoryColumn, type: :model do
it { should belong_to(:created_by).class_name('User') }
it { should have_many :repository_cells }
it { should have_many :repository_rows }
it { should have_many :repository_list_items }
end
describe 'Should be a valid object' do

View file

@ -0,0 +1,67 @@
require 'rails_helper'
RSpec.describe RepositoryListItem, type: :model do
it 'should be of class RepositoryListItem' do
expect(subject.class).to eq RepositoryListItem
end
describe 'Database table' do
it { should have_db_column :data }
it { should have_db_column :repository_id }
it { should have_db_column :created_by_id }
it { should have_db_column :last_modified_by_id }
it { should have_db_column :repository_column_id }
end
describe 'Relations' do
it { should have_many :repository_list_values }
it { should belong_to :repository }
it { should belong_to :repository_column }
it { should belong_to(:created_by).class_name('User') }
it { should belong_to(:last_modified_by).class_name('User') }
end
describe 'Validations' do
it { should validate_presence_of(:data) }
it do
should validate_length_of(:data).is_at_most(Constants::TEXT_MAX_LENGTH)
end
context 'has a uniq data scoped on repository column' do
let!(:user) { create :user }
let!(:repository_one) { create :repository }
let!(:repository_column) do
create :repository_column, name: 'My column', repository: repository_one
end
let!(:repository_two) { create :repository, name: 'New repo' }
let!(:repository_column_two) do
create :repository_column, name: 'My column', repository: repository_two
end
let!(:repository_list_item) do
create :repository_list_item,
data: 'Test',
repository: repository_one,
repository_column: repository_column
end
it 'creates a repository list item in same repository' do
new_item = build :repository_list_item,
data: 'Test',
repository: repository_one,
repository_column: repository_column
expect(new_item).to_not be_valid
expect(
new_item.errors.full_messages.first
).to eq 'Data has already been taken'
end
it 'create a repository list item in other repository' do
new_item = build :repository_list_item,
data: 'Test',
repository: repository_two,
repository_column: repository_column_two
expect(new_item).to be_valid
end
end
end
end

View file

@ -0,0 +1,74 @@
require 'rails_helper'
RSpec.describe RepositoryListValue, type: :model do
it 'should be of class RepositoryListValue' do
expect(subject.class).to eq RepositoryListValue
end
describe 'Database table' do
it { should have_db_column :created_by_id }
it { should have_db_column :last_modified_by_id }
it { should have_db_column :repository_list_item_id }
end
describe 'Relations' do
it { should belong_to(:created_by).class_name('User') }
it { should belong_to(:last_modified_by).class_name('User') }
it { should belong_to(:repository_list_item) }
it { should accept_nested_attributes_for(:repository_cell) }
end
describe '#data' do
let!(:repository) { create :repository }
let!(:repository_column) { create :repository_column, name: 'My column' }
let!(:repository_column) do
create :repository_column, data_type: :RepositoryListValue
end
let!(:repository_row) { create :repository_row, name: 'My row' }
let!(:repository_list_value) do
create :repository_list_value, repository_cell_attributes: {
repository_column: repository_column,
repository_row: repository_row
}
end
it 'returns the data of a selected item' do
list_item = create :repository_list_item,
data: 'my item',
repository: repository,
repository_column: repository_column
repository_list_value.repository_list_item = list_item
repository_list_value.save
expect(repository_list_value.reload.formatted).to eq 'my item'
end
it 'retuns only the the item related to the list' do
repository_row_two = create :repository_row, name: 'New row'
repository_list_value_two =
create :repository_list_value, repository_cell_attributes: {
repository_column: repository_column,
repository_row: repository_row_two
}
list_item = create :repository_list_item,
data: 'new item',
repository: repository,
repository_column: repository_column
repository_list_value.repository_list_item = list_item
expect(repository_list_value.reload.formatted).to_not eq 'my item'
expect(repository_list_value.formatted).to eq ''
end
it 'returns an empty string if no item selected' do
list_item = create :repository_list_item,
data: 'my item',
repository: repository,
repository_column: repository_column
expect(repository_list_value.reload.formatted).to eq ''
end
it 'returns an empty string if item does not exists' do
repository_list_value.repository_list_item = nil
expect(repository_list_value.reload.formatted).to eq ''
end
end
end

View file

@ -19,6 +19,7 @@ describe Repository, type: :model do
it { should have_many :repository_rows }
it { should have_many :repository_table_states }
it { should have_many :report_elements }
it { should have_many(:repository_list_items).dependent(:destroy) }
end
describe 'Should be a valid object' do