<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>app/models/role.rb</filename>
    </added>
    <added>
      <filename>db/migrate/056_create_roles.rb</filename>
    </added>
    <added>
      <filename>test/fixtures/roles.yml</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -110,6 +110,13 @@ Finally, you'll need an S3 account for S3 photo uploading.
 CommunityEngine includes the s3.rake tasks for backing up your site to S3. If you plan on using these, you'll need to add a file in RAILS_ROOT/config/s3.yml. (Sample in sample_files/s3.yml)
 
 
+## ROLES ##
+CommunityEngine Users have a Role (by default, it's admin, moderator, or member)
+To set a user as an admin, you must manually change his role_id through the database.
+Once logged in as an admin, you'll be able to toggle other users between moderator and member (just go to their profile page and look on the sidebar.)
+Admins and moderators can edit and delete other users posts.
+
+
 ## THEMES ##
 To create a theme:
 1. Add a 'themes' directory in RAILS_ROOT with the following structure:</diff>
      <filename>README</filename>
    </modified>
    <modified>
      <diff>@@ -4,4 +4,4 @@ homepage: http://www.missingmethod.com
 summary: A social networking engine
 description: Adds basic social networking capabilities to your existing application, including users, blogs, photos, clippings, favorites, and more.
 license: MIT
-version: 0.10.2
\ No newline at end of file
+version: 0.10.3
\ No newline at end of file</diff>
      <filename>about.yml</filename>
    </modified>
    <modified>
      <diff>@@ -11,7 +11,7 @@ class PostsController &lt; BaseController
                            
   before_filter :login_required, :only =&gt; [:new, :edit, :update, :destroy, :create, :manage]
   before_filter :find_user, :only =&gt; [:new, :edit, :index, :show, :update_view, :manage]
-  before_filter :require_current_user, :only =&gt; [:create, :edit, :update, :destroy, :manage]
+  before_filter :require_ownership_or_moderator, :only =&gt; [:create, :edit, :update, :destroy, :manage]
 
   def manage
     @posts = @user.posts.find_without_published_as(:all, :page =&gt; {:current =&gt; params[:page], :size =&gt; 10}, :order =&gt; 'published_at DESC')
@@ -230,6 +230,12 @@ class PostsController &lt; BaseController
     render :partial =&gt; &quot;/categories/tips&quot;, :locals =&gt; {:category =&gt; nil}    
   end
   
-
+  def require_ownership_or_moderator
+    @user ||= User.find(params[:user_id] || params[:id] )
+    unless admin? || moderator? || (@user &amp;&amp; (@user.eql?(current_user)))
+      redirect_to :controller =&gt; 'sessions', :action =&gt; 'new' and return false
+    end
+    return @user
+  end
   
 end
\ No newline at end of file</diff>
      <filename>app/controllers/posts_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -22,7 +22,7 @@ class UsersController &lt; BaseController
   before_filter :require_current_user, :only =&gt; [:edit, :update, :update_account,
                                                 :edit_pro_details, :update_pro_details,
                                                 :welcome_photo, :welcome_about, :welcome_invite]
-  before_filter :admin_required, :only =&gt; [:assume, :destroy, :featured, :toggle_featured]
+  before_filter :admin_required, :only =&gt; [:assume, :destroy, :featured, :toggle_featured, :toggle_moderator]
   before_filter :admin_or_current_user_required, :only =&gt; [:statistics]  
 
   def activate
@@ -78,6 +78,7 @@ class UsersController &lt; BaseController
 
   def create
     @user = User.new(params[:user])
+    @user.role = Role[:member]
     @user.save!
     create_friendship_with_inviter(@user, params)
     flash[:notice] = &quot;Thanks for signing up! You should receive an e-mail confirmation shortly at #{@user.email}&quot;
@@ -307,6 +308,14 @@ class UsersController &lt; BaseController
     @user.toggle!(:featured_writer)
     redirect_to user_path(@user)
   end
+
+  def toggle_moderator
+    @user = User.find(params[:id])
+    @user.role = @user.moderator? ? Role[:member] : Role[:moderator]
+    @user.save!
+    redirect_to user_path(@user)
+  end
+
   
   def statistics
     if params[:date]</diff>
      <filename>app/controllers/users_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,8 @@ class User &lt; ActiveRecord::Base
   MALE    = 'M'
   FEMALE  = 'F'
 
-  attr_protected :admin, :featured
+  attr_protected :admin, :featured, :role_id
+  
   before_save :encrypt_password, :whitelist_attributes
   before_create :make_activation_code
   after_create :update_last_login
@@ -39,6 +40,8 @@ class User &lt; ActiveRecord::Base
   has_many :invitations, :dependent =&gt; :destroy
   has_many :offerings, :dependent =&gt; :destroy
 
+  has_enumerated :role  
+
   #friends
   has_many :friendships, :class_name =&gt; &quot;Friendship&quot;, :foreign_key =&gt; &quot;user_id&quot;, :dependent =&gt; :destroy
   has_many :accepted_friendships, :class_name =&gt; &quot;Friendship&quot;, :conditions =&gt; ['friendship_status_id = ?', 2]
@@ -377,6 +380,17 @@ class User &lt; ActiveRecord::Base
   def display_name
     login
   end
+  
+  def admin?
+    role &amp;&amp; role.eql?(Role[:admin])
+  end
+  def moderator?
+    role &amp;&amp; role.eql?(Role[:moderator])
+  end
+  def member?
+    role &amp;&amp; role.eql?(Role[:member])
+  end
+  
 
 
   #from savage beast</diff>
      <filename>app/models/user.rb</filename>
    </modified>
    <modified>
      <diff>@@ -24,7 +24,7 @@
               %a{:href=&gt;&quot;#&quot;, :onclick=&gt;&quot;showSendTo_friend(); return false;&quot;, :title=&gt;&quot;E-mail this story to friends&quot;} E-mail to friends
             %li.share
               %script{:type=&gt;&quot;text/javascript&quot;, :src=&gt;&quot;http://w.sharethis.com/widget/?tabs=web&amp;amp;charset=utf-8&amp;amp;style=default&amp;amp;publisher=4488bdef-d776-4c80-93e1-ac1fb8359971&amp;amp;linkfg=%23131358&quot;}
-            -if @is_current_user || admin?
+            -if @is_current_user || admin? || moderator?
               %li.edit= link_to &quot;Edit&quot;, edit_user_post_path(@post.user, @post)
               %li.delete= link_to &quot;Delete&quot;, user_post_path(@post.user, @post), {:method =&gt; :delete, :confirm =&gt; 'Permanently delete this post?'}
 </diff>
      <filename>app/views/posts/show.html.haml</filename>
    </modified>
    <modified>
      <diff>@@ -17,8 +17,8 @@
       #monitor_topic
         %input#monitor_checkbox{:type=&gt;&quot;checkbox&quot;, :checked=&gt; @monitoring, :onclick=&gt;&quot;monitor_click()&quot;}
         %label#monitor_label{&quot;for&quot;=&gt;&quot;monitor_checkbox&quot;}
-          Watch
-          = &quot;ing&quot; if @monitoring
+          
+          = &quot;Watch#{@monitoring ? 'ing' : ''}&quot;
           = _('topic')
         = hidden_field_tag '_method', 'delete' if @monitoring
         = submit_tag :Set, :id =&gt; 'monitor_submit'</diff>
      <filename>app/views/topics/show.html.haml</filename>
    </modified>
    <modified>
      <diff>@@ -7,6 +7,8 @@
     = link_to( &quot;&amp;raquo; Delete this user&quot;, user_path(@user), {:method =&gt; :delete, :confirm =&gt; 'Are you sure you want to permanently delete this user?'} )
     %br/
     = link_to( &quot;&amp;raquo; Toggle #{AppConfig.featured_writer_label}&quot;, toggle_featured_user_path(@user), {:method =&gt; :put} )
+    %br/
+    = link_to( &quot;&amp;raquo; Assign role: #{@user.moderator? ? 'member' : 'moderator'}&quot;, toggle_moderator_user_path(@user), {:method =&gt; :put} )
 
 #profile_details.box.hentry
   %h3</diff>
      <filename>app/views/users/_profile_user_info_sidebar.html.haml</filename>
    </modified>
    <modified>
      <diff>@@ -62,6 +62,10 @@ module AuthenticatedSystem
      logged_in? &amp;&amp; current_user.admin?
     end
     
+    def moderator?
+     logged_in? &amp;&amp; current_user.moderator?      
+    end
+    
 
     # Filter method to enforce a login requirement.
     #
@@ -128,7 +132,7 @@ module AuthenticatedSystem
     # Inclusion hook to make #current_user and #logged_in?
     # available as ActionView helper methods.
     def self.included(base)
-      base.send :helper_method, :current_user, :logged_in?, :admin?
+      base.send :helper_method, :current_user, :logged_in?, :admin?, :moderator?
     end
 
     # When called with before_filter :login_from_cookie will check for an :auth_token</diff>
      <filename>lib/authenticated_system.rb</filename>
    </modified>
    <modified>
      <diff>@@ -85,6 +85,7 @@ resources :contests, :member =&gt; { :latest =&gt; :get }
 resources :users, :member_path =&gt; '/:id', :nested_member_path =&gt; '/:user_id', :member =&gt; { 
     :dashboard =&gt; :get,
     :assume =&gt; :get,
+    :toggle_moderator =&gt; :put,
     :toggle_featured =&gt; :put,
     :change_profile_photo =&gt; :put,
     :return_admin =&gt; :get, </diff>
      <filename>routes.rb</filename>
    </modified>
    <modified>
      <diff>@@ -8,13 +8,13 @@ quentin:
   created_at: &lt;%= 5.days.ago.to_s :db %&gt;
   activated_at: &lt;%= 5.days.ago.to_s :db %&gt;  
   activation_code: 
-  admin: 0
   state_id: 1
   metro_area_id: 1
   profile_public: true
   login_slug: quentin
   birthday: &lt;%= 15.years.ago.to_s :db %&gt;
   activities_count: 0
+  role_id: 3
 aaron:
   id: 2
   login: aaron
@@ -27,9 +27,9 @@ aaron:
   activation_code: 
   sb_posts_count: 2
   sb_last_seen_at: &lt;%= 5.minutes.ago.to_s :db %&gt;
-  admin: 0
   login_slug: aaron
   birthday: &lt;%= 15.years.ago.to_s :db %&gt;  
+  role_id: 3
 kevin:
   id: 3
   login: kevin
@@ -40,9 +40,9 @@ kevin:
   created_at: &lt;%= 5.days.ago.to_s :db %&gt;
   activated_at: &lt;%= 5.days.ago.to_s :db %&gt;  
   activation_code: 
-  admin: 0
   login_slug: kevin
   birthday: &lt;%= 15.years.ago.to_s :db %&gt;  
+  role_id: 3
 admin:
   id: 4
   login: admin
@@ -53,9 +53,9 @@ admin:
   created_at: &lt;%= 1.days.ago.to_s :db %&gt;
   activated_at: &lt;%= 30.minutes.ago.to_s :db %&gt;  
   activation_code: 
-  admin: 1
   login_slug: admin
   birthday: &lt;%= 15.years.ago.to_s :db %&gt;  
+  role_id: 1
 dwr:
   id: 5
   login: dwreach
@@ -66,10 +66,10 @@ dwr:
   created_at: &lt;%= 1.days.ago.to_s :db %&gt;
   activated_at: &lt;%= 30.minutes.ago.to_s :db %&gt;  
   activation_code: 
-  admin: 0
   vendor: 1
   login_slug: dwreach
   birthday: &lt;%= 15.years.ago.to_s :db %&gt;  
+  role_id: 3
 leopoldo:
   id: 6
   login: leopoldo
@@ -81,9 +81,9 @@ leopoldo:
   activated_at: &lt;%= 5.days.ago.to_s :db %&gt;  
   metro_area_id: 4
   activation_code: 
-  admin: 0
   login_slug: leopoldo
   birthday: &lt;%= 15.years.ago.to_s :db %&gt;  
+  role_id: 3  
 florian:
   id: 7
   login: florian
@@ -95,9 +95,9 @@ florian:
   activated_at: &lt;%= 10.minutes.ago.to_s :db %&gt;  
   metro_area_id: 5
   activation_code: 
-  admin: 0
   login_slug: florian
   birthday: &lt;%= 15.years.ago.to_s :db %&gt;  
+  role_id: 3  
 super_writer:
   id: 8
   login: superwriter
@@ -109,10 +109,10 @@ super_writer:
   activated_at: &lt;%= 10.minutes.ago.to_s :db %&gt;  
   metro_area_id: 5
   activation_code: 
-  admin: 0
   featured_writer: 1
   login_slug: superwriter
   birthday: &lt;%= 15.years.ago.to_s :db %&gt;  
+  role_id: 3  
 plumberbob:
   id: 9
   login: plumberbob
@@ -123,10 +123,10 @@ plumberbob:
   created_at: &lt;%= 1.days.ago.to_s :db %&gt;
   activated_at: &lt;%= 30.minutes.ago.to_s :db %&gt;  
   activation_code: 
-  admin: 0
   vendor: 1
   login_slug: plumberbob
   birthday: &lt;%= 15.years.ago.to_s :db %&gt;  
+  role_id: 3  
 privateuser:
   id: 10
   login: privateuser
@@ -137,11 +137,11 @@ privateuser:
   created_at: &lt;%= 1.days.ago.to_s :db %&gt;
   activated_at: &lt;%= 30.minutes.ago.to_s :db %&gt;  
   activation_code: 
-  admin: 0
   vendor: 0
   login_slug: privateuser
   profile_public: 0
   birthday: &lt;%= 15.years.ago.to_s :db %&gt;  
+  role_id: 3  
 sam:
   id: 11
   login: sam
@@ -152,6 +152,7 @@ sam:
   sb_last_seen_at: &lt;%= 4.minutes.ago.to_s :db %&gt;
   activated_at: &lt;%= 5.days.ago.to_s :db %&gt;  
   activation_code: 
+  role_id: 3    
 joe:
   id: 12
   login: joe
@@ -162,6 +163,7 @@ joe:
   sb_last_seen_at: &lt;%= 4.minutes.ago.to_s :db %&gt;
   activated_at: &lt;%= 5.days.ago.to_s :db %&gt;  
   activation_code: 
+  role_id: 3    
 kyle:
   id: 13
   login: kyle
@@ -171,4 +173,5 @@ kyle:
   sb_posts_count: 0  
   activated_at: &lt;%= 5.days.ago.to_s :db %&gt;  
   activation_code: 
+  role_id: 3  
   
\ No newline at end of file</diff>
      <filename>test/fixtures/users.yml</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'activities_controller'
 class ActivitiesController; def rescue_action(e) raise e end; end
 
 class ActivitiesControllerTest &lt; Test::Unit::TestCase
-  fixtures :users, :categories, :posts, :comments
+  fixtures :users, :categories, :posts, :comments, :roles
 
   def setup
     @controller = ActivitiesController.new</diff>
      <filename>test/functional/activities_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'admin_controller'
 class AdminController; def rescue_action(e) raise e end; end
 
 class AdminControllerTest &lt; Test::Unit::TestCase
-  fixtures :users, :categories
+  fixtures :users, :categories, :roles
 
   def setup
     @controller = AdminController.new</diff>
      <filename>test/functional/admin_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'ads_controller'
 class AdsController; def rescue_action(e) raise e end; end
 
 class AdsControllerTest &lt; Test::Unit::TestCase
-  fixtures :ads, :users, :categories
+  fixtures :ads, :users, :categories, :roles
 
   def setup
     @controller = AdsController.new</diff>
      <filename>test/functional/ads_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,7 +7,7 @@ require File.dirname(__FILE__) + '/../test_helper'
 # class BaseController &lt; ApplicationController; def rescue_action(e) raise e end; end
 
 class BaseControllerTest &lt; Test::Unit::TestCase
-  fixtures :clippings, :users, :photos, :homepage_features, :taggings, :tags, :posts, :categories
+  fixtures :clippings, :users, :photos, :homepage_features, :taggings, :tags, :posts, :categories, :roles
 
   def setup
     @controller = BaseController.new</diff>
      <filename>test/functional/base_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'categories_controller'
 class CategoriesController; def rescue_action(e) raise e end; end
 
 class CategoriesControllerTest &lt; Test::Unit::TestCase
-  fixtures :categories, :users
+  fixtures :categories, :users, :roles
 
   def setup
     @controller = CategoriesController.new</diff>
      <filename>test/functional/categories_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'clippings_controller'
 class ClippingsController; def rescue_action(e) raise e end; end
 
 class ClippingsControllerTest &lt; Test::Unit::TestCase
-  fixtures :clippings, :users
+  fixtures :clippings, :users, :roles
 
   def setup
     @controller = ClippingsController.new</diff>
      <filename>test/functional/clippings_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'comments_controller'
 class CommentsController; def rescue_action(e) raise e end; end
 
 class CommentsControllerTest &lt; Test::Unit::TestCase
-  fixtures :users, :photos, :posts, :comments
+  fixtures :users, :photos, :posts, :comments, :roles
 
   def setup
     @controller = CommentsController.new</diff>
      <filename>test/functional/comments_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'contests_controller'
 class ContestsController; def rescue_action(e) raise e end; end
 
 class ContestsControllerTest &lt; Test::Unit::TestCase
-  fixtures :contests, :users
+  fixtures :contests, :users, :roles
 
   def setup
     @controller = ContestsController.new</diff>
      <filename>test/functional/contests_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'events_controller'
 class EventsController; def rescue_action(e) raise e end; end
 
 class EventsControllerTest &lt; Test::Unit::TestCase
-  fixtures :users, :events, :states
+  fixtures :users, :events, :states, :roles
 
   def setup
     @controller = EventsController.new</diff>
      <filename>test/functional/events_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'favorites_controller'
 class FavoritesController; def rescue_action(e) raise e end; end
 
 class FavoritesControllerTest &lt; Test::Unit::TestCase
-  fixtures :clippings, :users
+  fixtures :clippings, :users, :roles
 
   def setup
     @controller = FavoritesController.new</diff>
      <filename>test/functional/favorites_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@ class FriendshipsController; def rescue_action(e) raise e end; end
 
 class FriendshipsControllerTest &lt; Test::Unit::TestCase
   include UsersHelper
-  fixtures :friendships, :friendship_statuses, :users
+  fixtures :friendships, :friendship_statuses, :users, :roles
 
 
   def setup</diff>
      <filename>test/functional/friendships_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'homepage_features_controller'
 class HomepageFeaturesController; def rescue_action(e) raise e end; end
 
 class HomepageFeaturesControllerTest &lt; Test::Unit::TestCase
-  fixtures :homepage_features, :users
+  fixtures :homepage_features, :users, :roles
 
   def setup
     @controller = HomepageFeaturesController.new</diff>
      <filename>test/functional/homepage_features_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'invitations_controller'
 class InvitationsController; def rescue_action(e) raise e end; end
 
 class InvitationsControllerTest &lt; Test::Unit::TestCase
-  fixtures :invitations, :users
+  fixtures :invitations, :users, :roles
 
   def setup
     @controller = InvitationsController.new</diff>
      <filename>test/functional/invitations_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'metro_areas_controller'
 class MetroAreasController; def rescue_action(e) raise e end; end
 
 class MetroAreasControllerTest &lt; Test::Unit::TestCase
-  fixtures :metro_areas, :users, :countries
+  fixtures :metro_areas, :users, :countries, :roles
 
   def setup
     @controller = MetroAreasController.new</diff>
      <filename>test/functional/metro_areas_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'offerings_controller'
 class OfferingsController; def rescue_action(e) raise e end; end
 
 class OfferingsControllerTest &lt; Test::Unit::TestCase
-  fixtures :offerings, :skills, :users
+  fixtures :offerings, :skills, :users, :roles
 
   def setup
     @controller = OfferingsController.new</diff>
      <filename>test/functional/offerings_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'photos_controller'
 class PhotosController; def rescue_action(e) raise e end; end
 
 class PhotosControllerTest &lt; Test::Unit::TestCase
-  fixtures :photos, :users
+  fixtures :photos, :users, :roles
 
   def setup
     @controller = PhotosController.new</diff>
      <filename>test/functional/photos_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'posts_controller'
 class PostsController; def rescue_action(e) raise e end; end
 
 class PostsControllerTest &lt; Test::Unit::TestCase
-  fixtures :posts, :users, :categories, :contests
+  fixtures :posts, :users, :categories, :contests, :roles
 
   def setup
     @controller = PostsController.new</diff>
      <filename>test/functional/posts_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'sessions_controller'
 class SessionsController; def rescue_action(e) raise e end; end
 
 class SessionsControllerTest &lt; Test::Unit::TestCase
-  fixtures :users
+  fixtures :users, :roles
 
   def setup
     @controller = SessionsController.new</diff>
      <filename>test/functional/sessions_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'skills_controller'
 class SkillsController; def rescue_action(e) raise e end; end
 
 class SkillsControllerTest &lt; Test::Unit::TestCase
-  fixtures :skills, :users
+  fixtures :skills, :users, :roles
 
   def setup
     @controller = SkillsController.new</diff>
      <filename>test/functional/skills_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'statistics_controller'
 class StatisticsController; def rescue_action(e) raise e end; end
 
 class StatisticsControllerTest &lt; Test::Unit::TestCase
-  fixtures :users
+  fixtures :users, :roles
   
   def setup
     @controller = StatisticsController.new</diff>
      <filename>test/functional/statistics_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'tags_controller'
 class TagsController; def rescue_action(e) raise e end; end
 
 class TagsControllerTest &lt; Test::Unit::TestCase
-  fixtures :tags, :taggings, :photos
+  fixtures :tags, :taggings, :photos, :roles
 
   def setup
     @controller = TagsController.new</diff>
      <filename>test/functional/tags_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -9,7 +9,7 @@ class UsersControllerTest &lt; Test::Unit::TestCase
   # Then, you can remove it from this and the units test.
   include AuthenticatedTestHelper
 
-  fixtures :users, :tags, :states, :metro_areas, :countries, :skills, :friendship_statuses, :friendships, :categories
+  fixtures :users, :roles, :tags, :states, :metro_areas, :countries, :skills, :friendship_statuses, :friendships, :categories
 
   def setup
     @controller = UsersController.new
@@ -38,6 +38,23 @@ class UsersControllerTest &lt; Test::Unit::TestCase
     assert_response :success
   end  
 
+  def test_should_toggle_moderator
+    login_as :admin
+    assert !users(:quentin).moderator?
+    put :toggle_moderator, :id =&gt; users(:quentin)
+    assert users(:quentin).reload.moderator?
+    put :toggle_moderator, :id =&gt; users(:quentin)
+    assert !users(:quentin).reload.moderator?
+  end
+
+  def test_should_not_toggle_featured_writer_if_not_admin
+    login_as :quentin
+    put :toggle_moderator, :id =&gt; users(:quentin)
+    assert_redirected_to :login_url
+    assert !users(:quentin).reload.moderator?
+  end
+
+
   def test_should_toggle_featured_writer
     login_as :admin
     assert !users(:quentin).featured_writer?</diff>
      <filename>test/functional/users_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'votes_controller'
 class VotesController; def rescue_action(e) raise e end; end
 
 class VotesControllerTest &lt; Test::Unit::TestCase
-  fixtures :users, :posts
+  fixtures :users, :posts, :roles
 
   def setup
     @controller = VotesController.new</diff>
      <filename>test/functional/votes_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
 class AssetTest &lt; Test::Unit::TestCase
-  fixtures :clippings, :users
+  fixtures :clippings, :users, :roles
   
   def teardown
     Asset.destroy_all</diff>
      <filename>test/unit/asset_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
 class ClippingImageTest &lt; Test::Unit::TestCase
-  fixtures :clippings, :users  
+  fixtures :clippings, :users, :roles
   
   def teardown
     Asset.destroy_all</diff>
      <filename>test/unit/clipping_image_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
 class ClippingTest &lt; Test::Unit::TestCase
-  fixtures :clippings, :tags, :taggings, :users
+  fixtures :clippings, :tags, :taggings, :users, :roles
 
   def teardown
     Asset.destroy_all</diff>
      <filename>test/unit/clipping_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
 class CommentTest &lt; Test::Unit::TestCase
-  fixtures :comments, :users, :posts
+  fixtures :comments, :users, :posts, :roles
 
   def test_should_find_comments_by_user
     comments = Comment.find_comments_by_user(users(:quentin))</diff>
      <filename>test/unit/comment_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
 class FavoriteTest &lt; Test::Unit::TestCase
-  fixtures :clippings, :users
+  fixtures :clippings, :users, :roles
   
   def setup
     Favorite.destroy_all</diff>
      <filename>test/unit/favorite_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
 class FriendshipTest &lt; Test::Unit::TestCase
-  fixtures :friendships, :users
+  fixtures :friendships, :users, :roles
 
   def test_user_and_friend_can_not_be_same
     fr = Friendship.new(:user_id =&gt; 1, :friend_id =&gt; 1)</diff>
      <filename>test/unit/friendship_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
 class InvitationTest &lt; Test::Unit::TestCase
-  fixtures :invitations, :users
+  fixtures :invitations, :users, :roles
 
   def test_email_addresses_validation
     addresses = &quot;valid@example.com, valid_2@example.com, invalid.invalid.com&quot;</diff>
      <filename>test/unit/invitation_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/../test_helper'
 require 'hpricot'
     
 class PostTest &lt; Test::Unit::TestCase
-  fixtures :posts, :users, :comments
+  fixtures :posts, :users, :comments, :roles
 
   def setup
     Favorite.destroy_all</diff>
      <filename>test/unit/post_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,7 +7,7 @@ class UserNotifierTest &lt; Test::Unit::TestCase
 
   include ActionMailer::Quoting
 
-  fixtures :users, :friendships, :comments, :posts, :sb_posts, :topics, :forums
+  fixtures :users, :friendships, :comments, :posts, :sb_posts, :topics, :forums, :roles
 
   def setup
     ActionMailer::Base.delivery_method = :test</diff>
      <filename>test/unit/user_notifier_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,7 @@ class UserTest &lt; Test::Unit::TestCase
   # Be sure to include AuthenticatedTestHelper in test/test_helper.rb instead.
   # Then, you can remove it from this and the functional test.
   include AuthenticatedTestHelper
-  fixtures :users, :states, :metro_areas, :friendships
+  fixtures :users, :states, :metro_areas, :friendships, :roles, :friendship_statuses
 
   def test_should_create_user
     assert_difference User, :count do</diff>
      <filename>test/unit/user_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>145b62e6ff6b63f0d7bcbdd677504daf3617bbde</id>
    </parent>
  </parents>
  <author>
    <name>Bruno Bornsztein</name>
    <email>bruno@otis.local</email>
  </author>
  <url>http://github.com/bborn/communityengine/commit/0f6d1e6a0cb5f85f512feadae7320d18d0d72675</url>
  <id>0f6d1e6a0cb5f85f512feadae7320d18d0d72675</id>
  <committed-date>2008-06-10T12:22:18-07:00</committed-date>
  <authored-date>2008-06-10T12:22:18-07:00</authored-date>
  <message>adding roles - NOTE: new migration!

Added Role model and association on User, with default roles of admin, moderator, and member. Please make sure to run the new migration and tests, or your application will break.</message>
  <tree>6c11ac4c417c85251f649a9def914300bfdb1b3f</tree>
  <committer>
    <name>Bruno Bornsztein</name>
    <email>bruno@otis.local</email>
  </committer>
</commit>
