# frozen_string_literal: true require "rails_helper" module DiscourseSubscriptions RSpec.describe Admin::CouponsController do it "is a subclass of AdminController" do expect(DiscourseSubscriptions::Admin::CouponsController < ::Admin::AdminController).to eq( true, ) end context "when unauthenticated" do it "does nothing" do ::Stripe::PromotionCode.expects(:list).never get "/s/admin/coupons.json" expect(response.status).to eq(404) end end context "when authenticated" do let(:admin) { Fabricate(:admin) } before { sign_in(admin) } describe "#index" do it "returns a list of promo codes" do ::Stripe::PromotionCode .expects(:list) .with({ limit: 100 }) .returns({ data: [{ id: "promo_123", coupon: { valid: true } }] }) get "/s/admin/coupons.json" expect(response.status).to eq(200) expect(response.parsed_body[0]["id"]).to eq("promo_123") end it "only returns valid promo codes" do ::Stripe::PromotionCode .expects(:list) .with({ limit: 100 }) .returns({ data: [{ id: "promo_123", coupon: { valid: false } }] }) get "/s/admin/coupons.json" expect(response.status).to eq(200) expect(response.parsed_body).to be_blank end end describe "#create" do it "creates a coupon with an amount off" do ::Stripe::Coupon.expects(:create).returns(id: "coup_123") ::Stripe::PromotionCode.expects(:create).returns( { code: "p123", coupon: { amount_off: 2000 } }, ) post "/s/admin/coupons.json", params: { promo: "p123", discount_type: "amount", discount: "2000", active: true, } expect(response.status).to eq(200) expect(response.parsed_body["code"]).to eq("p123") expect(response.parsed_body["coupon"]["amount_off"]).to eq(2000) end it "creates a coupon with a percent off" do ::Stripe::Coupon.expects(:create).returns(id: "coup_123") ::Stripe::PromotionCode.expects(:create).returns( { code: "p123", coupon: { percent_off: 20 } }, ) post "/s/admin/coupons.json", params: { promo: "p123", discount_type: "percent", discount: "20", active: true, } expect(response.status).to eq(200) expect(response.parsed_body["code"]).to eq("p123") expect(response.parsed_body["coupon"]["percent_off"]).to eq(20) end end end end end