RSpec и ActiveModelSerializer: как передать несколько моделей в SerializableResource.new - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть ситуация с отношением HABTM, когда я должен передать экземпляры моделей shop и event в ShopEventsController, чтобы назначить событие магазину.

Маршруты настроены следующим образом:

resources :shops, except: [:create, :destroy] do
  resources :events, controller: 'shop_events', only: [:index, :create, :destroy]

Что дает нам следующие конечные точки:

/shops/:shop_id/events
/shops/:shop_id/events/id

ShopEventsController имеет strong_params, определенные следующим образом:

def shop_event_params
  ActiveModelSerializers::Deserialization.jsonapi_parse!(params,
   only: [
    :shop,
    :event
  ])
end

Я не могу понять, как передать действительные параметры из спецификации запроса RSpec ...

Короче, думаю, мне нужно:

ActiveModelSerializers::SerializableResource.new(event).to_json и ActiveModelSerializers::SerializableResource.new(shop).to_json для перехода на запрос:

let(:event) { create(:unpublished_event, country: country, language: language) }
let(:valid_params) do
  {
    shop: ActiveModelSerializers::SerializableResource.new(shop),
    event: ActiveModelSerializers::SerializableResource.new(event)
  }.to_json
end

expect {
      post "/shops/#{shop.id}/events", params: valid_params, headers: headers
}.to change(shop.events, :count).by(1)

но это не с:

ActiveModelSerializers::Adapter::JsonApi::Deserialization::InvalidDocument:
Invalid payload ({:data=>"Expected hash"}): ...

Если я изменю valid_params, добавив to_json на каждую модель:

let(:valid_params) do
 {
    shop: ActiveModelSerializers::SerializableResource.new(shop).to_json,
    event: ActiveModelSerializers::SerializableResource.new(event).to_json
 }
end

он также не работает и завершается с ошибкой синтаксического анализа:

ActionDispatch::Http::Parameters::ParseError:
       765: unexpected token at 'shop=%7B%22data%22%3A%7B%2....

Вот что выкладывается при создании:

Parameters: {"data"=>{"relationships"=>{"shop"=>{"data"=>{"type"=>"shops", "id"=>"613"}}, "event"=>{"data"=>{"type"=>"events", "id"=>"46"}}}, "type"=>"shop-events"}, "shop_id"=>"613"}

В параметре ShopEventsController strong_params определено следующее:

def shop_event_params
      ActiveModelSerializers::Deserialization.jsonapi_parse!(params,
        only: [
          :shop,
          :event
        ])
    end

и shop_event_params возвращает только 2 идентификатора:

shop_event_params: {:shop_id=>"613", :event_id=>"46"}

Что с этим не так? Спасибо.

...