solidus_legacy_return_authorizations 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +10 -0
  5. data/LICENSE +26 -0
  6. data/README.md +62 -0
  7. data/Rakefile +21 -0
  8. data/app/assets/javascripts/spree/backend/solidus_legacy_return_authorizations.js +2 -0
  9. data/app/assets/stylesheets/spree/backend/solidus_legacy_return_authorizations.css +4 -0
  10. data/app/controllers/spree/admin/legacy_return_authorizations_controller.rb +25 -0
  11. data/app/controllers/spree/api/legacy_return_authorizations_controller.rb +74 -0
  12. data/app/helpers/spree/admin/navigation_helper_decorator.rb +12 -0
  13. data/app/helpers/spree/api/api_helpers_decorator.rb +7 -0
  14. data/app/models/spree/adjustment_decorator.rb +3 -0
  15. data/app/models/spree/inventory_unit_decorator.rb +3 -0
  16. data/app/models/spree/legacy_return_authorization.rb +108 -0
  17. data/app/models/spree/order_decorator.rb +3 -0
  18. data/app/models/spree/permission_sets/legacy_return_authorization_display.rb +9 -0
  19. data/app/models/spree/permission_sets/legacy_return_authorization_management.rb +9 -0
  20. data/app/models/spree/strong_parameters_decorator.rb +5 -0
  21. data/app/overrides/admin_legacy_return_authorizations.rb +14 -0
  22. data/app/views/spree/admin/legacy_return_authorizations/_form.html.erb +78 -0
  23. data/app/views/spree/admin/legacy_return_authorizations/edit.html.erb +32 -0
  24. data/app/views/spree/admin/legacy_return_authorizations/index.html.erb +48 -0
  25. data/app/views/spree/api/legacy_return_authorizations/index.v1.rabl +7 -0
  26. data/app/views/spree/api/legacy_return_authorizations/new.v1.rabl +3 -0
  27. data/app/views/spree/api/legacy_return_authorizations/show.v1.rabl +2 -0
  28. data/bin/rails +7 -0
  29. data/circle.yml +6 -0
  30. data/config/locales/en.yml +19 -0
  31. data/config/routes.rb +25 -0
  32. data/db/migrate/20140710044402_create_spree_legacy_return_authorizations.rb +26 -0
  33. data/lib/generators/solidus_legacy_return_authorizations/install/install_generator.rb +29 -0
  34. data/lib/solidus_legacy_return_authorizations.rb +2 -0
  35. data/lib/spree_legacy_return_authorizations/engine.rb +20 -0
  36. data/lib/spree_legacy_return_authorizations/factories.rb +13 -0
  37. data/solidus_legacy_return_authorizations.gemspec +29 -0
  38. data/spec/controllers/admin/legacy_return_authorizations_controller_spec.rb +32 -0
  39. data/spec/controllers/spree/api/legacy_return_authorizations_controller_spec.rb +157 -0
  40. data/spec/features/admin/orders/legacy_return_authorizations_spec.rb +26 -0
  41. data/spec/models/spree/legacy_return_authorization_spec.rb +214 -0
  42. data/spec/models/spree/permission_sets/legacy_return_authorization_display_spec.rb +22 -0
  43. data/spec/models/spree/permission_sets/legacy_return_authorization_management_spec.rb +20 -0
  44. data/spec/spec_helper.rb +74 -0
  45. data/spec/support/authentication_support.rb +7 -0
  46. data/spec/support/have_attributes_matcher.rb +8 -0
  47. metadata +245 -0
@@ -0,0 +1,14 @@
1
+ Deface::Override.new(
2
+ virtual_path: "spree/admin/shared/_order_submenu",
3
+ name: "admin_legacy_return_authorizations_submenu",
4
+ insert_bottom: "[data-hook='admin_order_tabs']",
5
+ text: %q(
6
+ <% if can? :display, Spree::LegacyReturnAuthorization %>
7
+ <% if @order.legacy_return_authorizations.exists? %>
8
+ <li<%== ' class="active"' if current == 'Legacy Return Authorizations' %>>
9
+ <%= link_to_with_icon 'share', Spree.t(:legacy_return_authorizations), admin_order_legacy_return_authorizations_url(@order) %>
10
+ </li>
11
+ <% end %>
12
+ <% end %>
13
+ )
14
+ )
@@ -0,0 +1,78 @@
1
+ <div data-hook="admin_legacy_return_authorization_form_fields">
2
+ <table class="index">
3
+ <thead>
4
+ <tr data-hook="legacy_rma_header">
5
+ <th><%= Spree.t(:product) %></th>
6
+ <th><%= Spree.t(:quantity_shipped) %></th>
7
+ <th><%= Spree.t(:quantity_returned) %></th>
8
+ <th><%= Spree.t(:return_quantity) %></th>
9
+ </tr>
10
+ </thead>
11
+ <tbody>
12
+ <% @legacy_return_authorization.order.shipments.shipped.collect{|s| s.inventory_units.to_a}.flatten.group_by(&:variant).each do | variant, units| %>
13
+ <tr id="<%= dom_id(variant) %>" data-hook="legacy_rma_row" class="<%= cycle('odd', 'even')%>">
14
+ <td>
15
+ <div class="variant-name"><%= variant.name %></div>
16
+ <div class="variant-options"><%= variant.options_text %></div>
17
+ </td>
18
+ <td class="align-center"><%= units.select(&:shipped?).size %></td>
19
+ <td class="align-center"><%= units.select(&:returned?).size %></td>
20
+ <td class="return_quantity align-center">
21
+ <% if @legacy_return_authorization.received? %>
22
+ <%= @legacy_return_authorization.inventory_units.group_by(&:variant)[variant].try(:size) || 0 %>
23
+ <% elsif units.select(&:shipped?).empty? %>
24
+ 0
25
+ <% else %>
26
+ <%= number_field_tag "return_quantity[#{variant.id}]",
27
+ @legacy_return_authorization.inventory_units.group_by(&:variant)[variant].try(:size) || 0, {:style => 'width:100px;', :min => 0} %>
28
+ <% end %>
29
+ </td>
30
+ </tr>
31
+ <% end %>
32
+ </tbody>
33
+ </table>
34
+
35
+ <%= f.field_container :amount do %>
36
+ <%= f.label :amount, Spree.t(:amount) %> <span class="required">*</span><br />
37
+ <% if @legacy_return_authorization.received? %>
38
+ <%= @legacy_return_authorization.display_amount %>
39
+ <% else %>
40
+ <%= f.text_field :amount, {:style => 'width:80px;'} %> <%= Spree.t(:legacy_rma_value) %>: <span id="legacy_rma_value">0.00</span>
41
+ <%= f.error_message_on :amount %>
42
+ <% end %>
43
+ <% end %>
44
+
45
+ <%= f.field_container :reason do %>
46
+ <%= f.label :reason, Spree.t(:reason) %>
47
+ <%= f.text_area :reason, {:style => 'height:100px;', :class => 'fullwidth'} %>
48
+ <%= f.error_message_on :reason %>
49
+ <% end %>
50
+
51
+ <%= f.field_container :stock_location do %>
52
+ <%= f.label :stock_location, Spree.t(:stock_location) %>
53
+ <%= f.select :stock_location_id, Spree::StockLocation.active.to_a.collect{|l|[l.name, l.id]}, {:style => 'height:100px;', :class => 'fullwidth'} %>
54
+ <%= f.error_message_on :reason %>
55
+ <% end %>
56
+ </div>
57
+
58
+ <script>
59
+ var line_item_prices = {};
60
+ <% @legacy_return_authorization.order.line_items.group_by(&:variant).each do | variant, items| %>
61
+ line_item_prices[<%= variant.id.to_s %>] = <%= items.first.price %>;
62
+ <% end %>
63
+
64
+ $(document).ready(function(){
65
+ var legacy_rma_amount = 0;
66
+ $("td.return_quantity input").on('change', function() {
67
+ var legacy_rma_amount = 0;
68
+ $.each($("td.return_quantity input"), function(i, input) {
69
+ var variant_id = $(input).prop('id').replace("return_quantity_", "");
70
+ legacy_rma_amount += line_item_prices[variant_id] * $(input).val()
71
+ });
72
+
73
+ if(!isNaN(legacy_rma_amount)){
74
+ $("span#legacy_rma_value").html(legacy_rma_amount.toFixed(2));
75
+ }
76
+ })
77
+ });
78
+ </script>
@@ -0,0 +1,32 @@
1
+ <% content_for :page_actions do %>
2
+ <li>
3
+ <% if @legacy_return_authorization.can_receive? %>
4
+ <%= button_link_to Spree.t(:receive), fire_admin_order_legacy_return_authorization_url(@order, @legacy_return_authorization, :e => 'receive'), :method => :put, :data => { :confirm => Spree.t(:are_you_sure) }, :icon => 'download-alt' %>
5
+ <% end %>
6
+ </li>
7
+ <li>
8
+ <% if @legacy_return_authorization.can_cancel? %>
9
+ <%= button_link_to Spree.t('actions.cancel'), fire_admin_order_legacy_return_authorization_url(@order, @legacy_return_authorization, :e => 'cancel'), :method => :put, :data => { :confirm => Spree.t(:are_you_sure) }, :icon => 'remove' %>
10
+ <% end %>
11
+ </li>
12
+ <% end %>
13
+
14
+ <%= render :partial => 'spree/admin/shared/order_tabs', :locals => { :current => 'Legacy Return Authorizations' } %>
15
+
16
+ <% content_for :page_title do %>
17
+ <i class="fa fa-arrow-right"></i> <%= Spree.t(:legacy_return_authorization) %> <%= @legacy_return_authorization.number %> (<%= Spree.t(@legacy_return_authorization.state.downcase) %>)
18
+ <% end %>
19
+
20
+
21
+ <%= render :partial => 'spree/shared/error_messages', :locals => { :target => @legacy_return_authorization } %>
22
+ <%= form_for [:admin, @order, @legacy_return_authorization] do |f| %>
23
+ <fieldset class="no-border-top">
24
+ <%= render :partial => 'form', :locals => { :f => f } %>
25
+
26
+ <div class="form-buttons filter-actions actions" data-hook="buttons">
27
+ <%= button Spree.t('actions.update'), 'repeat' %>
28
+ <span class="or"><%= Spree.t(:or) %></span>
29
+ <%= button_link_to Spree.t('actions.cancel'), admin_order_legacy_return_authorizations_url(@order), :icon => 'remove' %>
30
+ </div>
31
+ </fieldset>
32
+ <% end %>
@@ -0,0 +1,48 @@
1
+ <%= render :partial => 'spree/admin/shared/order_tabs', :locals => { :current => 'Legacy Return Authorizations' } %>
2
+
3
+ <% content_for :page_actions do %>
4
+ <% if can?(:display, Spree::Order) %>
5
+ <li><%= button_link_to Spree.t(:back_to_orders_list), spree.admin_orders_path, :icon => 'arrow-left' %></li>
6
+ <% end %>
7
+ <% end %>
8
+
9
+ <% content_for :page_title do %>
10
+ <i class="fa fa-arrow-right"></i> <%= Spree.t(:legacy_return_authorizations) %>
11
+ <% end %>
12
+
13
+ <% if @order.shipments.any?(&:shipped?) || @order.legacy_return_authorizations.any? %>
14
+ <table class="index">
15
+ <thead data-hook="legacy_rma_header">
16
+ <tr>
17
+ <th><%= Spree.t(:legacy_rma_number) %></th>
18
+ <th><%= Spree.t(:status) %></th>
19
+ <th><%= Spree.t(:amount) %></th>
20
+ <th><%= "#{Spree.t('date')}/#{Spree.t('time')}" %></th>
21
+ <th class="actions"></th>
22
+ </tr>
23
+ </thead>
24
+ <tbody>
25
+ <% @legacy_return_authorizations.each do |legacy_return_authorization| %>
26
+ <tr id="<%= spree_dom_id(legacy_return_authorization) %>" data-hook="legacy_rma_row" class="<%= cycle('odd', 'even')%>">
27
+ <td><%= legacy_return_authorization.number %></td>
28
+ <td><%= Spree.t(legacy_return_authorization.state.downcase) %></td>
29
+ <td><%= legacy_return_authorization.display_amount.to_html %></td>
30
+ <td><%= pretty_time(legacy_return_authorization.created_at) %></td>
31
+ <td class="actions">
32
+ <% if can?(:update, legacy_return_authorization) %>
33
+ <%= link_to_edit legacy_return_authorization, :no_text => true, :class => 'edit' %>
34
+ <% end %>
35
+ <% if can?(:destroy, legacy_return_authorization) && !legacy_return_authorization.received? %>
36
+ &nbsp;
37
+ <%= link_to_delete legacy_return_authorization, :no_text => true %>
38
+ <% end %>
39
+ </td>
40
+ </tr>
41
+ <% end %>
42
+ </tbody>
43
+ </table>
44
+ <% else %>
45
+ <div data-hook="legacy_rma_cannont_create" class="no-objects-found">
46
+ <%= Spree.t(:cannot_create_returns) %>
47
+ </div>
48
+ <% end %>
@@ -0,0 +1,7 @@
1
+ object false
2
+ child(@legacy_return_authorizations => :legacy_return_authorizations) do
3
+ attributes *legacy_return_authorization_attributes
4
+ end
5
+ node(:count) { @legacy_return_authorizations.count }
6
+ node(:current_page) { params[:page] || 1 }
7
+ node(:pages) { @legacy_return_authorizations.num_pages }
@@ -0,0 +1,3 @@
1
+ object false
2
+ node(:attributes) { [*legacy_return_authorization_attributes] }
3
+ node(:required_attributes) { required_fields_for(Spree::LegacyReturnAuthorization) }
@@ -0,0 +1,2 @@
1
+ object @legacy_return_authorization
2
+ attributes *legacy_return_authorization_attributes
data/bin/rails ADDED
@@ -0,0 +1,7 @@
1
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
2
+
3
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
4
+ ENGINE_PATH = File.expand_path('../../lib/spree_legacy_return_authorizations/engine', __FILE__)
5
+
6
+ require 'rails/all'
7
+ require 'rails/engine/commands'
data/circle.yml ADDED
@@ -0,0 +1,6 @@
1
+ machine:
2
+ ruby:
3
+ version: 2.1.5
4
+ test:
5
+ pre:
6
+ - bundle exec rake test_app
@@ -0,0 +1,19 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ activerecord:
6
+ attributes:
7
+ spree/legacy_return_authorization:
8
+ amount: Amount
9
+ models:
10
+ spree/legacy_return_authorization:
11
+ one: Legacy Return Authorization
12
+ other: Legacy Return Authorizations
13
+ spree:
14
+ legacy_return_authorization: Legacy Return Authorization
15
+ legacy_return_authorization_updated: Legacy Return authorization updated
16
+ legacy_return_authorizations: Legacy Return Authorizations
17
+ legacy_rma_credit: Legacy RMA Credit
18
+ legacy_rma_number: Legacy RMA Number
19
+ legacy_rma_value: Legacy RMA Value
data/config/routes.rb ADDED
@@ -0,0 +1,25 @@
1
+ Spree::Core::Engine.routes.draw do
2
+ namespace :api, defaults: { format: 'json' } do
3
+ concern :legacy_return_routes do
4
+ resources :legacy_return_authorizations, except: [:new, :create] do
5
+ member do
6
+ put :add
7
+ put :cancel
8
+ put :receive
9
+ end
10
+ end
11
+ end
12
+ resources :checkouts, only: [], concerns: :legacy_return_routes
13
+ resources :orders, only: [], concerns: :legacy_return_routes
14
+ end
15
+
16
+ namespace :admin do
17
+ resources :orders, except: [:show] do
18
+ resources :legacy_return_authorizations, except: [:new, :create] do
19
+ member do
20
+ put :fire
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ class CreateSpreeLegacyReturnAuthorizations < ActiveRecord::Migration
2
+ def up
3
+ # If this is a migrated database that had legacy returns in it then the table will already exist.
4
+ # But if this is a dev box, etc that's just including this extension then we need to create the table.
5
+ if !table_exists?(:spree_legacy_return_authorizations)
6
+ create_table :spree_legacy_return_authorizations do |t|
7
+ t.string "number"
8
+ t.string "state"
9
+ t.decimal "amount", precision: 10, scale: 2, default: 0.0, null: false
10
+ t.integer "order_id"
11
+ t.text "reason"
12
+ t.datetime "created_at"
13
+ t.datetime "updated_at"
14
+ t.integer "stock_location_id"
15
+ end
16
+
17
+ add_column :spree_inventory_units, :legacy_return_authorization_id, :integer
18
+ add_index :spree_inventory_units, :legacy_return_authorization_id
19
+ end
20
+ end
21
+
22
+ def down
23
+ drop_table :spree_legacy_return_authorizations
24
+ remove_column :spree_inventory_units, :legacy_return_authorization_id
25
+ end
26
+ end
@@ -0,0 +1,29 @@
1
+ module SolidusLegacyReturnAuthorizations
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+
5
+ class_option :auto_run_migrations, type: :boolean, default: false
6
+
7
+ def add_javascripts
8
+ append_file 'vendor/assets/javascripts/spree/backend/all.js', "//= require spree/backend/solidus_legacy_return_authorizations\n"
9
+ end
10
+
11
+ def add_stylesheets
12
+ inject_into_file 'vendor/assets/stylesheets/spree/backend/all.css', " *= require spree/backend/solidus_legacy_return_authorizations\n", before: /\*\//, verbose: true
13
+ end
14
+
15
+ def add_migrations
16
+ run 'bundle exec rake railties:install:migrations FROM=solidus_legacy_return_authorizations'
17
+ end
18
+
19
+ def run_migrations
20
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
21
+ if run_migrations
22
+ run 'bundle exec rake db:migrate'
23
+ else
24
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,2 @@
1
+ require 'spree_core'
2
+ require 'spree_legacy_return_authorizations/engine'
@@ -0,0 +1,20 @@
1
+ module SpreeLegacyReturnAuthorizations
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'solidus_legacy_return_authorizations'
6
+
7
+ # use rspec for tests
8
+ config.generators do |g|
9
+ g.test_framework :rspec
10
+ end
11
+
12
+ def self.activate
13
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
14
+ Rails.configuration.cache_classes ? require(c) : load(c)
15
+ end
16
+ end
17
+
18
+ config.to_prepare &method(:activate).to_proc
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ FactoryGirl.define do
2
+ factory :legacy_return_authorization, class: Spree::LegacyReturnAuthorization do
3
+ number '100'
4
+ amount 100.00
5
+ association(:order, factory: :shipped_order)
6
+ reason 'no particular reason'
7
+ state 'received'
8
+ end
9
+
10
+ factory :new_legacy_return_authorization, class: Spree::LegacyReturnAuthorization do
11
+ association(:order, factory: :shipped_order)
12
+ end
13
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: UTF-8
2
+
3
+ Gem::Specification.new do |s|
4
+ s.platform = Gem::Platform::RUBY
5
+ s.name = "solidus_legacy_return_authorizations"
6
+ s.version = "1.0.0"
7
+ s.summary = "Interfaces for Spree 2.3 Legacy Return Authorizations"
8
+ s.description = "Provides models and admin interfaces to interact with the LegacyReturnAuthorization models from Spree versions prior to 2.4"
9
+ s.required_ruby_version = ">= 2.1"
10
+
11
+ s.authors = ["Richard Nuno", "Jordan Brough"]
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
+ s.require_path = "lib"
16
+ s.requirements << "none"
17
+
18
+ s.add_dependency "solidus_core", [">= 1.0.0", "< 1.2.0"]
19
+
20
+ s.add_development_dependency "rspec-rails", "~> 3.2"
21
+ s.add_development_dependency "simplecov"
22
+ s.add_development_dependency "sqlite3"
23
+ s.add_development_dependency "sass-rails", "~> 4.0.2"
24
+ s.add_development_dependency "coffee-rails"
25
+ s.add_development_dependency "capybara", "~> 2.1"
26
+ s.add_development_dependency "factory_girl", "~> 4.4"
27
+ s.add_development_dependency "database_cleaner"
28
+ s.add_development_dependency "ffaker"
29
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Admin::LegacyReturnAuthorizationsController do
4
+ stub_authorization!
5
+
6
+ # Regression test for #1370 #3
7
+ let!(:legacy_return_authorization) { create(:legacy_return_authorization, reason: 'old reason') }
8
+
9
+ context "#update" do
10
+ let(:new_reason) { 'new reason' }
11
+
12
+ subject do
13
+ spree_put :update, {
14
+ id: legacy_return_authorization.to_param,
15
+ order_id: legacy_return_authorization.order.to_param,
16
+ legacy_return_authorization: {
17
+ :reason => new_reason,
18
+ },
19
+ }
20
+ end
21
+
22
+ before { subject }
23
+
24
+ it "redirects to legacy return authorizations index" do
25
+ expect(response).to redirect_to(spree.admin_order_legacy_return_authorizations_path(legacy_return_authorization.order))
26
+ end
27
+
28
+ it "updates the reason" do
29
+ expect(legacy_return_authorization.reload.reason).to eq new_reason
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,157 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Api::LegacyReturnAuthorizationsController do
5
+ render_views
6
+
7
+ let!(:order) { create(:shipped_order) }
8
+
9
+ let(:product) { create(:product) }
10
+ let(:attributes) { [:id, :reason, :amount, :state] }
11
+ let(:resource_scoping) { { :order_id => order.to_param } }
12
+
13
+ before do
14
+ stub_api_controller_authentication!
15
+ end
16
+
17
+ context "as the order owner" do
18
+ before do
19
+ allow_any_instance_of(Order).to receive_messages :user => current_api_user
20
+ end
21
+
22
+ it "cannot see any legacy return authorizations" do
23
+ spree_get :index, order_id: order.to_param, format: :json
24
+ assert_unauthorized!
25
+ end
26
+
27
+ it "cannot see a single legacy return authorization" do
28
+ spree_get :show, order_id: order.to_param, :id => 1, format: :json
29
+ assert_unauthorized!
30
+ end
31
+ end
32
+
33
+ context "as an admin" do
34
+ before do
35
+ stub_api_controller_authentication!(admin: true)
36
+ end
37
+
38
+ it "can show legacy return authorization" do
39
+ FactoryGirl.create(:legacy_return_authorization, :order => order)
40
+ legacy_return_authorization = order.legacy_return_authorizations.first
41
+ spree_get :show, :order_id => order.number, :id => legacy_return_authorization.id, format: :json
42
+ expect(response.status).to eq(200)
43
+ expect(json_response).to have_attributes(attributes)
44
+ expect(json_response["state"]).not_to be_blank
45
+ end
46
+
47
+ it "can get a list of legacy return authorizations" do
48
+ FactoryGirl.create(:legacy_return_authorization, :order => order)
49
+ FactoryGirl.create(:legacy_return_authorization, :order => order)
50
+ spree_get :index, :order_id => order.number, format: :json
51
+ expect(response.status).to eq(200)
52
+ legacy_return_authorizations = json_response["legacy_return_authorizations"]
53
+ expect(legacy_return_authorizations.first).to have_attributes(attributes)
54
+ expect(legacy_return_authorizations.first).not_to eq(legacy_return_authorizations.last)
55
+ end
56
+
57
+ it 'can control the page size through a parameter' do
58
+ FactoryGirl.create(:legacy_return_authorization, :order => order)
59
+ FactoryGirl.create(:legacy_return_authorization, :order => order)
60
+ spree_get :index, :order_id => order.number, :per_page => 1, format: :json
61
+ expect(json_response['count']).to eq(1)
62
+ expect(json_response['current_page']).to eq(1)
63
+ expect(json_response['pages']).to eq(2)
64
+ end
65
+
66
+ it 'can query the results through a parameter' do
67
+ FactoryGirl.create(:legacy_return_authorization, :order => order)
68
+ expected_result = create(:legacy_return_authorization, :reason => 'damaged')
69
+ order.legacy_return_authorizations << expected_result
70
+ spree_get :index, :q => { :reason_cont => 'damage' }, order_id: order.to_param, format: :json
71
+ expect(json_response['count']).to eq(1)
72
+ expect(json_response['legacy_return_authorizations'].first['reason']).to eq expected_result.reason
73
+ end
74
+
75
+ it "can update a legacy return authorization on the order" do
76
+ FactoryGirl.create(:legacy_return_authorization, :order => order)
77
+ legacy_return_authorization = order.legacy_return_authorizations.first
78
+ spree_put :update, :id => legacy_return_authorization.id, :legacy_return_authorization => { :amount => 19.99 }, format: :json, order_id: order.to_param
79
+ expect(response.status).to eq(200)
80
+ expect(json_response).to have_attributes(attributes)
81
+ end
82
+
83
+ it "can add an inventory unit to a legacy return authorization on the order" do
84
+ FactoryGirl.create(:legacy_return_authorization, :order => order)
85
+ legacy_return_authorization = order.legacy_return_authorizations.first
86
+ inventory_unit = legacy_return_authorization.returnable_inventory.first
87
+ expect(inventory_unit).to be
88
+ expect(legacy_return_authorization.inventory_units).to be_empty
89
+ spree_put :add, :id => legacy_return_authorization.id, variant_id: inventory_unit.variant.id, quantity: 1, format: :json, order_id: order.to_param
90
+ expect(response.status).to eq(200)
91
+ expect(json_response).to have_attributes(attributes)
92
+ expect(legacy_return_authorization.reload.inventory_units).not_to be_empty
93
+ end
94
+
95
+ it "can mark a legacy return authorization as received on the order with an inventory unit" do
96
+ FactoryGirl.create(:new_legacy_return_authorization, :order => order, :stock_location_id => order.shipments.first.stock_location.id)
97
+ legacy_return_authorization = order.legacy_return_authorizations.first
98
+ expect(legacy_return_authorization.state).to eq("authorized")
99
+
100
+ # prep (use a rspec context or a factory instead?)
101
+ inventory_unit = legacy_return_authorization.returnable_inventory.first
102
+ expect(inventory_unit).to be
103
+ expect(legacy_return_authorization.inventory_units).to be_empty
104
+ spree_put :add, :id => legacy_return_authorization.id, variant_id: inventory_unit.variant.id, quantity: 1, format: :json, order_id: order.to_param
105
+ # end prep
106
+
107
+ spree_delete :receive, :id => legacy_return_authorization.id, format: :json, order_id: order.to_param
108
+ expect(response.status).to eq(200)
109
+ expect(legacy_return_authorization.reload.state).to eq("received")
110
+ end
111
+
112
+ it "cannot mark a legacy return authorization as received on the order with no inventory units" do
113
+ FactoryGirl.create(:new_legacy_return_authorization, :order => order)
114
+ legacy_return_authorization = order.legacy_return_authorizations.first
115
+ expect(legacy_return_authorization.state).to eq("authorized")
116
+ spree_delete :receive, :id => legacy_return_authorization.id, format: :json, order_id: order.to_param
117
+ expect(response.status).to eq(422)
118
+ expect(legacy_return_authorization.reload.state).to eq("authorized")
119
+ end
120
+
121
+ it "can cancel a legacy return authorization on the order" do
122
+ FactoryGirl.create(:new_legacy_return_authorization, :order => order)
123
+ legacy_return_authorization = order.legacy_return_authorizations.first
124
+ expect(legacy_return_authorization.state).to eq("authorized")
125
+ spree_delete :cancel, :id => legacy_return_authorization.id, format: :json, order_id: order.to_param
126
+ expect(response.status).to eq(200)
127
+ expect(legacy_return_authorization.reload.state).to eq("canceled")
128
+ end
129
+
130
+ it "can delete a legacy return authorization on the order" do
131
+ FactoryGirl.create(:legacy_return_authorization, :order => order)
132
+ legacy_return_authorization = order.legacy_return_authorizations.first
133
+ spree_delete :destroy, :id => legacy_return_authorization.id, format: :json, order_id: order.to_param
134
+ expect(response.status).to eq(204)
135
+ expect { legacy_return_authorization.reload }.to raise_error(ActiveRecord::RecordNotFound)
136
+ end
137
+ end
138
+
139
+ context "as just another user" do
140
+ it "cannot update a legacy return authorization on the order" do
141
+ FactoryGirl.create(:legacy_return_authorization, :order => order)
142
+ legacy_return_authorization = order.legacy_return_authorizations.first
143
+ spree_put :update, :id => legacy_return_authorization.id, :legacy_return_authorization => { :amount => 19.99 }, format: :json, order_id: order.to_param
144
+ assert_unauthorized!
145
+ expect(legacy_return_authorization.reload.amount).not_to eq(19.99)
146
+ end
147
+
148
+ it "cannot delete a legacy return authorization on the order" do
149
+ FactoryGirl.create(:legacy_return_authorization, :order => order)
150
+ legacy_return_authorization = order.legacy_return_authorizations.first
151
+ spree_delete :destroy, :id => legacy_return_authorization.id, format: :json, order_id: order.to_param
152
+ assert_unauthorized!
153
+ expect { legacy_return_authorization.reload }.not_to raise_error
154
+ end
155
+ end
156
+ end
157
+ end