fixed rspec tests, more fit and finish around how the invite code works,

and improving admin functionality
This commit is contained in:
Maxwell Salzberg 2012-03-15 13:48:21 -07:00 committed by danielgrippi
parent 6b97b8044b
commit 319b3c4d3b
18 changed files with 143 additions and 123 deletions

View file

@ -11,11 +11,12 @@ class AdminsController < ApplicationController
end
def admin_inviter
email = params[:idenitifer]
inviter = InvitationCode.default_inviter_or(current_user)
email = params[:identifier]
user = User.find_by_email(email)
unless user
EmailInviter.new(email).send!
EmailInviter.new(email, inviter).send!
flash[:notice] = "invitation sent to #{email}"
else
flash[:notice]= "error sending invite to #{email}"
@ -23,6 +24,11 @@ class AdminsController < ApplicationController
redirect_to user_search_path, :notice => flash[:notice]
end
def add_invites
InvitationCode.find_by_token(params[:invite_code_id]).add_invites!
redirect_to user_search_path
end
def weekly_user_stats
@created_users = User.where("username IS NOT NULL")
@created_users_by_week = Hash.new{ |h,k| h[k] = [] }

View file

@ -26,7 +26,7 @@ class InvitationsController < ApplicationController
def create
inviter = EmailInviter.new(params[:email_inviter][:emails], params[:email_inviter])
inviter = EmailInviter.new(params[:email_inviter][:emails], current_user, params[:email_inviter])
inviter.send!
redirect_to :back, :notice => "Great! Invites were sent off to #{inviter.emails.join(', ')}"
end

View file

@ -70,7 +70,7 @@ class Invitation < ActiveRecord::Base
# @return [Invitation] self
def send!
if email_like_identifer
EmailInviter.new(self.identifier).send!
EmailInviter.new(self.identifier, sender).send!
else
puts "broken facebook invitation_token"
end

View file

@ -3,15 +3,35 @@ class InvitationCode < ActiveRecord::Base
validates_presence_of :user
before_create :generate_token
before_create :generate_token, :set_default_invite_count
def to_param
token
end
def add_invites!
self.update_attributes(:count => self.count+100)
end
def use!
self.update_attributes(:count => self.count-1)
end
def generate_token
begin
self.token = ActiveSupport::SecureRandom.hex(6)
end while InvitationCode.exists?(:token => self[:token])
end
end
def self.default_inviter_or(user)
if AppConfig[:admin_account].present?
inviter = User.find_by_username(AppConfig[:admin_account])
end
inviter ||= user
inviter
end
def set_default_invite_count
self.count = AppConfig[:invite_count] || 25
end
end

View file

@ -83,7 +83,6 @@ class User < ActiveRecord::Base
User.joins(:contacts).where(:contacts => {:person_id => person.id})
end
<<<<<<< HEAD
def self.monthly_actives(start_day = Time.now)
logged_in_since(start_day - 1.month)
end
@ -108,28 +107,18 @@ class User < ActiveRecord::Base
ConversationVisibility.sum(:unread, :conditions => "person_id = #{self.person.id}")
end
# @return [User]
def self.find_by_invitation(invitation)
service = invitation.service
identifier = invitation.identifier
if service == 'email'
existing_user = User.where(:email => identifier).first
else
existing_user = User.joins(:services).where(:services => {:type => "Services::#{service.titleize}", :uid => identifier}).first
=======
#should be deprecated
def ugly_accept_invitation_code
begin
self.invitations_to_me.first.sender.invitation_code
rescue Exception => e
nil
>>>>>>> invite_link functionailty mostly works
end
end
def process_invite_acceptence(invite)
self.invited_by = invite.user
invite.use!
end

View file

@ -1,65 +1,47 @@
.span-24
= render :partial => 'admins/admin_bar.haml'
%br
%br
.span-24.prepend-4
%h3
= form_tag 'admin_inviter', :method => :get do
email to invite:
= text_field_tag 'identifier'
= submit_tag 'invite'
%h3
you currently have
= current_user.invitation_code.count
invites left
= link_to "add_invites", add_invites_path(current_user.invitation_code)
= form_tag 'admin_inviter', :method => :get do
email to invite:
= text_field_tag 'identifier'
= submit_tag 'invite'
%h3
user search
= form_tag 'user_search', :method => :get do
username:
= text_field_tag 'user[username]', params[:user][:username]
%h3
user search
= form_tag 'user_search', :method => :get do
username:
= text_field_tag 'user[username]', params[:user][:username]
email:
= text_field_tag 'user[email]', params[:user][:email]
email:
= text_field_tag 'user[email]', params[:user][:email]
invitation identifier:
= text_field_tag 'user[invitation_identifier]', params[:user][:invitation_identifier]
invitation token:
= text_field_tag 'user[invitation_token]', params[:user][:invitation_token]
= submit_tag 'go'
= submit_tag 'go'
= "#{@users.count} users found"
%br
%br
= for user in @users
= user.inspect
= "#{@users.count} users found"
%br
- if user.person
= user.person.inspect
%br
- @users.each do |user|
= user.inspect
%br
- if user.person.profile
= user.person.profile.inspect
- if user.person
= user.person.inspect
%br
- if user.person.profile
= user.person.profile.inspect
%br
= "invite token: #{invite_code_url(user.invited_by.invite_code)}" if user.invited_by.present?
= link_to "add_invites", add_invites_path(user.invitation_code)
%br
= "invite token: #{accept_invitation_url(user, :invitation_token => user.invitation_token)}" if user.invitation_token
%br
%br
%br
%br
= javascript_include_tag 'apiconsole'
#query
%h3 api console
= text_field_tag :api
= submit_tag 'ping this api', :id => 'api_submit'
response:
%br
%br
#resp
%br
post to Diaspora v1
%br
%br

View file

@ -1,4 +1,4 @@
<%- self.extend NotifierHelper -%>
<%- self.extend NotifierHelper -%>
<head>
<title><%=invite_email_title %></title>
</head>

View file

@ -49,6 +49,12 @@ defaults: &defaults
# Set this to true if you want users to invite as many people as they want
open_invitations: true
#the 'admin' account for your pod... ie for jd.com, this is diasporahq
admin_account: ''
#the default amount of invitiations for an invite link
invite_count: 25
# Set this to true if you don't want your users to follow the diasporahq@joindiaspora.com
# account on account creation. The diasporahq account helps users start with some
# activity in their stream and get news about Diaspora, but if you don't want your server

View file

@ -112,6 +112,7 @@ Diaspora::Application.routes.draw do
get :weekly_user_stats
get :correlations
get :stats, :as => 'pod_stats'
get "add_invites/:invite_code_id" => 'admins#add_invites', :as => 'add_invites'
end
resource :profile, :only => [:edit, :update]

View file

@ -166,7 +166,6 @@ class CreateImportTables < ActiveRecord::Migration
t.string :language
t.string :email
t.database_authenticatable
t.invitable
t.recoverable
t.rememberable
t.trackable

View file

@ -26,13 +26,15 @@ Given /^a nsfw user with email "([^\"]*)"$/ do |email|
end
Given /^I have been invited by an admin$/ do
i = EmailInviter.new("new_invitee@example.com")
admin = Factory(:user)
bob.invitation_code
i = EmailInviter.new("new_invitee@example.com", bob)
i.send!
end
Given /^I have been invited by a user$/ do
@inviter = Factory(:user)
i = EmailInviter.new("new_invitee@example.com", :inviter => @inviter)
i = EmailInviter.new("new_invitee@example.com", @inviter)
i.send!
end

View file

@ -1,10 +1,10 @@
class EmailInviter
attr_accessor :emails, :message, :inviter, :locale
def initialize(emails, options={})
def initialize(emails, inviter, options={})
self.message = options[:message]
self.inviter = options[:inviter]
self.locale = options.fetch(:locale, 'en')
self.inviter = inviter
self.emails = emails
end
@ -15,12 +15,7 @@ class EmailInviter
end
def invitation_code
@invitation_code ||= inviter.nil? ? EmailInviter.admin_code : inviter.invitation_code
end
def self.admin_code
puts "FIX ME"
"foo"
@invitation_code ||= inviter.invitation_code
end
def send!

View file

@ -26,6 +26,11 @@ module RakeHelpers
possible_invite = Invitation.find_by_identifier(backer_email)
possible_user ||= possible_invite.recipient if possible_invite.present?
admin_account = User.find_by_username(AppConfig[:admin_account])
raise "no admin_account in application.yml" unless admin_account.present?
admin_account.invitation_code.count += num_to_process
admin_account.invitation_code.save
unless possible_user
puts "#{n}: sending email to: #{backer_name} #{backer_email}" unless Rails.env == 'test'
unless test

View file

@ -73,11 +73,6 @@ describe AdminsController do
AppConfig[:admins] = [@user.username]
end
it 'succeeds' do
get :admin_inviter, :identifier => 'bob@moms.com'
response.should be_redirect
end
it 'does not die if you do it twice' do
get :admin_inviter, :identifier => 'bob@moms.com'
get :admin_inviter, :identifier => 'bob@moms.com'
@ -85,7 +80,7 @@ describe AdminsController do
end
it 'invites a new user' do
Invitation.should_receive(:create)
EmailInviter.should_receive(:new).and_return(stub.as_null_object)
get :admin_inviter, :identifier => 'bob@moms.com'
response.should redirect_to user_search_path
flash.notice.should include("invitation sent")

View file

@ -20,8 +20,8 @@ describe InvitationsController do
end
it 'creates an EmailInviter' do
inviter = stub(:emails => ['mbs@gmail.com'])
EmailInviter.should_receive(:new).with(@invite['email_inviter']['emails'], @invite['email_inviter']).
inviter = stub(:emails => ['mbs@gmail.com'], :send! => true)
EmailInviter.should_receive(:new).with(@invite['email_inviter']['emails'], @user, @invite['email_inviter']).
and_return(inviter)
post :create, @invite
end
@ -41,7 +41,6 @@ describe InvitationsController do
end
end
describe '#new' do
it 'renders' do
sign_in :user, @user

View file

@ -4,65 +4,53 @@ describe EmailInviter do
before do
@user = stub(:invitation_code => 'coolcodebro', :present? => true,
:email => 'foo@bar.com')
@emails = "mbs333@gmail.com, foo@bar.com maxwell@dude.com"
@emails = "mbs333@gmail.com, foo1@bar.com maxwell@dude.com"
end
it 'has a list of emails' do
inviter = EmailInviter.new(@emails)
inviter = EmailInviter.new(@emails, @user)
inviter.emails.should_not be_empty
end
it 'should parse three emails' do
inviter = EmailInviter.new(@emails)
inviter = EmailInviter.new(@emails, @user)
inviter.emails.count.should == 3
end
it 'an optional inviter' do
inviter = EmailInviter.new(@emails, :inviter => @user)
it 'has an inviter' do
inviter = EmailInviter.new(@emails, @user)
inviter.inviter.should_not be_nil
end
it 'can have a message' do
message = "you guys suck hard"
inviter = EmailInviter.new("emails", :message => message)
inviter = EmailInviter.new("emails", @user, :message => message)
inviter.message.should == message
end
describe '#emails' do
it 'rejects the inviter email if present' do
inviter = EmailInviter.new(@emails + " #{@user.email}", :inviter => @user)
inviter = EmailInviter.new(@emails + " #{@user.email}", @user)
inviter.emails.should_not include(@user.email)
end
end
describe 'language' do
it 'defaults to english' do
inviter = EmailInviter.new(@emails)
inviter = EmailInviter.new(@emails, @user)
inviter.locale.should == 'en'
end
it 'listens to the langauge option' do
inviter = EmailInviter.new(@emails, :locale => 'es')
inviter = EmailInviter.new(@emails, @user, :locale => 'es')
inviter.locale.should == 'es'
end
end
describe '#invitation_code' do
it 'delegates to the user if it exists' do
inviter = EmailInviter.new(@emails, :inviter => @user)
it 'delegates to the user' do
inviter = EmailInviter.new(@emails, @user)
inviter.invitation_code.should == @user.invitation_code
end
it 'calls admin_code if it does not' do
inviter = EmailInviter.new(@emails)
inviter.should_receive(:admin_code).and_return("foo")
inviter.invitation_code.should == "foo"
end
end
describe 'admin code' do
it 'is hella pending' do
pending
end
end
end

View file

@ -12,20 +12,18 @@ describe RakeHelpers do
describe '#process_emails' do
before do
Devise.mailer.deliveries = []
end
it 'should send emails to each backer' do
expect{
process_emails(@csv, 100, 1, false)
}.to change(User, :count).by(3)
@old_admin = AppConfig[:admin_account]
AppConfig[:admin_account] = Factory(:user).username
end
it 'should not send the email to the same email twice' do
process_emails(@csv, 100, 1, false)
after do
AppConfig[:admin_account] = @old_admin
end
Devise.mailer.deliveries.count.should == 3
process_emails(@csv, 100, 1, false)
it 'should send emails to each email' do
Devise.mailer.deliveries.count.should == 3
EmailInviter.should_receive(:new).exactly(3).times.and_return(stub.as_null_object)
process_emails(@csv, 100, 1, false)
end
end
end

View file

@ -4,4 +4,39 @@ describe InvitationCode do
it 'has a valid factory' do
Factory(:invitation_code).should be_valid
end
it 'sets the count to a default value' do
code = Factory(:invitation_code)
code.count.should > 0
end
describe '#use!' do
it 'decrements the count of the code' do
code = Factory(:invitation_code)
expect{
code.use!
}.to change(code, :count).by(-1)
end
end
describe '.default_inviter_or' do
before do
@old_account = AppConfig[:admin_account]
AppConfig[:admin_account] = 'bob'
end
after do
AppConfig[:admin_account] = @old_account
end
it 'grabs the set admin account for the pod...' do
InvitationCode.default_inviter_or(alice).username.should == 'bob'
end
it '..or the given user' do
AppConfig[:admin_account] = ''
InvitationCode.default_inviter_or(alice).username.should == 'alice'
end
end
end