Commit 86904b59161f4fca1d02945127a4e656a7b6b668
Exists in
colab
and in
4 other branches
Merge pull request #183 from mezuro/hide_repositories
Hide repositories
Showing
27 changed files
with
199 additions
and
134 deletions
Show diff stats
app/controllers/concerns/ownership_authentication.rb
| ... | ... | @@ -52,7 +52,7 @@ module OwnershipAuthentication |
| 52 | 52 | private |
| 53 | 53 | |
| 54 | 54 | def check_project_ownership(id) |
| 55 | - if current_user.project_ownerships.find_by_project_id(id).nil? | |
| 55 | + if current_user.project_attributes.find_by_project_id(id).nil? | |
| 56 | 56 | respond_to do |format| |
| 57 | 57 | format.html { redirect_to projects_url, notice: "You're not allowed to do this operation" } |
| 58 | 58 | format.json { head :no_content } | ... | ... |
app/controllers/projects_controller.rb
| ... | ... | @@ -9,13 +9,12 @@ class ProjectsController < ApplicationController |
| 9 | 9 | # GET /projects/new |
| 10 | 10 | def new |
| 11 | 11 | @project = Project.new |
| 12 | - @project_image = ProjectImage.new | |
| 13 | 12 | end |
| 14 | 13 | |
| 15 | 14 | # GET /projects |
| 16 | 15 | # GET /projects.json |
| 17 | 16 | def index |
| 18 | - @projects = Project.all | |
| 17 | + @projects = Project.all.select { |project| !project.attributes.hidden } | |
| 19 | 18 | end |
| 20 | 19 | |
| 21 | 20 | # POST /projects |
| ... | ... | @@ -25,7 +24,7 @@ class ProjectsController < ApplicationController |
| 25 | 24 | @project = Project.new(project_params) |
| 26 | 25 | respond_to do |format| |
| 27 | 26 | create_and_redir(format) |
| 28 | - ProjectImage.create(url: image_url, project_id: @project.id ) | |
| 27 | + @project.attributes.update(image_url: image_url) unless @project.attributes.nil? | |
| 29 | 28 | end |
| 30 | 29 | end |
| 31 | 30 | |
| ... | ... | @@ -45,7 +44,7 @@ class ProjectsController < ApplicationController |
| 45 | 44 | def update |
| 46 | 45 | set_project |
| 47 | 46 | image_url = project_params.delete(:image_url) |
| 48 | - if @project.update(project_params) && @project_image.update(url: image_url) | |
| 47 | + if @project.update(project_params) && @project.attributes.update(image_url: image_url) | |
| 49 | 48 | redirect_to(project_path(@project.id)) |
| 50 | 49 | else |
| 51 | 50 | render "edit" |
| ... | ... | @@ -56,7 +55,7 @@ class ProjectsController < ApplicationController |
| 56 | 55 | # DELETE /project/1.json |
| 57 | 56 | def destroy |
| 58 | 57 | set_project |
| 59 | - current_user.project_ownerships.find_by_project_id(@project.id).destroy | |
| 58 | + current_user.project_attributes.find_by_project_id(@project.id).destroy | |
| 60 | 59 | @project.destroy |
| 61 | 60 | respond_to do |format| |
| 62 | 61 | format.html { redirect_to projects_url } |
| ... | ... | @@ -68,7 +67,6 @@ class ProjectsController < ApplicationController |
| 68 | 67 | # Use callbacks to share common setup or constraints between actions. |
| 69 | 68 | def set_project |
| 70 | 69 | @project = find_resource(Project, params[:id].to_i) |
| 71 | - @project_image = ProjectImage.find_by_project_id(@project.id) if @project.is_a?(Project) | |
| 72 | 70 | end |
| 73 | 71 | |
| 74 | 72 | # Never trust parameters from the scary internet, only allow the white list through. |
| ... | ... | @@ -80,7 +78,7 @@ class ProjectsController < ApplicationController |
| 80 | 78 | # Extracted code from create action |
| 81 | 79 | def create_and_redir(format) |
| 82 | 80 | if @project.save |
| 83 | - current_user.project_ownerships.create project_id: @project.id | |
| 81 | + current_user.project_attributes.create(project_id: @project.id) | |
| 84 | 82 | format.html { redirect_to project_path(@project.id), notice: 'Project was successfully created.' } |
| 85 | 83 | format.json { render action: 'show', status: :created, location: @project } |
| 86 | 84 | else | ... | ... |
app/helpers/projects_helper.rb
app/models/project.rb
| 1 | 1 | class Project < KalibroClient::Entities::Processor::Project |
| 2 | 2 | include KalibroRecord |
| 3 | + | |
| 3 | 4 | def self.latest(count = 1) |
| 4 | - all.sort { |a,b| b.id <=> a.id }.first(count) | |
| 5 | + all.sort { |a,b| b.id <=> a.id }.select { |project| !project.attributes.hidden}.first(count) | |
| 6 | + end | |
| 7 | + | |
| 8 | + def attributes | |
| 9 | + project_attributes = ProjectAttributes.find_by_project_id(self.id) | |
| 10 | + project_attributes.nil? ? ProjectAttributes.new : project_attributes | |
| 5 | 11 | end |
| 6 | 12 | end | ... | ... |
app/models/project_image.rb
app/models/project_ownership.rb
app/models/user.rb
| ... | ... | @@ -8,12 +8,12 @@ class User < ActiveRecord::Base |
| 8 | 8 | validates :email, presence: true |
| 9 | 9 | validates :email, uniqueness: true |
| 10 | 10 | |
| 11 | - has_many :project_ownerships | |
| 11 | + has_many :project_attributes, class_name: 'ProjectAttributes' | |
| 12 | 12 | has_many :reading_group_ownerships |
| 13 | 13 | has_many :kalibro_configuration_ownerships |
| 14 | 14 | # Alert: when adding new parameters to this model, they should also be added to registrations_controller |
| 15 | 15 | |
| 16 | 16 | def projects |
| 17 | - project_ownerships.map { |project_ownership| project_ownership.project } | |
| 17 | + project_attributes.map { |project_attr| project_attr.project } | |
| 18 | 18 | end |
| 19 | 19 | end | ... | ... |
app/views/projects/_form.html.erb
| ... | ... | @@ -17,7 +17,7 @@ |
| 17 | 17 | <div class="form-row"> |
| 18 | 18 | <div class="field-container"> |
| 19 | 19 | <%= f.label "Image url", class: 'control-label' %><br> |
| 20 | - <%= f.text_field :image_url, class: 'text-area', value: @project_image.nil? ? '#' : @project_image.url %> | |
| 20 | + <%= f.text_field :image_url, class: 'text-area', value: @project.attributes.nil? || @project.attributes.image_url.nil? ? '#' : @project.attributes.image_url %> | |
| 21 | 21 | </div> |
| 22 | 22 | </div> |
| 23 | 23 | </div> | ... | ... |
| ... | ... | @@ -0,0 +1,56 @@ |
| 1 | +class CreateProjectAttributes < ActiveRecord::Migration | |
| 2 | + def up | |
| 3 | + create_table :project_attributes do |t| | |
| 4 | + t.integer :project_id | |
| 5 | + t.string :image_url | |
| 6 | + t.integer :user_id | |
| 7 | + t.boolean :hidden, default: false | |
| 8 | + | |
| 9 | + t.timestamps null: false | |
| 10 | + end | |
| 11 | + | |
| 12 | + ProjectOwnership.all.each do |project_ownership| | |
| 13 | + project_image = ProjectImage.find_by_project_id(project_ownership.project_id) | |
| 14 | + image_url = project_image.nil? ? "": project_image.url | |
| 15 | + | |
| 16 | + begin | |
| 17 | + # We want to hides projects prior this date since they probably have a invalid configuration | |
| 18 | + if Project.find(project_ownership.project_id).updated_at < DateTime.parse("Mon, 23 Feb 2015") | |
| 19 | + hidden = true | |
| 20 | + else | |
| 21 | + hidden = false | |
| 22 | + end | |
| 23 | + | |
| 24 | + ProjectAttributes.create(user_id: project_ownership.user_id, project_id: project_ownership.project_id, image_url: image_url, hidden: hidden) | |
| 25 | + rescue KalibroClient::Errors::RecordNotFound | |
| 26 | + puts "Could not find project with id #{project_ownership.project_id} owned by user with #{project_ownership.user_id} and image url #{image_url}" | |
| 27 | + end | |
| 28 | + end | |
| 29 | + | |
| 30 | + drop_table :project_ownerships | |
| 31 | + drop_table :project_images | |
| 32 | + end | |
| 33 | + | |
| 34 | + def down | |
| 35 | + create_table :project_ownerships do |t| | |
| 36 | + t.integer :user_id | |
| 37 | + t.integer :project_id | |
| 38 | + | |
| 39 | + t.timestamps | |
| 40 | + end | |
| 41 | + | |
| 42 | + create_table :project_images do |t| | |
| 43 | + t.belongs_to :project | |
| 44 | + t.string :url | |
| 45 | + | |
| 46 | + t.timestamps | |
| 47 | + end | |
| 48 | + | |
| 49 | + ProjectAttributes.all.each do |project_attribute| | |
| 50 | + ProjectOwnership.create(user_id: project_attribute.user_id, project_id: project_attribute.project_id) | |
| 51 | + ProjectImage.create(url: project_attribute.image_url, project_id: project_attribute.project_id) | |
| 52 | + end | |
| 53 | + | |
| 54 | + drop_table :project_attributes | |
| 55 | + end | |
| 56 | +end | ... | ... |
db/schema.rb
| ... | ... | @@ -11,7 +11,7 @@ |
| 11 | 11 | # |
| 12 | 12 | # It's strongly recommended that you check this file into your version control system. |
| 13 | 13 | |
| 14 | -ActiveRecord::Schema.define(version: 20141211114023) do | |
| 14 | +ActiveRecord::Schema.define(version: 20150225170704) do | |
| 15 | 15 | |
| 16 | 16 | create_table "kalibro_configuration_ownerships", force: :cascade do |t| |
| 17 | 17 | t.integer "user_id" |
| ... | ... | @@ -20,18 +20,13 @@ ActiveRecord::Schema.define(version: 20141211114023) do |
| 20 | 20 | t.datetime "updated_at" |
| 21 | 21 | end |
| 22 | 22 | |
| 23 | - create_table "project_images", force: :cascade do |t| | |
| 23 | + create_table "project_attributes", force: :cascade do |t| | |
| 24 | 24 | t.integer "project_id" |
| 25 | - t.string "url", limit: 255 | |
| 26 | - t.datetime "created_at" | |
| 27 | - t.datetime "updated_at" | |
| 28 | - end | |
| 29 | - | |
| 30 | - create_table "project_ownerships", force: :cascade do |t| | |
| 25 | + t.string "image_url" | |
| 31 | 26 | t.integer "user_id" |
| 32 | - t.integer "project_id" | |
| 33 | - t.datetime "created_at" | |
| 34 | - t.datetime "updated_at" | |
| 27 | + t.boolean "hidden", default: false | |
| 28 | + t.datetime "created_at", null: false | |
| 29 | + t.datetime "updated_at", null: false | |
| 35 | 30 | end |
| 36 | 31 | |
| 37 | 32 | create_table "reading_group_ownerships", force: :cascade do |t| | ... | ... |
features/project/deletion.feature
| ... | ... | @@ -22,7 +22,7 @@ Feature: Project Deletion |
| 22 | 22 | Given I am a regular user |
| 23 | 23 | And I am signed in |
| 24 | 24 | And I own a sample project |
| 25 | - And I have a sample project_image | |
| 25 | + And I have sample project_attributes | |
| 26 | 26 | And I am at the Sample Project page |
| 27 | 27 | When I click the Destroy Project link |
| 28 | 28 | Then I should be in the All Projects page | ... | ... |
features/project/edition.feature
| ... | ... | @@ -8,7 +8,7 @@ Feature: Project |
| 8 | 8 | Given I am a regular user |
| 9 | 9 | And I am signed in |
| 10 | 10 | And I own a sample project |
| 11 | - And I have a sample project_image | |
| 11 | + And I have sample project_attributes | |
| 12 | 12 | And I am at the All Projects page |
| 13 | 13 | When I click the Edit link |
| 14 | 14 | Then I should be in the Edit Project page |
| ... | ... | @@ -35,7 +35,7 @@ Feature: Project |
| 35 | 35 | Given I am a regular user |
| 36 | 36 | And I am signed in |
| 37 | 37 | And I own a sample project |
| 38 | - And I have a sample project_image | |
| 38 | + And I have sample project_attributes | |
| 39 | 39 | And I am at the All Projects page |
| 40 | 40 | When I click the Edit link |
| 41 | 41 | Then The field "project[name]" should be filled with the sample project "name" |
| ... | ... | @@ -46,7 +46,7 @@ Feature: Project |
| 46 | 46 | Given I am a regular user |
| 47 | 47 | And I am signed in |
| 48 | 48 | And I own a sample project |
| 49 | - And I have a sample project_image | |
| 49 | + And I have sample project_attributes | |
| 50 | 50 | And I am at the sample project edit page |
| 51 | 51 | And I fill the Name field with "Kalibro" |
| 52 | 52 | And I fill the Description field with "Web Service to collect metrics" |
| ... | ... | @@ -61,7 +61,7 @@ Feature: Project |
| 61 | 61 | And I have a project named "Qt-Calculator" |
| 62 | 62 | And I own a project named "Kalibro" |
| 63 | 63 | And I am at the sample project edit page |
| 64 | - And I have a sample project_image | |
| 64 | + And I have sample project_attributes | |
| 65 | 65 | And I fill the Name field with "Qt-Calculator" |
| 66 | 66 | When I press the Save button |
| 67 | 67 | Then I should see "Name has already been taken" |
| ... | ... | @@ -71,7 +71,7 @@ Feature: Project |
| 71 | 71 | Given I am a regular user |
| 72 | 72 | And I am signed in |
| 73 | 73 | And I own a sample project |
| 74 | - And I have a sample project_image | |
| 74 | + And I have sample project_attributes | |
| 75 | 75 | And I am at the sample project edit page |
| 76 | 76 | And I fill the Description field with "Web Service to collect metrics" |
| 77 | 77 | When I press the Save button |
| ... | ... | @@ -82,7 +82,7 @@ Feature: Project |
| 82 | 82 | Given I am a regular user |
| 83 | 83 | And I am signed in |
| 84 | 84 | And I own a sample project |
| 85 | - And I have a sample project_image | |
| 85 | + And I have sample project_attributes | |
| 86 | 86 | And I am at the sample project edit page |
| 87 | 87 | And I fill the Name field with " " |
| 88 | 88 | When I press the Save button | ... | ... |
features/project/listing.feature
| ... | ... | @@ -25,7 +25,7 @@ Feature: Project listing |
| 25 | 25 | Given I am a regular user |
| 26 | 26 | And I am signed in |
| 27 | 27 | And I have a sample project |
| 28 | - And I have a sample project_image | |
| 28 | + And I have sample project_attributes | |
| 29 | 29 | And I am at the All Projects page |
| 30 | 30 | When I click the Show link |
| 31 | 31 | Then the sample project should be there |
| 32 | 32 | \ No newline at end of file | ... | ... |
features/project/show.feature
| ... | ... | @@ -7,7 +7,7 @@ Feature: Show Project |
| 7 | 7 | Scenario: Should not show the create repository link to user that doesn't own the project |
| 8 | 8 | Given I am a regular user |
| 9 | 9 | And I have a sample project |
| 10 | - And I have a sample project_image | |
| 10 | + And I have sample project_attributes | |
| 11 | 11 | And I have a sample configuration with native metrics |
| 12 | 12 | And I have a sample repository within the sample project |
| 13 | 13 | When I am at the Sample Project page |
| ... | ... | @@ -20,7 +20,7 @@ Scenario: Should show the create repository link the project owner |
| 20 | 20 | Given I am a regular user |
| 21 | 21 | And I am signed in |
| 22 | 22 | And I own a sample project |
| 23 | - And I have a sample project_image | |
| 23 | + And I have sample project_attributes | |
| 24 | 24 | When I am at the Sample Project page |
| 25 | 25 | Then I should see "New Repository" |
| 26 | 26 | |
| ... | ... | @@ -28,7 +28,7 @@ Scenario: Should show the create repository link the project owner |
| 28 | 28 | @kalibro_processor_restart |
| 29 | 29 | Scenario: Considering the project has no repositories |
| 30 | 30 | Given I have a sample project |
| 31 | - And I have a sample project_image | |
| 31 | + And I have sample project_attributes | |
| 32 | 32 | When I am at the Sample Project page |
| 33 | 33 | Then I should see "There are no Repositories yet!" |
| 34 | 34 | |
| ... | ... | @@ -43,6 +43,6 @@ Scenario: Considering the project has repositories |
| 43 | 43 | @kalibro_processor_restart |
| 44 | 44 | Scenario: Checking project contents |
| 45 | 45 | Given I have a sample project |
| 46 | - And I have a sample project_image | |
| 46 | + And I have sample project_attributes | |
| 47 | 47 | When I am at the Sample Project page |
| 48 | 48 | Then the sample project should be there | ... | ... |
features/step_definitions/project_steps.rb
| ... | ... | @@ -8,8 +8,8 @@ Given(/^I have a sample project$/) do |
| 8 | 8 | @project = FactoryGirl.create(:project) |
| 9 | 9 | end |
| 10 | 10 | |
| 11 | -Given(/^I have a sample project_image$/) do | |
| 12 | - @project_image = FactoryGirl.create(:project_image, {id: nil}) | |
| 11 | +Given(/^I have sample project_attributes$/) do | |
| 12 | + @project_attributes = FactoryGirl.create(:project_attributes, {id: nil}) | |
| 13 | 13 | end |
| 14 | 14 | |
| 15 | 15 | Given(/^I have a project named "(.*?)"$/) do |name| |
| ... | ... | @@ -18,12 +18,12 @@ end |
| 18 | 18 | |
| 19 | 19 | Given(/^I own a sample project$/) do |
| 20 | 20 | @project = FactoryGirl.create(:project) |
| 21 | - FactoryGirl.create(:project_ownership, {user_id: @user.id, project_id: @project.id}) | |
| 21 | + FactoryGirl.create(:project_attributes, {user_id: @user.id, project_id: @project.id}) | |
| 22 | 22 | end |
| 23 | 23 | |
| 24 | 24 | Given(/^I own a project named "(.*?)"$/) do |name| |
| 25 | 25 | @project = FactoryGirl.create(:project, {name: name}) |
| 26 | - FactoryGirl.create(:project_ownership, {user_id: @user.id, project_id: @project.id}) | |
| 26 | + FactoryGirl.create(:project_attributes, {user_id: @user.id, project_id: @project.id}) | |
| 27 | 27 | end |
| 28 | 28 | |
| 29 | 29 | Given(/^I am at the Sample Project page$/) do | ... | ... |
spec/controllers/concerns/ownership_authentication_spec.rb
| ... | ... | @@ -111,12 +111,12 @@ describe OwnershipAuthentication, type: :controller do |
| 111 | 111 | end |
| 112 | 112 | |
| 113 | 113 | context 'when the user owns the Repository' do |
| 114 | - let!(:project_ownership) { FactoryGirl.build(:project_ownership, {user_id: current_user.id, project_id: project.id}) } | |
| 114 | + let!(:project_attributes) { FactoryGirl.build(:project_attributes, {user_id: current_user.id, project_id: project.id}) } | |
| 115 | 115 | |
| 116 | 116 | before do |
| 117 | - project_ownerships = Object.new | |
| 118 | - project_ownerships.expects(:find_by_project_id).with(project.id).returns(project_ownership) | |
| 119 | - current_user.expects(:project_ownerships).returns(project_ownerships) | |
| 117 | + project_attrs = Object.new | |
| 118 | + project_attrs.expects(:find_by_project_id).with(project.id).returns(project_attributes) | |
| 119 | + current_user.expects(:project_attributes).returns(project_attrs) | |
| 120 | 120 | end |
| 121 | 121 | |
| 122 | 122 | it 'should return true' do |
| ... | ... | @@ -126,9 +126,9 @@ describe OwnershipAuthentication, type: :controller do |
| 126 | 126 | |
| 127 | 127 | context 'when the user does not own the Repository' do |
| 128 | 128 | before do |
| 129 | - project_ownerships = Object.new | |
| 130 | - project_ownerships.expects(:find_by_project_id).with(project.id).returns(nil) | |
| 131 | - current_user.expects(:project_ownerships).returns(project_ownerships) | |
| 129 | + project_attrs = Object.new | |
| 130 | + project_attrs.expects(:find_by_project_id).with(project.id).returns(nil) | |
| 131 | + current_user.expects(:project_attributes).returns(project_attrs) | |
| 132 | 132 | end |
| 133 | 133 | |
| 134 | 134 | it 'should respond' do # FIXME: this is not the best test, but it it's the closest we can do I think | ... | ... |
spec/controllers/projects_controller_spec.rb
| ... | ... | @@ -91,21 +91,20 @@ describe ProjectsController, :type => :controller do |
| 91 | 91 | context 'with a User logged in' do |
| 92 | 92 | before do |
| 93 | 93 | sign_in FactoryGirl.create(:user) |
| 94 | - @ownership = FactoryGirl.build(:project_ownership) | |
| 95 | - @ownerships = [] | |
| 96 | - | |
| 94 | + @project_attributes = FactoryGirl.build(:project_attributes) | |
| 95 | + @attributes = [] | |
| 97 | 96 | end |
| 98 | 97 | |
| 99 | 98 | context 'when the user owns the project' do |
| 100 | 99 | before :each do |
| 101 | - @ownership.expects(:destroy) | |
| 100 | + @project_attributes.expects(:destroy) | |
| 102 | 101 | @subject.expects(:destroy) |
| 103 | 102 | |
| 104 | 103 | #Those two mocks looks the same but they are necessary since params[:id] is a String and @project.id is an Integer :( |
| 105 | - @ownerships.expects(:find_by_project_id).with("#{@subject.id}").returns(@ownership) | |
| 106 | - @ownerships.expects(:find_by_project_id).with(@subject.id).returns(@ownership) | |
| 104 | + @attributes.expects(:find_by_project_id).with("#{@subject.id}").returns(@project_attributes) | |
| 105 | + @attributes.expects(:find_by_project_id).with(@subject.id).returns(@project_attributes) | |
| 107 | 106 | |
| 108 | - User.any_instance.expects(:project_ownerships).at_least_once.returns(@ownerships) | |
| 107 | + User.any_instance.expects(:project_attributes).at_least_once.returns(@attributes) | |
| 109 | 108 | |
| 110 | 109 | subject.expects(:find_resource).with(Project, @subject.id).returns(@subject) |
| 111 | 110 | delete :destroy, :id => @subject.id |
| ... | ... | @@ -120,8 +119,8 @@ describe ProjectsController, :type => :controller do |
| 120 | 119 | |
| 121 | 120 | context "when the user doesn't own the project" do |
| 122 | 121 | before :each do |
| 123 | - @ownerships.expects(:find_by_project_id).with("#{@subject.id}").returns(nil) | |
| 124 | - User.any_instance.expects(:project_ownerships).at_least_once.returns(@ownerships) | |
| 122 | + @attributes.expects(:find_by_project_id).with("#{@subject.id}").returns(nil) | |
| 123 | + User.any_instance.expects(:project_attributes).at_least_once.returns(@attributes) | |
| 125 | 124 | |
| 126 | 125 | delete :destroy, :id => @subject.id |
| 127 | 126 | end |
| ... | ... | @@ -140,9 +139,12 @@ describe ProjectsController, :type => :controller do |
| 140 | 139 | end |
| 141 | 140 | |
| 142 | 141 | describe 'index' do |
| 142 | + let(:project_attributes) { FactoryGirl.build(:project_attributes) } | |
| 143 | + | |
| 143 | 144 | before :each do |
| 144 | 145 | @subject = FactoryGirl.build(:project_with_id) |
| 145 | 146 | Project.expects(:all).returns([@subject]) |
| 147 | + @subject.expects(:attributes).returns(project_attributes) | |
| 146 | 148 | get :index |
| 147 | 149 | end |
| 148 | 150 | |
| ... | ... | @@ -152,15 +154,14 @@ describe ProjectsController, :type => :controller do |
| 152 | 154 | describe 'edit' do |
| 153 | 155 | before do |
| 154 | 156 | @subject = FactoryGirl.build(:project_with_id) |
| 155 | - @project_image = FactoryGirl.create(:project_image) | |
| 156 | 157 | end |
| 157 | 158 | |
| 158 | 159 | context 'with an User logged in' do |
| 159 | 160 | before do |
| 160 | 161 | @user = FactoryGirl.create(:user) |
| 161 | - @ownership = FactoryGirl.build(:project_ownership) | |
| 162 | - @ownerships = [] | |
| 163 | - User.any_instance.expects(:project_ownerships).at_least_once.returns(@ownerships) | |
| 162 | + @attribute = FactoryGirl.build(:project_attributes) | |
| 163 | + @attributes = [] | |
| 164 | + User.any_instance.expects(:project_attributes).at_least_once.returns(@attributes) | |
| 164 | 165 | |
| 165 | 166 | sign_in @user |
| 166 | 167 | end |
| ... | ... | @@ -168,8 +169,7 @@ describe ProjectsController, :type => :controller do |
| 168 | 169 | context 'when the user owns the project' do |
| 169 | 170 | before :each do |
| 170 | 171 | subject.expects(:find_resource).with(Project, @subject.id).returns(@subject) |
| 171 | - @ownerships.expects(:find_by_project_id).with("#{@subject.id}").returns(@ownership) | |
| 172 | - ProjectImage.expects(:find_by_project_id).with(@subject.id).returns(@project_image) | |
| 172 | + @attributes.expects(:find_by_project_id).with("#{@subject.id}").returns(@attribute) | |
| 173 | 173 | |
| 174 | 174 | get :edit, :id => @subject.id |
| 175 | 175 | end |
| ... | ... | @@ -184,7 +184,7 @@ describe ProjectsController, :type => :controller do |
| 184 | 184 | context 'when the user does not own the project' do |
| 185 | 185 | before do |
| 186 | 186 | @subject = FactoryGirl.build(:another_project) |
| 187 | - @ownerships.expects(:find_by_project_id).with("#{@subject.id}").returns(nil) | |
| 187 | + @attributes.expects(:find_by_project_id).with("#{@subject.id}").returns(nil) | |
| 188 | 188 | |
| 189 | 189 | get :edit, :id => @subject.id |
| 190 | 190 | end |
| ... | ... | @@ -205,7 +205,6 @@ describe ProjectsController, :type => :controller do |
| 205 | 205 | |
| 206 | 206 | describe 'update' do |
| 207 | 207 | before do |
| 208 | - @project_image = FactoryGirl.build(:project_image) | |
| 209 | 208 | @subject = FactoryGirl.build(:project_with_id) |
| 210 | 209 | @subject_params = @subject.to_hash |
| 211 | 210 | end |
| ... | ... | @@ -217,17 +216,18 @@ describe ProjectsController, :type => :controller do |
| 217 | 216 | |
| 218 | 217 | context 'when user owns the project' do |
| 219 | 218 | before do |
| 220 | - @ownership = FactoryGirl.build(:project_ownership) | |
| 221 | - @ownerships = [] | |
| 222 | - @ownerships.expects(:find_by_project_id).with("#{@subject.id}").returns(@ownership) | |
| 223 | - User.any_instance.expects(:project_ownerships).at_least_once.returns(@ownerships) | |
| 224 | - ProjectImage.expects(:find_by_project_id).with(@subject.id).returns(@project_image) | |
| 219 | + @project_attributes = FactoryGirl.build(:project_attributes) | |
| 220 | + @attributes = [] | |
| 221 | + @attributes.expects(:find_by_project_id).with("#{@subject.id}").returns(@project_attributes) | |
| 222 | + User.any_instance.expects(:project_attributes).at_least_once.returns(@attributes) | |
| 225 | 223 | end |
| 226 | 224 | |
| 227 | 225 | context 'with valid fields' do |
| 228 | 226 | before :each do |
| 229 | 227 | subject.expects(:find_resource).with(Project, @subject.id).returns(@subject) |
| 230 | 228 | Project.any_instance.expects(:update).with(@subject_params).returns(true) |
| 229 | + @project_attributes.expects(:update).with(image_url: @subject_params[:image_url]).returns(true) | |
| 230 | + @subject.expects(:attributes).returns(@project_attributes) | |
| 231 | 231 | end |
| 232 | 232 | |
| 233 | 233 | context 'rendering the show' do | ... | ... |
spec/factories/project_images.rb
spec/factories/project_ownerships.rb
spec/helpers/projects_helper_spec.rb
| ... | ... | @@ -19,10 +19,10 @@ describe ProjectsHelper, :type => :helper do |
| 19 | 19 | helper.expects(:user_signed_in?).returns(true) |
| 20 | 20 | helper.expects(:current_user).returns(FactoryGirl.build(:user)) |
| 21 | 21 | |
| 22 | - @ownerships = [] | |
| 23 | - @ownerships.expects(:find_by_project_id).with(@subject.id).returns(nil) | |
| 22 | + @attributes = [] | |
| 23 | + @attributes.expects(:find_by_project_id).with(@subject.id).returns(nil) | |
| 24 | 24 | |
| 25 | - User.any_instance.expects(:project_ownerships).returns(@ownerships) | |
| 25 | + User.any_instance.expects(:project_attributes).returns(@attributes) | |
| 26 | 26 | end |
| 27 | 27 | |
| 28 | 28 | it { expect(helper.project_owner?(@subject.id)).to be_falsey } |
| ... | ... | @@ -33,10 +33,10 @@ describe ProjectsHelper, :type => :helper do |
| 33 | 33 | helper.expects(:user_signed_in?).returns(true) |
| 34 | 34 | helper.expects(:current_user).returns(FactoryGirl.build(:user)) |
| 35 | 35 | |
| 36 | - @ownership = FactoryGirl.build(:project_ownership) | |
| 37 | - @ownerships = [] | |
| 38 | - @ownerships.expects(:find_by_project_id).with(@subject.id).returns(@ownership) | |
| 39 | - User.any_instance.expects(:project_ownerships).returns(@ownerships) | |
| 36 | + @project_attributes = FactoryGirl.build(:project_attributes) | |
| 37 | + @attributes = [] | |
| 38 | + @attributes.expects(:find_by_project_id).with(@subject.id).returns(@project_attributes) | |
| 39 | + User.any_instance.expects(:project_attributes).returns(@attributes) | |
| 40 | 40 | end |
| 41 | 41 | |
| 42 | 42 | it { expect(helper.project_owner?(@subject.id)).to be_truthy } | ... | ... |
| ... | ... | @@ -0,0 +1,23 @@ |
| 1 | +require 'rails_helper' | |
| 2 | + | |
| 3 | +RSpec.describe ProjectAttributes, type: :model do | |
| 4 | + describe 'associations' do | |
| 5 | + it { is_expected.to belong_to(:user) } | |
| 6 | + it { is_expected.to belong_to(:project) } | |
| 7 | + end | |
| 8 | + | |
| 9 | + describe 'methods' do | |
| 10 | + describe 'project' do | |
| 11 | + subject { FactoryGirl.build(:project_attributes) } | |
| 12 | + let(:project) {FactoryGirl.build(:project_with_id)} | |
| 13 | + | |
| 14 | + before :each do | |
| 15 | + Project.expects(:find).with(subject.project_id).returns(project) | |
| 16 | + end | |
| 17 | + | |
| 18 | + it 'should return the project' do | |
| 19 | + expect(subject.project).to eq(project) | |
| 20 | + end | |
| 21 | + end | |
| 22 | + end | |
| 23 | +end | ... | ... |
spec/models/project_image_spec.rb
spec/models/project_ownership_spec.rb
| ... | ... | @@ -1,22 +0,0 @@ |
| 1 | -require 'rails_helper' | |
| 2 | - | |
| 3 | -describe ProjectOwnership, :type => :model do | |
| 4 | - describe 'associations' do | |
| 5 | - it { is_expected.to belong_to(:user) } | |
| 6 | - end | |
| 7 | - | |
| 8 | - describe 'methods' do | |
| 9 | - describe 'project' do | |
| 10 | - subject {FactoryGirl.build(:project_ownership)} | |
| 11 | - let(:project) {FactoryGirl.build(:project_with_id)} | |
| 12 | - | |
| 13 | - before :each do | |
| 14 | - Project.expects(:find).with(subject.project_id).returns(project) | |
| 15 | - end | |
| 16 | - | |
| 17 | - it 'should return the project' do | |
| 18 | - expect(subject.project).to eq(project) | |
| 19 | - end | |
| 20 | - end | |
| 21 | - end | |
| 22 | -end |
spec/models/project_spec.rb
| ... | ... | @@ -3,22 +3,40 @@ require 'rails_helper' |
| 3 | 3 | describe Project, :type => :model do |
| 4 | 4 | describe 'methods' do |
| 5 | 5 | describe 'latest' do |
| 6 | + let!(:project) { FactoryGirl.build(:project_with_id, id: 1) } | |
| 7 | + let!(:another_project) { FactoryGirl.build(:another_project, id: 2) } | |
| 8 | + let!(:project_attributes) { FactoryGirl.build(:project_attributes) } | |
| 9 | + | |
| 6 | 10 | before :each do |
| 7 | - @qt = FactoryGirl.build(:project_with_id) | |
| 8 | - @kalibro = FactoryGirl.build(:another_project) | |
| 11 | + project.expects(:attributes).returns(project_attributes) | |
| 12 | + another_project.expects(:attributes).returns(project_attributes) | |
| 9 | 13 | |
| 10 | - Project.expects(:all).returns([@qt, @kalibro]) | |
| 14 | + Project.expects(:all).returns([project, another_project]) | |
| 11 | 15 | end |
| 12 | 16 | |
| 13 | 17 | it 'should return the two projects ordered' do |
| 14 | - expect(Project.latest(2)).to eq([@kalibro, @qt]) | |
| 18 | + expect(Project.latest(2)).to eq([another_project, project]) | |
| 15 | 19 | end |
| 16 | 20 | |
| 17 | 21 | context 'when no parameter is passed' do |
| 18 | 22 | it 'should return just the most recent project' do |
| 19 | - expect(Project.latest).to eq([@kalibro]) | |
| 23 | + expect(Project.latest).to eq([another_project]) | |
| 20 | 24 | end |
| 21 | 25 | end |
| 22 | 26 | end |
| 27 | + | |
| 28 | + describe 'attributes' do | |
| 29 | + subject { FactoryGirl.build(:project_with_id) } | |
| 30 | + | |
| 31 | + let!(:project_attributes) { FactoryGirl.build(:project_attributes) } | |
| 32 | + | |
| 33 | + before :each do | |
| 34 | + ProjectAttributes.expects(:find_by_project_id).returns(project_attributes) | |
| 35 | + end | |
| 36 | + | |
| 37 | + it 'is expected to return the project attributes' do | |
| 38 | + expect(subject.attributes).to eq(project_attributes) | |
| 39 | + end | |
| 40 | + end | |
| 23 | 41 | end |
| 24 | 42 | end | ... | ... |
spec/models/user_spec.rb
| ... | ... | @@ -10,7 +10,7 @@ describe User, :type => :model do |
| 10 | 10 | end |
| 11 | 11 | |
| 12 | 12 | describe 'associations' do |
| 13 | - it { is_expected.to have_many(:project_ownerships) } | |
| 13 | + it { is_expected.to have_many(:project_attributes) } | |
| 14 | 14 | it { is_expected.to have_many(:reading_group_ownerships) } |
| 15 | 15 | it { is_expected.to have_many(:kalibro_configuration_ownerships) } |
| 16 | 16 | end |
| ... | ... | @@ -19,11 +19,11 @@ describe User, :type => :model do |
| 19 | 19 | describe 'projects' do |
| 20 | 20 | subject { FactoryGirl.build(:user) } |
| 21 | 21 | let(:project) {FactoryGirl.build(:project_with_id)} |
| 22 | - let(:project_ownership) {FactoryGirl.build(:project_ownership)} | |
| 22 | + let(:project_attributes) {FactoryGirl.build(:project_attributes)} | |
| 23 | 23 | |
| 24 | 24 | before :each do |
| 25 | - project_ownership.expects(:project).returns(project) | |
| 26 | - subject.expects(:project_ownerships).returns([project_ownership]) | |
| 25 | + project_attributes.expects(:project).returns(project) | |
| 26 | + subject.expects(:project_attributes).returns([project_attributes]) | |
| 27 | 27 | end |
| 28 | 28 | |
| 29 | 29 | it 'should return a list of projects owned by the user' do | ... | ... |