Skip to content

Commit

Permalink
Marketplace: Save stripe api key (#1009)
Browse files Browse the repository at this point in the history
#831

* Use strings to access data stored in Settings
* Delete leftover debugging info

* Marketplace: MarketplacesController#edit Spec

Just a basic "get the route, confirm it renders a template successfully
for authenticated user and is a 404 when not"

* Marketplace: Unit tests MarketplacePolicy#update?

* Marketplace: Guests may Checkout from Marketplace

We had been doing our smoke-testing with authenticated users, not
guests; and then Zee broke everything by not logging in and discovering
that we hadn't actually handled the Guest case well.

This tests the `Marketplace::CheckoutPolicy`,  as well as sprouts some
Factories for creating `:marketplace_checkout`s more conveniently.

* Marketplace: Streamline flow for Configuring Marketplace

- Adds Breadcrumbs
- Places Configure Products underneath the `marketplace/edit` view

Co-authored-by: Ana <[email protected]>
Co-authored-by: Naomi Quinones <[email protected]>
Co-authored-by: Zee <[email protected]>
Co-authored-by: Dalton <[email protected]>
Co-authored-by: Kelly Hong <[email protected]>
  • Loading branch information
6 people authored Jan 5, 2023
1 parent 4b73100 commit 31c6497
Show file tree
Hide file tree
Showing 14 changed files with 137 additions and 10 deletions.
2 changes: 1 addition & 1 deletion app/furniture/marketplace.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# @see features/furniture/marketplace.feature.md
class Marketplace
def self.append_routes(router)
router.resources :marketplaces, only: [:show], module: "marketplace" do
router.resources :marketplaces, only: [:show, :edit, :update], module: "marketplace" do
router.resources :products
router.resources :carts do
router.resources :cart_products
Expand Down
9 changes: 7 additions & 2 deletions app/furniture/marketplace/breadcrumbs.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,19 @@
link "Marketplace", marketplace.location
end

crumb :edit_marketplace do |marketplace|
parent :room, marketplace.room
link t('marketplace.marketplace.edit'), marketplace.location(:edit)
end

crumb :marketplace_checkout do |checkout|
parent :marketplace, checkout.cart.marketplace
link "Checkout", checkout.location
end

crumb :marketplace_products do |marketplace|
parent :marketplace, marketplace
link "Products", marketplace.location(child: :products)
parent :edit_marketplace, marketplace
link t('marketplace.product.index'), marketplace.location(child: :products)
end

crumb :marketplace_product do |product|
Expand Down
4 changes: 3 additions & 1 deletion app/furniture/marketplace/checkout_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

class Marketplace
class CheckoutPolicy < ApplicationPolicy
alias checkout object
alias_method :checkout, :object

def create?
return true if checkout.shopper.person.blank? && !current_person.authenticated?

checkout.shopper.person == current_person
end
end
Expand Down
9 changes: 9 additions & 0 deletions app/furniture/marketplace/locales/en.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@

en:
marketplace:
marketplace:
edit: "Configure Marketplace"
marketplaces:
update:
success: "Marketplace updated successfully!"
failure: "Marketplace could not be updated."
product:
index: "Configure Products"
products:
index:
new: Add a Product
Expand Down
8 changes: 8 additions & 0 deletions app/furniture/marketplace/marketplace.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ class Marketplace < FurniturePlacement
has_many :products, inverse_of: :marketplace, dependent: :destroy
has_many :carts, inverse_of: :marketplace, dependent: :destroy

def stripe_api_key=(key)
settings["stripe_api_key"] = key
end

def stripe_api_key
settings["stripe_api_key"]
end

def self.model_name
@_model_name ||= ActiveModel::Name.new(self, ::Marketplace)
end
Expand Down
6 changes: 6 additions & 0 deletions app/furniture/marketplace/marketplace_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,15 @@

class Marketplace
class MarketplacePolicy < ApplicationPolicy
alias_method :marketplace, :object
def show?
true
end

def update?
person&.member_of?(marketplace.space)
end

class Scope < ApplicationScope
def resolve
scope.all
Expand Down
6 changes: 6 additions & 0 deletions app/furniture/marketplace/marketplaces/_form.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<%= form_with model: marketplace.location do |marketplace_form| %>
<fieldset>
<%= render "password_field", form: marketplace_form, attribute: :stripe_api_key %>
<%= marketplace_form.submit %>
</fieldset>
<% end %>
4 changes: 2 additions & 2 deletions app/furniture/marketplace/marketplaces/_marketplace.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ end %>
<%= render cart %>

<div class="m-2 text-center">
<%- if policy(marketplace.products.new).create? %>
<%= link_to t('.manage_products'), marketplace.location(child: :products) %>
<%- if policy(marketplace).edit? %>
<%= link_to t('marketplace.marketplace.edit'), marketplace.location(:edit) %>
<%- end %>
</div>
6 changes: 6 additions & 0 deletions app/furniture/marketplace/marketplaces/edit.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<%- breadcrumb :edit_marketplace, marketplace %>
<%= render partial: 'form', locals: { marketplace: marketplace } %>

<%- if policy(marketplace.products.new).create? %>
<%= link_to t('marketplace.product.index'), marketplace.location(child: :products) %>
<%- end %>
16 changes: 15 additions & 1 deletion app/furniture/marketplace/marketplaces_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,21 @@

class Marketplace
class MarketplacesController < FurnitureController
def show; end
def show
end

def edit
marketplace
end

def update
if marketplace.update(params[:marketplace].permit([:stripe_api_key]))
redirect_to marketplace.location(:edit), notice: t('.success')
else
flash[:alert] = t('.failure')
render :edit, status: :unprocessable_entity
end
end

helper_method def marketplace
authorize(Marketplace.find(params[:id]))
Expand Down
19 changes: 17 additions & 2 deletions spec/factories/marketplace/checkouts.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
FactoryBot.define do
factory :marketplace_checkout, class: 'Marketplace::Checkout' do

factory :marketplace_checkout, class: "Marketplace::Checkout" do
trait :with_shopper do
transient do
person { nil }
end

shopper { build(:marketplace_shopper, person: person) }
end

trait :with_cart do
transient do
marketplace { nil }
end
before(:build) do |checkout, evaluator|
build(:marketplace_cart, marketplace: marketplace, checkout: checkout, shopper: checkout.shopper)
end
end
end
end
26 changes: 26 additions & 0 deletions spec/furniture/marketplace/checkout_policy_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
require "rails_helper"

RSpec.describe Marketplace::CheckoutPolicy, type: :policy do
subject { described_class }

let(:membership) { create(:membership, space: marketplace.room.space) }
let(:member) { membership.member }
let(:non_member) { create(:person) }
let(:guest) { Guest.new }

let(:marketplace) { create(:marketplace) }

let(:member_checkout) { build(:marketplace_checkout, :with_cart, :with_shopper, marketplace: marketplace, person: member) }
let(:guest_checkout) { build(:marketplace_checkout, :with_cart, :with_shopper, marketplace: marketplace) }
let(:non_member_checkout) { build(:marketplace_checkout, :with_cart, :with_shopper, marketplace: marketplace, person: non_member) }

permissions :new? do
it { is_expected.to permit(member, member_checkout) }
it { is_expected.not_to permit(non_member, member_checkout) }
it { is_expected.not_to permit(guest, member_checkout) }
it { is_expected.to permit(non_member, non_member_checkout) }
it { is_expected.not_to permit(member, non_member_checkout) }
it { is_expected.to permit(guest, guest_checkout) }
it { is_expected.not_to permit(member, guest_checkout) }
end
end
8 changes: 7 additions & 1 deletion spec/furniture/marketplace/marketplace_policy_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
subject { described_class }

let(:marketplace) { create(:marketplace) }
let(:membership) { create(:membership, space: marketplace.room.space ) }
let(:membership) { create(:membership, space: marketplace.room.space) }
let(:member) { membership.member }
let(:non_member) { create(:person) }
let(:guest) { nil }
Expand All @@ -14,4 +14,10 @@
it { is_expected.to permit(non_member, marketplace) }
it { is_expected.to permit(guest, marketplace) }
end

permissions :update? do
it { is_expected.to permit(member, marketplace) }
it { is_expected.not_to permit(non_member, marketplace) }
it { is_expected.not_to permit(guest, marketplace) }
end
end
24 changes: 24 additions & 0 deletions spec/furniture/marketplace/marketplaces_controller_request_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
require "rails_helper"
RSpec.describe Marketplace::MarketplacesController, type: :request do
let(:marketplace) { create(:marketplace) }
let(:space) { marketplace.space }
let(:membership) { create(:membership, space: space) }
let(:member) { membership.member }

describe "#edit" do
subject(:executed_response) {
get polymorphic_path(marketplace.location(:edit))
response
}

context "when a Member" do
before { sign_in(space, member) }

it { is_expected.to render_template(:edit) }
end

context "when unauthenticated" do
it { is_expected.to be_not_found }
end
end
end

0 comments on commit 31c6497

Please sign in to comment.