Skip to content

Commit

Permalink
support adding pictures to generic object definitions
Browse files Browse the repository at this point in the history
  • Loading branch information
Jillian Tullo committed Oct 6, 2017
1 parent c25a180 commit fb69748
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 8 deletions.
12 changes: 10 additions & 2 deletions app/controllers/api/generic_object_definitions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,17 @@ class GenericObjectDefinitionsController < BaseController

def create_resource(_type, _id, data)
klass = collection_class(:generic_object_definitions)
data['picture'] = add_picture_resource(data['picture']) if data.key?('picture')
klass.create!(data.deep_symbolize_keys)
rescue => err
raise BadRequestError, "Failed to create new generic object definition - #{err}"
end

def edit_resource(type, id, data)
go_def = fetch_generic_object_definition(type, id, data)
updated_data = data['resource'].try(:deep_symbolize_keys) || data.deep_symbolize_keys
go_def.update_attributes!(updated_data) if data.present?
updated_data = data['resource'] || data
updated_data['picture'] = add_picture_resource(updated_data['picture']) if updated_data.key?('picture')
go_def.update_attributes!(updated_data.deep_symbolize_keys) if data.present?
go_def
rescue => err
raise BadRequestError, "Failed to update generic object definition - #{err}"
Expand Down Expand Up @@ -120,6 +122,12 @@ def build_generic_object_definition_options

private

def add_picture_resource(data)
id = parse_id(data, :pictures)
return resource_search(id, :pictures, collection_class(:pictures)) if id
Picture.create_from_base64(data)
end

def generic_objects_request?
@req.subject == 'generic_objects'
end
Expand Down
60 changes: 54 additions & 6 deletions spec/requests/generic_object_definitions_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,21 @@
let(:object_def) { FactoryGirl.create(:generic_object_definition, :name => 'foo') }
let(:object_def2) { FactoryGirl.create(:generic_object_definition, :name => 'foo 2') }
let(:object_def3) { FactoryGirl.create(:generic_object_definition, :name => 'foo 3') }
let(:picture) { FactoryGirl.create(:picture, :extension => 'png') }
let(:content) do
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGP"\
"C/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3Cc"\
"ulE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2Jl"\
"LnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIg"\
"eDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpy"\
"ZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1u"\
"cyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAg"\
"ICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYv"\
"MS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3Jp"\
"ZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpS"\
"REY+CjwveDp4bXBtZXRhPgpMwidZAAAADUlEQVQIHWNgYGCwBQAAQgA+3N0+"\
"xQAAAABJRU5ErkJggg=="
end

describe 'GET /api/generic_object_definitions' do
it 'does not list object definitions without an appropriate role' do
Expand Down Expand Up @@ -152,7 +167,7 @@
end

describe 'POST /api/generic_object_definitions' do
it 'can create a new generic_object_definition' do
it 'can create a new generic_object_definition with new picture resource' do
api_basic_authorize collection_action_identifier(:generic_object_definitions, :create)

object_definition = {
Expand All @@ -171,12 +186,44 @@
'add_vm',
'remove_vm'
]
},
'picture' => {
'extension' => 'png',
'content' => content
}
}
post(api_generic_object_definitions_url, :params => object_definition)

expect(response).to have_http_status(:ok)
expect(response.parsed_body['results'].first).to include(object_definition)
expect(response.parsed_body['results'].first).to include(object_definition.except('picture'))
end

it 'supports creating a new generic object definition with picture href specified' do
api_basic_authorize collection_action_identifier(:generic_object_definitions, :create)

object_definition = {
'name' => 'LoadBalancer',
'description' => 'LoadBalancer description',
'picture' => { 'href' => api_picture_url(nil, picture) }
}
post(api_generic_object_definitions_url, :params => object_definition)

expect(response).to have_http_status(:ok)
expect(response.parsed_body['results'].first).to include(object_definition.except('picture'))
end

it 'supports creating a new generic object definition with picture id specified' do
api_basic_authorize collection_action_identifier(:generic_object_definitions, :create)

object_definition = {
'name' => 'LoadBalancer',
'description' => 'LoadBalancer description',
'picture' => { 'id' => picture.id }
}
post(api_generic_object_definitions_url, :params => object_definition)

expect(response).to have_http_status(:ok)
expect(response.parsed_body['results'].first).to include(object_definition.except('picture'))
end

it 'cannot create an invalid generic_object_definition' do
Expand All @@ -203,15 +250,16 @@
expect(response.parsed_body).to include(expected)
end

it 'can edit generic_object_definitions by id, name, or href' do
it 'can edit generic_object_definitions by id, name, or href and with picture resources specified' do
api_basic_authorize collection_action_identifier(:generic_object_definitions, :edit)
picture2 = FactoryGirl.create(:picture, :extension => 'jpg')

request = {
'action' => 'edit',
'resources' => [
{ 'name' => object_def.name, 'resource' => { 'name' => 'updated 1' } },
{ 'id' => object_def2.id.to_s, 'resource' => { 'name' => 'updated 2' }},
{ 'href' => api_generic_object_definition_url(nil, object_def3), 'resource' => { 'name' => 'updated 3' }}
{ 'name' => object_def.name, 'resource' => { 'name' => 'updated 1', 'picture' => { 'href' => api_picture_url(nil, picture) } } },
{ 'id' => object_def2.id.to_s, 'resource' => { 'name' => 'updated 2', 'picture' => { 'id' => picture2.id } }},
{ 'href' => api_generic_object_definition_url(nil, object_def3), 'resource' => { 'name' => 'updated 3', 'picture' => { 'content' => content, 'extension' => 'jpg' } }}
]
}
post(api_generic_object_definitions_url, :params => request)
Expand Down

0 comments on commit fb69748

Please sign in to comment.