Skip to content

Commit

Permalink
Add collection CRUD
Browse files Browse the repository at this point in the history
  • Loading branch information
tpendragon committed Jul 31, 2017
1 parent 9628d06 commit 7fb4bc9
Show file tree
Hide file tree
Showing 10 changed files with 187 additions and 0 deletions.
13 changes: 13 additions & 0 deletions app/change_sets/collection_change_set.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true
class CollectionChangeSet < Valkyrie::ChangeSet
delegate :human_readable_type, to: :model
property :title, multiple: false, required: true
property :slug, multiple: false, required: true
property :description, multiple: false, required: false
property :visibility, multiple: false, required: false
validates :title, :slug, presence: true

def primary_terms
[:title, :slug, :description]
end
end
10 changes: 10 additions & 0 deletions app/controllers/collections_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# frozen_string_literal: true
class CollectionsController < ApplicationController
include Valhalla::ResourceController
self.change_set_class = DynamicChangeSet
self.resource_class = Collection
self.change_set_persister = PlumChangeSetPersister.new(
metadata_adapter: Valkyrie::MetadataAdapter.find(:indexing_persister),
storage_adapter: Valkyrie.config.storage_adapter
)
end
6 changes: 6 additions & 0 deletions app/decorators/collection_decorator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# frozen_string_literal: true
class CollectionDecorator < Valkyrie::ResourceDecorator
def manageable_files?
false
end
end
9 changes: 9 additions & 0 deletions app/models/collection.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true
class Collection < Valhalla::Resource
include Valkyrie::Resource::AccessControls
attribute :id, Valkyrie::Types::ID.optional
attribute :title, Valkyrie::Types::Set
attribute :slug, Valkyrie::Types::Set
attribute :description, Valkyrie::Types::Set
attribute :visibility, Valkyrie::Types::Set
end
2 changes: 2 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@
end
end

resources :collections

get '/catalog/parent/:parent_id/:id', to: 'catalog#show', as: :parent_solr_document

mount BrowseEverything::Engine => '/browse'
Expand Down
45 changes: 45 additions & 0 deletions spec/change_sets/collection_change_set_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# frozen_string_literal: true
require 'rails_helper'

RSpec.describe CollectionChangeSet do
subject(:change_set) { described_class.new(collection) }
let(:collection) { FactoryGirl.build(:collection) }
before do
change_set.prepopulate!
end
describe "#title" do
it "is single-valued and required" do
expect(change_set.multiple?(:title)).to eq false
expect(change_set.required?(:title)).to eq true
expect(change_set.validate(title: "")).to eq false
end
end

describe "#slug" do
it "is single-valued and required" do
expect(change_set.multiple?(:slug)).to eq false
expect(change_set.required?(:slug)).to eq true
expect(change_set.validate(slug: "")).to eq false
end
end

describe "#description" do
it "is single-valued and not required" do
expect(change_set.multiple?(:description)).to eq false
expect(change_set.required?(:description)).to eq false
end
end

describe "#visibility" do
it "is single-valued and not required" do
expect(change_set.multiple?(:description)).to eq false
expect(change_set.required?(:description)).to eq false
end
end

describe "#primary_terms" do
it "returns the primary terms" do
expect(change_set.primary_terms).to eq [:title, :slug, :description]
end
end
end
10 changes: 10 additions & 0 deletions spec/controllers/catalog_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,16 @@
expect(response.body).to have_link "Delete This File Set", href: file_set_path(resource)
expect(response.body).not_to have_link "File Manager"
end

it "renders for a Collection" do
resource = persister.save(resource: FactoryGirl.build(:collection))

get :show, params: { id: "id-#{resource.id}" }

expect(response.body).to have_link "Edit This Collection", href: edit_collection_path(resource)
expect(response.body).to have_link "Delete This Collection", href: collection_path(resource)
expect(response.body).not_to have_link "File Manager"
end
end
end

Expand Down
58 changes: 58 additions & 0 deletions spec/controllers/collections_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# frozen_string_literal: true
require 'rails_helper'

RSpec.describe CollectionsController do
let(:user) { nil }
let(:adapter) { Valkyrie::MetadataAdapter.find(:indexing_persister) }
let(:persister) { adapter.persister }
let(:query_service) { adapter.query_service }
before do
sign_in user if user
end
context "when an admin" do
let(:user) { FactoryGirl.create(:admin) }
describe "POST /collections" do
it "creates a collection" do
post :create, params: { collection: { title: 'test', slug: 'slug', visibility: 'open', description: '' } }

expect(response).to be_redirect

collection = query_service.find_all_of_model(model: Collection).first
expect(collection.title).to eq ['test']
expect(collection.slug).to eq ['slug']
expect(collection.visibility).to eq ['open']
expect(collection.description).to eq []
end
end
describe "GET /collections/new" do
render_views
it "renders a new record" do
get :new

expect(response).to render_template("valhalla/base/_form")
end
end

describe "GET /collections/edit" do
render_views
it "renders an existing record" do
collection = persister.save(resource: FactoryGirl.build(:collection))

get :edit, params: { id: collection.id.to_s }

expect(response.body).to have_field "Title", with: collection.title.first
end
end

describe "PATCH /collections/:id" do
it "updates an existing record" do
collection = persister.save(resource: FactoryGirl.build(:collection))

patch :update, params: { id: collection.id.to_s, collection: { title: 'New' } }
reloaded = query_service.find_by(id: collection.id)

expect(reloaded.title).to eq ['New']
end
end
end
end
12 changes: 12 additions & 0 deletions spec/factories/collection.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# frozen_string_literal: true
FactoryGirl.define do
factory :collection do
title 'Title'
slug 'test'
visibility 'open'
read_groups 'public'
to_create do |instance|
Valkyrie.config.metadata_adapter.persister.save(resource: instance)
end
end
end
22 changes: 22 additions & 0 deletions spec/models/collection_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# frozen_string_literal: true
require 'rails_helper'

RSpec.describe Collection do
subject(:collection) { FactoryGirl.build(:collection) }
it "has a title" do
collection.title = "Test"
expect(collection.title).to eq ["Test"]
end
it "has a slug" do
collection.slug = "test"
expect(collection.slug).to eq ["test"]
end
it "has a description" do
collection.description = "test"
expect(collection.description).to eq ["test"]
end
it "has visibility" do
collection.visibility = "open"
expect(collection.visibility).to eq ["open"]
end
end

0 comments on commit 7fb4bc9

Please sign in to comment.