spree_reffiliate 2.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/ .travis.yml +3 -0
- data/.gitignore +14 -0
- data/.rspec +2 -0
- data/Gemfile +9 -0
- data/LICENSE +26 -0
- data/README.md +121 -0
- data/Rakefile +21 -0
- data/app/controllers/spree/admin/affiliates_controller.rb +23 -0
- data/app/controllers/spree/reffiliate_controller.rb +22 -0
- data/app/controllers/spree/user_controller_decorator.rb +6 -0
- data/app/models/spree/affiliate.rb +39 -0
- data/app/models/spree/promotion/rules/affiliated_promotion_rule.rb +37 -0
- data/app/models/spree/promotion/rules/referred_promotion_rule.rb +15 -0
- data/app/models/spree/referral.rb +40 -0
- data/app/models/spree/referred_record.rb +9 -0
- data/app/models/spree/user_decorator.rb +41 -0
- data/app/overrides/spree/admin/shared/_configuration_menu.rb +6 -0
- data/app/overrides/spree/admin/users/edit.rb +50 -0
- data/app/overrides/spree/admin/users/index.rb +18 -0
- data/app/overrides/spree/users/show.rb +12 -0
- data/app/views/spree/admin/affiliates/_form.html.erb +45 -0
- data/app/views/spree/admin/affiliates/edit.html.erb +76 -0
- data/app/views/spree/admin/affiliates/index.html.erb +55 -0
- data/app/views/spree/admin/affiliates/new.html.erb +23 -0
- data/app/views/spree/admin/promotions/rules/_affiliated_promotion_rule.erb +6 -0
- data/app/views/spree/admin/promotions/rules/_referred_promotion_rule.html.erb +0 -0
- data/bin/rails +7 -0
- data/config/initializers/spree.rb +6 -0
- data/config/locales/en.yml +10 -0
- data/config/routes.rb +8 -0
- data/db/migrate/20140907041850_create_spree_referrals.rb +8 -0
- data/db/migrate/20140907042024_create_spree_affiliates.rb +9 -0
- data/db/migrate/20140907042102_create_spree_referred_records.rb +9 -0
- data/db/migrate/20140907062121_add_index_to_spree_referrals.rb +5 -0
- data/db/migrate/20140907062422_add_index_to_spree_referred_record.rb +5 -0
- data/db/migrate/20140912003727_create_spree_promotion_rules_affiliates.rb +10 -0
- data/db/migrate/20140913042034_add_layout_to_spree_affiliate.rb +5 -0
- data/lib/generators/spree_reffiliate/install/install_generator.rb +21 -0
- data/lib/spree_reffiliate/engine.rb +20 -0
- data/lib/spree_reffiliate/factories.rb +12 -0
- data/lib/spree_reffiliate.rb +2 -0
- data/lib/tasks/spree_reffiliate.rake +10 -0
- data/spec/assets/spree/affiliates/corona.html.erb +1 -0
- data/spec/controllers/spree/reffiliate_controller_spec.rb +56 -0
- data/spec/controllers/spree/user_controller_spec.rb +20 -0
- data/spec/models/spree/affiliate_spec.rb +33 -0
- data/spec/models/spree/promotion/rules/affiliated_promotion_rule_spec.rb +46 -0
- data/spec/models/spree/promotion/rules/referred_promotion_rule_spec.rb +20 -0
- data/spec/models/spree/referral_spec.rb +41 -0
- data/spec/models/spree/referred_record_spec.rb +29 -0
- data/spec/models/spree/user_spec.rb +52 -0
- data/spec/spec_helper.rb +93 -0
- data/spree_reffiliate.gemspec +31 -0
- metadata +261 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
<% content_for :page_title do %>
|
2
|
+
<%= Spree.t(:listing_affiliates) %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<% content_for :page_actions do %>
|
6
|
+
<li>
|
7
|
+
<%= button_link_to Spree.t(:new_affiliate), new_admin_affiliate_url, :icon => 'plus', :id => 'admin_new_affiliate_link' %>
|
8
|
+
</li>
|
9
|
+
<% end %>
|
10
|
+
<% if @affiliates.any? %>
|
11
|
+
<table class="index" id="listing_affiliates" data-hook>
|
12
|
+
<colgroup>
|
13
|
+
<col style="width: 15%">
|
14
|
+
<col style="width: 20%">
|
15
|
+
<col style="width: 15%">
|
16
|
+
<col style="width: 15%">
|
17
|
+
<col style="width: 15%">
|
18
|
+
<col style="width: 20%">
|
19
|
+
</colgroup>
|
20
|
+
<thead>
|
21
|
+
<tr data-hook="admin_affiliates_index_headers">
|
22
|
+
<th><%= Spree.t('affiliate.name') %></th>
|
23
|
+
<th><%= Spree.t('affiliate.path') %></th>
|
24
|
+
<th><%= Spree.t('affiliate.count') %></th>
|
25
|
+
<th><%= Spree.t('affiliate.status') %></th>
|
26
|
+
<th data-hook="admin_affiliates_index_header_actions" class="actions"></th>
|
27
|
+
</tr>
|
28
|
+
</thead>
|
29
|
+
<tbody>
|
30
|
+
<% @affiliates.each do |affiliate|%>
|
31
|
+
<tr id="<%= spree_dom_id affiliate %>" data-hook="admin_affiliates_index_rows" class="<%= cycle('odd', 'even')%>">
|
32
|
+
<td class='affiliate_name'><%=link_to affiliate.name, edit_admin_affiliate_url(affiliate) %></td>
|
33
|
+
<td class='affiliate_path align-center'><%= affiliate_url(affiliate.path) %></td>
|
34
|
+
<td class='affiliate_count align-center'><%= affiliate.referred_count %></td>
|
35
|
+
<% if affiliate.partial.blank? or !affiliate_partial_exists?(affiliate.partial) %>
|
36
|
+
<td class='affiliate_status align-center' style="color: red">Not found</td>
|
37
|
+
<% elsif affiliate_partial_exists?(affiliate.partial) %>
|
38
|
+
<td class='affiliate_status align-center' style="color: green">Found</td>
|
39
|
+
<% end %>
|
40
|
+
<td data-hook="admin_affiliates_index_row_actions" class="actions">
|
41
|
+
<%= link_to_edit affiliate, :no_text => true %>
|
42
|
+
<%= link_to_delete affiliate, :no_text => true %>
|
43
|
+
</td>
|
44
|
+
</tr>
|
45
|
+
<% end %>
|
46
|
+
</tbody>
|
47
|
+
</table>
|
48
|
+
|
49
|
+
<%= paginate @affiliates %>
|
50
|
+
<% else %>
|
51
|
+
<div class="alpha twelve columns no-objects-found">
|
52
|
+
<%= Spree.t(:no_resource_found, resource: "affiliates") %>,
|
53
|
+
<%= link_to Spree.t(:add_one), spree.new_admin_affiliate_path %>!
|
54
|
+
</div>
|
55
|
+
<% end %>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<% content_for :page_title do %>
|
2
|
+
<%= Spree.t(:new_affiliate) %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<% content_for :page_actions do %>
|
6
|
+
<li>
|
7
|
+
<%= button_link_to Spree.t(:back_to_affiliates_list), spree.admin_affiliates_path, :icon => 'arrow-left' %>
|
8
|
+
</li>
|
9
|
+
<% end %>
|
10
|
+
|
11
|
+
<div data-hook="admin_affiliate_new_form_header">
|
12
|
+
<%= render :partial => 'spree/shared/error_messages', :locals => { :target => @affiliate } %>
|
13
|
+
</div>
|
14
|
+
|
15
|
+
<div data-hook="admin_affiliate_new_form">
|
16
|
+
<%= form_for [:admin, @affiliate], url: admin_affiliates_url, method: :post do |f| %>
|
17
|
+
<%= render :partial => 'form', :locals => { :f => f } %>
|
18
|
+
|
19
|
+
<div data-hook="admin_affiliate_new_form_buttons">
|
20
|
+
<%= render :partial => 'spree/admin/shared/new_resource_links' %>
|
21
|
+
</div>
|
22
|
+
<% end %>
|
23
|
+
</div>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<div class="field alpha omega eight columns">
|
2
|
+
<label><%= Spree.t('affiliates_promotion_rule.choose_affiliates') %></label><br>
|
3
|
+
<% Spree::Affiliate.all.each do |r| %>
|
4
|
+
<p><label><input type='checkbox' name='<%= param_prefix %>[affiliate_list][]' id='affiliate_list_<%= r.id %>' value='<%= r.id %>' <%= 'checked="checked"' if promotion_rule.affiliate_list.include?(r.id) %> /> <%= r.name %></label></p>
|
5
|
+
<% end %>
|
6
|
+
</div>
|
File without changes
|
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_reffiliate/engine', __FILE__)
|
5
|
+
|
6
|
+
require 'rails/all'
|
7
|
+
require 'rails/engine/commands'
|
@@ -0,0 +1,6 @@
|
|
1
|
+
Spree::PermittedAttributes.user_attributes.push :referral_code, :affiliate_code
|
2
|
+
config = Rails.application.config
|
3
|
+
config.after_initialize do
|
4
|
+
config.spree.promotions.rules << Spree::Promotion::Rules::ReferredPromotionRule
|
5
|
+
config.spree.promotions.rules << Spree::Promotion::Rules::AffiliatedPromotionRule
|
6
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
en:
|
2
|
+
spree:
|
3
|
+
promotion_rule_types:
|
4
|
+
referred_promotion_rule:
|
5
|
+
name: "Referred User"
|
6
|
+
description: "Must be a referred user"
|
7
|
+
affiliated_promotion_rule:
|
8
|
+
name: "Affiliate User"
|
9
|
+
description: "Must be an affiliated user"
|
10
|
+
editing_affiliate: "Editing Affiliate:"
|
data/config/routes.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
class CreateSpreePromotionRulesAffiliates < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :spree_affiliates_promotion_rules do |t|
|
4
|
+
t.integer :affiliate_id
|
5
|
+
t.integer :promotion_rule_id
|
6
|
+
end
|
7
|
+
add_index :spree_affiliates_promotion_rules, :affiliate_id
|
8
|
+
add_index :spree_affiliates_promotion_rules, :promotion_rule_id
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module SpreeReffiliate
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
|
5
|
+
class_option :auto_run_migrations, :type => :boolean, :default => false
|
6
|
+
|
7
|
+
def add_migrations
|
8
|
+
run 'bundle exec rake railties:install:migrations FROM=spree_reffiliate'
|
9
|
+
end
|
10
|
+
|
11
|
+
def run_migrations
|
12
|
+
run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
|
13
|
+
if run_migrations
|
14
|
+
run 'bundle exec rake db:migrate'
|
15
|
+
else
|
16
|
+
puts 'Skipping rake db:migrate, don\'t forget to run it!'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module SpreeReffiliate
|
2
|
+
class Engine < Rails::Engine
|
3
|
+
require 'spree/core'
|
4
|
+
isolate_namespace Spree
|
5
|
+
engine_name 'spree_reffiliate'
|
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,12 @@
|
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory :affiliate, class: Spree::Affiliate do
|
3
|
+
name Faker::Name.first_name
|
4
|
+
path Faker::Name.first_name
|
5
|
+
partial Faker::Name.first_name
|
6
|
+
layout nil
|
7
|
+
end
|
8
|
+
|
9
|
+
factory :referral, class: Spree::Referral
|
10
|
+
factory :referred_promotion_rule, class: Spree::Promotion::Rules::ReferredPromotionRule
|
11
|
+
factory :affiliated_promotion_rule, class: Spree::Promotion::Rules::AffiliatedPromotionRule
|
12
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
corona.html.erb
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::ReffiliateController, :type => :controller do
|
4
|
+
context "referral hyperlink" do
|
5
|
+
it "redirects to root path" do
|
6
|
+
spree_get :referral
|
7
|
+
expect(response).to redirect_to('/')
|
8
|
+
end
|
9
|
+
it "creates session variable with referral code" do
|
10
|
+
code = 'referral-code'
|
11
|
+
spree_get :referral, code: code
|
12
|
+
expect(session[:referral]).to eq(code)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
context "affiliate hyperlink" do
|
16
|
+
before (:each) do
|
17
|
+
@affiliate = FactoryGirl.create(:affiliate)
|
18
|
+
end
|
19
|
+
it "creates session variable with affiliate path" do
|
20
|
+
path = 'affiliate'
|
21
|
+
spree_get :affiliate, :path => path
|
22
|
+
expect(session[:affiliate]).to eq(path)
|
23
|
+
end
|
24
|
+
it "redirects to root path if path params is nil" do
|
25
|
+
spree_get :affiliate
|
26
|
+
expect(response).to redirect_to('/')
|
27
|
+
end
|
28
|
+
it "redirects to root path if affiliate has no partial" do
|
29
|
+
spree_get :affiliate, path: @affiliate.path
|
30
|
+
expect(response).to redirect_to('/')
|
31
|
+
end
|
32
|
+
it "redirects to root path if affiliate partial is not found" do
|
33
|
+
spree_get :affiliate, path: @affiliate.path
|
34
|
+
expect(response).to redirect_to('/')
|
35
|
+
end
|
36
|
+
it "renders a partial if affiliate partial is found" do
|
37
|
+
@affiliate.update_attribute :partial, 'corona'
|
38
|
+
controller.prepend_view_path 'spec/assets'
|
39
|
+
spree_get :affiliate, path: @affiliate.path
|
40
|
+
response.should render_template('spree/affiliates/corona')
|
41
|
+
end
|
42
|
+
context "layout options" do
|
43
|
+
@options = Hash[Spree::Affiliate.layout_options]
|
44
|
+
@options.each do |layout, option|
|
45
|
+
it "#{layout}" do
|
46
|
+
option = 'layouts/application' if option.nil?
|
47
|
+
@affiliate = FactoryGirl.create(:affiliate, name: layout, path: layout, partial: 'corona', layout: option)
|
48
|
+
controller.prepend_view_path 'spec/assets'
|
49
|
+
allow(controller).to receive(:partial_exists).and_return(true)
|
50
|
+
spree_get :affiliate, path: @affiliate.path
|
51
|
+
response.should render_template(layout: @affiliate.get_layout)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::UserRegistrationsController, :type => :controller do
|
4
|
+
before { @request.env['devise.mapping'] = Devise.mappings[:spree_user] }
|
5
|
+
|
6
|
+
context "#create" do
|
7
|
+
it "should add referral_code param" do
|
8
|
+
code = 'referral-code'
|
9
|
+
session[:referral] = code
|
10
|
+
spree_post :create, { spree_user: { email: 'foobar@example.com', password: 'foobar123', password_confirmation: 'foobar123' } }
|
11
|
+
expect(controller.params[:spree_user][:referral_code]).to eql(code)
|
12
|
+
end
|
13
|
+
it "should add affiliate_code param" do
|
14
|
+
code = 'affiliate-code'
|
15
|
+
session[:affiliate] = code
|
16
|
+
spree_post :create, { spree_user: { email: 'foobar@example.com', password: 'foobar123', password_confirmation: 'foobar123' } }
|
17
|
+
expect(controller.params[:spree_user][:affiliate_code]).to eql(code)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Affiliate, :type => :model do
|
4
|
+
it "should have a name" do
|
5
|
+
affiliate = FactoryGirl.build(:affiliate, name: nil)
|
6
|
+
expect(affiliate).to_not be_valid
|
7
|
+
end
|
8
|
+
it "should have a path" do
|
9
|
+
affiliate = FactoryGirl.build(:affiliate, path: nil)
|
10
|
+
expect(affiliate).to_not be_valid
|
11
|
+
end
|
12
|
+
|
13
|
+
context "with user" do
|
14
|
+
before do
|
15
|
+
@affiliate = FactoryGirl.create(:affiliate)
|
16
|
+
@affiliated = FactoryGirl.create(:user, affiliate_code: @affiliate.path)
|
17
|
+
@order = FactoryGirl.create(:order, :user => @affiliated)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns an array of user records" do
|
21
|
+
expect(@affiliate.referred_users).to eq([@affiliated])
|
22
|
+
end
|
23
|
+
it "returns an array of referred orders" do
|
24
|
+
expect(@affiliate.referred_orders).to eq([@order])
|
25
|
+
end
|
26
|
+
it "returns referred count" do
|
27
|
+
expect(@affiliate.referred_count).to eq(1)
|
28
|
+
end
|
29
|
+
it "returns an array of referred orders" do
|
30
|
+
expect(@affiliate.referred_records).to eq([@affiliated.affiliate_record])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Promotion::Rules::AffiliatedPromotionRule, :type => :model do
|
4
|
+
before do
|
5
|
+
@affiliate = FactoryGirl.create(:affiliate, path: 'corona')
|
6
|
+
@affiliated = FactoryGirl.create(:user, email: Faker::Internet.email, affiliate_code: @affiliate.path)
|
7
|
+
@affiliated_order = FactoryGirl.create(:order, :user_id => @affiliated.id)
|
8
|
+
|
9
|
+
@falsy_affiliate = FactoryGirl.create(:affiliate, path: 'victoria')
|
10
|
+
@falsy_affiliated = FactoryGirl.create(:user, email: Faker::Internet.email, affiliate_code: @falsy_affiliate.path)
|
11
|
+
@falsy_affiliated_order = FactoryGirl.create(:order, :user_id => @falsy_affiliated.id)
|
12
|
+
|
13
|
+
@user = FactoryGirl.create(:user, email: Faker::Internet.email)
|
14
|
+
@organic_order = FactoryGirl.create(:order, :user_id => @user)
|
15
|
+
|
16
|
+
@rule = FactoryGirl.build(:affiliated_promotion_rule)
|
17
|
+
@rule.affiliate_list = [@affiliate.id]
|
18
|
+
end
|
19
|
+
|
20
|
+
it "is applicable for an order" do
|
21
|
+
expect(@rule.applicable?(@affiliated_order)).to be_truthy
|
22
|
+
end
|
23
|
+
it "is elegible for affiliated user" do
|
24
|
+
expect(@rule.eligible?(@affiliated_order)).to be_truthy
|
25
|
+
end
|
26
|
+
it "is not elegible for organic user" do
|
27
|
+
expect(@rule.eligible?(@organic_order)).to be_falsy
|
28
|
+
end
|
29
|
+
it "is not elegible for falsy affiliated user" do
|
30
|
+
expect(@rule.eligible?(@falsy_affiliated_order)).to be_falsy
|
31
|
+
end
|
32
|
+
it "returns string selected affiliate ids" do
|
33
|
+
expect(@rule.affiliate_ids_string).to eq(@affiliate.id.to_s)
|
34
|
+
end
|
35
|
+
it "accepts string to assign affiliate ids" do
|
36
|
+
@rule.affiliate_ids_string = "1"
|
37
|
+
expect(@rule.affiliate_ids_string).to eq(@affiliate.id.to_s)
|
38
|
+
end
|
39
|
+
it "returns an array of affiliate ids" do
|
40
|
+
expect(@rule.affiliate_list).to eq([@affiliate.id])
|
41
|
+
end
|
42
|
+
it "accepts an array to assign affiliate ids" do
|
43
|
+
@rule.affiliate_list << [1]
|
44
|
+
expect(@rule.affiliate_list).to eq([@affiliate.id])
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Promotion::Rules::ReferredPromotionRule, :type => :model do
|
4
|
+
before(:each) do
|
5
|
+
@rule = FactoryGirl.build(:referred_promotion_rule)
|
6
|
+
@user = FactoryGirl.create(:user, email: Faker::Internet.email)
|
7
|
+
@referred = FactoryGirl.create(:user, email: Faker::Internet.email, referral_code: @user.referral.code)
|
8
|
+
@organic_order = FactoryGirl.create(:order, :user => @user)
|
9
|
+
@referred_order = FactoryGirl.create(:order, :user => @referred)
|
10
|
+
end
|
11
|
+
it "is applicable for an order" do
|
12
|
+
expect(@rule.applicable?(@referred_order)).to be_truthy
|
13
|
+
end
|
14
|
+
it "is elegible for referred user" do
|
15
|
+
expect(@rule.eligible?(@referred_order)).to be_truthy
|
16
|
+
end
|
17
|
+
it "is not elegible for organic user" do
|
18
|
+
expect(@rule.eligible?(@organic_order)).to be_falsy
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Referral, :type => :model do
|
4
|
+
it "generates a code after created" do
|
5
|
+
referral = FactoryGirl.build(:referral)
|
6
|
+
expect{referral.save}.to change{referral.code}
|
7
|
+
end
|
8
|
+
|
9
|
+
it "returns a code" do
|
10
|
+
user = FactoryGirl.create(:user)
|
11
|
+
referral = FactoryGirl.create(:referral, user: user)
|
12
|
+
expect(referral.code).to_not be_nil
|
13
|
+
end
|
14
|
+
|
15
|
+
context "with user" do
|
16
|
+
before(:each) do
|
17
|
+
@user = FactoryGirl.create(:user)
|
18
|
+
@referred = FactoryGirl.create(:user, referral_code: @user.referral.code)
|
19
|
+
@order = FactoryGirl.create(:order, user: @referred)
|
20
|
+
@referred_no_purchase = FactoryGirl.create(:user, referral_code: @user.referral.code)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns an associated user record" do
|
24
|
+
expect(@user.referral.user).to_not be_nil
|
25
|
+
end
|
26
|
+
it "returns referred records" do
|
27
|
+
expect(@user.referral.referred_records.count).to eq(2)
|
28
|
+
end
|
29
|
+
it "returns an array of referred users" do
|
30
|
+
expect(@user.referral.referred_users).to eq([@referred, @referred_no_purchase])
|
31
|
+
end
|
32
|
+
it "returns an array of referred orders" do
|
33
|
+
expect(@user.referral.referred_orders).to eq([@order])
|
34
|
+
end
|
35
|
+
it "returns an array of referral activated users with completed_orders" do
|
36
|
+
referred_user_with_completed_order = FactoryGirl.create(:user, referral_code: @user.referral.code)
|
37
|
+
completed_order = FactoryGirl.create(:order, completed_at: @user.created_at + 1.second, user: referred_user_with_completed_order)
|
38
|
+
expect(@user.referral.referral_activated_users).to eq([referred_user_with_completed_order])
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::ReferredRecord, :type => :model do
|
4
|
+
before(:each) do
|
5
|
+
@user = FactoryGirl.create(:user, email: Faker::Internet.email)
|
6
|
+
@referred = FactoryGirl.create(:user, email: Faker::Internet.email, referral_code: @user.referral.code)
|
7
|
+
@referral_record = @referred.referred_record
|
8
|
+
end
|
9
|
+
|
10
|
+
it "has a user id" do
|
11
|
+
expect(@referral_record.user_id).not_to be_nil
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a referral id" do
|
15
|
+
expect(@referral_record.referral_id).not_to be_nil
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns an associated user record" do
|
19
|
+
expect(@referral_record.referral.user).to eq(@user)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "returns an associated referred user record" do
|
23
|
+
expect(@referral_record.user).to eq(@referred)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns an associated referral record" do
|
27
|
+
expect(@referral_record.referral).to eq(@user.referral)
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::User, type: :model do
|
4
|
+
before(:each) do
|
5
|
+
@user = FactoryGirl.create(:user, email: Faker::Internet.email)
|
6
|
+
@referred = FactoryGirl.create(:user, email: Faker::Internet.email, referral_code: @user.referral.code)
|
7
|
+
@affiliate = Spree::Affiliate.create(name: Faker::Name.name, path: Faker::Name.name)
|
8
|
+
@affiliated = FactoryGirl.create(:user, email: Faker::Internet.email, affiliate_code: @affiliate.path)
|
9
|
+
end
|
10
|
+
context "referral user" do
|
11
|
+
it "has a referral record" do
|
12
|
+
expect(@user.referral).not_to be_nil
|
13
|
+
end
|
14
|
+
it "has a referral code" do
|
15
|
+
expect(@user.referral.code).not_to be_nil
|
16
|
+
end
|
17
|
+
it "has a referral count" do
|
18
|
+
expect(@user.referred_count).to eq(1)
|
19
|
+
end
|
20
|
+
it "has referred users" do
|
21
|
+
expect(@user.referral.referred_users).to eq([@referred])
|
22
|
+
end
|
23
|
+
it "has referred records" do
|
24
|
+
expect(@user.referral.referred_records).to eq([@referred.referred_record])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "referred user" do
|
29
|
+
it "has a referred user" do
|
30
|
+
expect(@referred.referred_by).to eq(@user)
|
31
|
+
end
|
32
|
+
it "has a referred record" do
|
33
|
+
expect(@referred.referred_record).to eq(@user.referral.referred_records.first)
|
34
|
+
end
|
35
|
+
it "returns boolean if referred" do
|
36
|
+
expect(@referred.referred?).to be_truthy
|
37
|
+
expect(@user.referred?).to be_falsy
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "affiliated user" do
|
42
|
+
it "has an affiliate" do
|
43
|
+
expect(@affiliated.affiliate).to eq(@affiliate)
|
44
|
+
end
|
45
|
+
it "returns boolean if affiliated" do
|
46
|
+
expect(@affiliated.affiliate?).to be_truthy
|
47
|
+
end
|
48
|
+
it "returns an affiliated record" do
|
49
|
+
expect(@affiliated.affiliate_record).to eq(@affiliate.referred_records.first)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|