Commit f672063dd85571bd1ee4686f2a53c94f7622ac33
Committed by
Rafael Manzo
1 parent
4af98194
Exists in
colab
and in
4 other branches
Fixed tests in project_controller.rb and closes #25
Showing
7 changed files
with
100 additions
and
84 deletions
Show diff stats
app/controllers/projects_controller.rb
| ... | ... | @@ -40,18 +40,14 @@ class ProjectsController < ApplicationController |
| 40 | 40 | def edit |
| 41 | 41 | set_project |
| 42 | 42 | @project_image = ProjectImage.find_by_project_id(@project.id) |
| 43 | - if !@project_image.nil? | |
| 44 | - @project_image.check_no_image | |
| 45 | - end | |
| 43 | + @project_image.check_no_image | |
| 46 | 44 | end |
| 47 | 45 | |
| 48 | 46 | def update |
| 49 | 47 | set_project |
| 50 | 48 | @project_image = ProjectImage.find_by_project_id(@project.id) |
| 51 | - if !@project_image.nil? | |
| 52 | - @project_image.update(project_params[:image_url]) | |
| 53 | - end | |
| 54 | 49 | if @project.update(project_params) |
| 50 | + @project_image.update(image_url: project_params[:image_url]) | |
| 55 | 51 | redirect_to(project_path(@project.id)) |
| 56 | 52 | else |
| 57 | 53 | render "edit" |
| ... | ... | @@ -71,25 +67,25 @@ class ProjectsController < ApplicationController |
| 71 | 67 | end |
| 72 | 68 | |
| 73 | 69 | private |
| 74 | - # Use callbacks to share common setup or constraints between actions. | |
| 75 | - def set_project | |
| 76 | - @project = Project.find(params[:id]) | |
| 77 | - end | |
| 70 | + # Use callbacks to share common setup or constraints between actions. | |
| 71 | + def set_project | |
| 72 | + @project = Project.find(params[:id]) | |
| 73 | + end | |
| 78 | 74 | |
| 79 | - # Never trust parameters from the scary internet, only allow the white list through. | |
| 80 | - def project_params | |
| 81 | - params[:project] | |
| 82 | - end | |
| 75 | + # Never trust parameters from the scary internet, only allow the white list through. | |
| 76 | + def project_params | |
| 77 | + params[:project] | |
| 78 | + end | |
| 83 | 79 | |
| 84 | - # Extracted code from create action | |
| 85 | - def create_and_redir(format) | |
| 86 | - if @project.save | |
| 87 | - current_user.project_ownerships.create project_id: @project.id | |
| 88 | - format.html { redirect_to project_path(@project.id), notice: 'Project was successfully created.' } | |
| 89 | - format.json { render action: 'show', status: :created, location: @project } | |
| 90 | - else | |
| 91 | - format.html { render action: 'new' } | |
| 92 | - format.json { render json: @project.errors, status: :unprocessable_entity } | |
| 93 | - end | |
| 80 | + # Extracted code from create action | |
| 81 | + def create_and_redir(format) | |
| 82 | + if @project.save | |
| 83 | + current_user.project_ownerships.create project_id: @project.id | |
| 84 | + format.html { redirect_to project_path(@project.id), notice: 'Project was successfully created.' } | |
| 85 | + format.json { render action: 'show', status: :created, location: @project } | |
| 86 | + else | |
| 87 | + format.html { render action: 'new' } | |
| 88 | + format.json { render json: @project.errors, status: :unprocessable_entity } | |
| 94 | 89 | end |
| 90 | + end | |
| 95 | 91 | end | ... | ... |
app/models/project.rb
| 1 | 1 | require "validators/kalibro_uniqueness_validator.rb" |
| 2 | 2 | |
| 3 | 3 | class Project < KalibroGatekeeperClient::Entities::Project |
| 4 | - include KalibroRecord | |
| 4 | + include KalibroRecord | |
| 5 | 5 | |
| 6 | - attr_accessor :name,:image_url | |
| 7 | - validates :name, presence: true, kalibro_uniqueness: true | |
| 6 | + attr_accessor :name,:image_url | |
| 7 | + validates :name, presence: true, kalibro_uniqueness: true | |
| 8 | 8 | |
| 9 | - def repositories | |
| 10 | - Repository.repositories_of(self.id) | |
| 11 | - end | |
| 12 | - | |
| 13 | - def self.latest(count = 1) | |
| 14 | - all.sort { |a,b| b.id <=> a.id }.first(count) | |
| 15 | - end | |
| 9 | + def repositories | |
| 10 | + Repository.repositories_of(self.id) | |
| 11 | + end | |
| 16 | 12 | |
| 13 | + def self.latest(count = 1) | |
| 14 | + all.sort { |a,b| b.id <=> a.id }.first(count) | |
| 15 | + end | |
| 17 | 16 | end | ... | ... |
app/models/project_image.rb
| ... | ... | @@ -5,16 +5,16 @@ class ProjectImage < ActiveRecord::Base |
| 5 | 5 | |
| 6 | 6 | def check_no_image |
| 7 | 7 | if !self.blank? |
| 8 | - if self.image_url == "no-image-available.png" | |
| 9 | - self.image_url = "" | |
| 10 | - end | |
| 8 | + if self.image_url == "no-image-available.png" | |
| 9 | + self.image_url = "" | |
| 10 | + end | |
| 11 | 11 | end |
| 12 | 12 | end |
| 13 | 13 | |
| 14 | 14 | def check_url |
| 15 | - if self.image_url.blank? | |
| 16 | - self.image_url = "no-image-available.png" | |
| 17 | - end | |
| 15 | + if self.image_url.blank? | |
| 16 | + self.image_url = "no-image-available.png" | |
| 17 | + end | |
| 18 | 18 | end |
| 19 | 19 | |
| 20 | 20 | ... | ... |
app/views/projects/_form.html.erb
| 1 | 1 | <%= form_for(@project, :html => { role: 'form' }) do |f| %> |
| 2 | 2 | <%= render :partial => 'shared/form_errors', :locals => {:object => @project} %> |
| 3 | - | |
| 4 | -<div class="row margin-left-none"> | |
| 5 | - <div class="form-table col-md-9"> | |
| 6 | - <div class="form-row"> | |
| 7 | - <div class="field-container"> | |
| 8 | - <%= f.label :name, class: 'control-label' %><br> | |
| 9 | - <%= f.text_field :name, :required => true, class: 'text-field form-control' %> | |
| 3 | + <div class="row margin-left-none"> | |
| 4 | + <div class="form-table col-md-9"> | |
| 5 | + <div class="form-row"> | |
| 6 | + <div class="field-container"> | |
| 7 | + <%= f.label :name, class: 'control-label' %><br> | |
| 8 | + <%= f.text_field :name, :required => true, class: 'text-field form-control' %> | |
| 9 | + </div> | |
| 10 | + <div class="form-row"> | |
| 11 | + <div class="field-container"> | |
| 12 | + <%= f.label :description, class: 'control-label' %><br> | |
| 13 | + <%= f.text_area :description, class: 'text-area form-control' %> | |
| 14 | + </div> | |
| 15 | + </div> | |
| 16 | + <div class="form-row"> | |
| 17 | + <div class="field-container"> | |
| 18 | + <%= f.label "Image url", class: 'control-label' %><br> | |
| 19 | + <%= f.text_field :image_url, class: 'text-area' ,value: @project_image.image_url %> | |
| 20 | + </div> | |
| 21 | + </div> | |
| 10 | 22 | </div> |
| 11 | 23 | </div> |
| 12 | - | |
| 13 | - <div class="form-row"> | |
| 14 | - <div class="field-container"> | |
| 15 | - <%= f.label :description, class: 'control-label' %><br> | |
| 16 | - <%= f.text_area :description, class: 'text-area form-control' %> | |
| 17 | - </div> | |
| 18 | - </div> | |
| 19 | - | |
| 20 | - <div class="form-row"> | |
| 21 | - <div class="field-container"> | |
| 22 | - <%= f.label "Image url", class: 'control-label' %><br> | |
| 23 | - <%= f.text_field :image_url, class: 'text-area' ,value: @project_image.image_url %> | |
| 24 | - </div> | |
| 24 | + <div class="row margin-left-none" style="margin-top: 20px"> | |
| 25 | + <%= f.submit 'Save', class: 'btn btn-primary' %> | |
| 26 | + <%= link_to 'Back', projects_path, class: 'btn btn-default' %> | |
| 25 | 27 | </div> |
| 26 | - | |
| 27 | - | |
| 28 | - </div> | |
| 29 | -</div> | |
| 30 | -<div class="row margin-left-none" style="margin-top: 20px"> | |
| 31 | - <%= f.submit 'Save', class: 'btn btn-primary' %> | |
| 32 | - <%= link_to 'Back', projects_path, class: 'btn btn-default' %> | |
| 33 | -</div> | |
| 34 | -<% end %> | |
| 28 | + <% end %> | ... | ... |
spec/controllers/projects_controller_spec.rb
| ... | ... | @@ -18,10 +18,10 @@ describe ProjectsController, :type => :controller do |
| 18 | 18 | end |
| 19 | 19 | |
| 20 | 20 | context 'with valid fields' do |
| 21 | - let(:project) { FactoryGirl.build(:project) } | |
| 22 | - let(:subject_params) { Hash[FactoryGirl.attributes_for(:project).map { |k,v| [k.to_s, v.to_s] }] } #FIXME: Mocha is creating the expectations with strings, but FactoryGirl returns everything with sybols and integers | |
| 21 | + let(:project) { FactoryGirl.build(:project) } | |
| 22 | + let(:subject_params) { Hash[FactoryGirl.attributes_for(:project).map { |k,v| [k.to_s, v.to_s] }] } #FIXME: Mocha is creating the expectations with strings, but FactoryGirl returns everything with sybols and integers | |
| 23 | 23 | |
| 24 | - before :each do | |
| 24 | + before :each do | |
| 25 | 25 | Project.any_instance.expects(:save).returns(true) |
| 26 | 26 | end |
| 27 | 27 | |
| ... | ... | @@ -62,8 +62,8 @@ describe ProjectsController, :type => :controller do |
| 62 | 62 | end |
| 63 | 63 | |
| 64 | 64 | describe 'show' do |
| 65 | - subject { FactoryGirl.build(:project) } | |
| 66 | - let(:repository) { FactoryGirl.build(:repository) } | |
| 65 | + subject { FactoryGirl.build(:project) } | |
| 66 | + let(:repository) { FactoryGirl.build(:repository) } | |
| 67 | 67 | before :each do |
| 68 | 68 | Project.expects(:find).with(subject.id.to_s).returns(subject) |
| 69 | 69 | subject.expects(:repositories).returns(repository) |
| ... | ... | @@ -116,7 +116,7 @@ describe ProjectsController, :type => :controller do |
| 116 | 116 | delete :destroy, :id => @subject.id |
| 117 | 117 | end |
| 118 | 118 | |
| 119 | - it { is_expected.to redirect_to(projects_path) } | |
| 119 | + it { is_expected.to redirect_to(projects_path) } | |
| 120 | 120 | end |
| 121 | 121 | end |
| 122 | 122 | |
| ... | ... | @@ -142,6 +142,7 @@ describe ProjectsController, :type => :controller do |
| 142 | 142 | describe 'edit' do |
| 143 | 143 | before do |
| 144 | 144 | @subject = FactoryGirl.build(:project) |
| 145 | + @project_image = FactoryGirl.create(:project_image) | |
| 145 | 146 | end |
| 146 | 147 | |
| 147 | 148 | context 'with an User logged in' do |
| ... | ... | @@ -149,7 +150,6 @@ describe ProjectsController, :type => :controller do |
| 149 | 150 | @user = FactoryGirl.create(:user) |
| 150 | 151 | @ownership = FactoryGirl.build(:project_ownership) |
| 151 | 152 | @ownerships = [] |
| 152 | - | |
| 153 | 153 | User.any_instance.expects(:project_ownerships).at_least_once.returns(@ownerships) |
| 154 | 154 | |
| 155 | 155 | sign_in @user |
| ... | ... | @@ -159,6 +159,7 @@ describe ProjectsController, :type => :controller do |
| 159 | 159 | before :each do |
| 160 | 160 | Project.expects(:find).with(@subject.id.to_s).returns(@subject) |
| 161 | 161 | @ownerships.expects(:find_by_project_id).with("#{@subject.id}").returns(@ownership) |
| 162 | + ProjectImage.expects(:find_by_project_id).with(@subject.id).returns(@project_image) | |
| 162 | 163 | |
| 163 | 164 | get :edit, :id => @subject.id |
| 164 | 165 | end |
| ... | ... | @@ -194,8 +195,10 @@ describe ProjectsController, :type => :controller do |
| 194 | 195 | |
| 195 | 196 | describe 'update' do |
| 196 | 197 | before do |
| 197 | - @subject = FactoryGirl.build(:project) | |
| 198 | - @subject_params = Hash[FactoryGirl.attributes_for(:project).map { |k,v| [k.to_s, v.to_s] }] #FIXME: Mocha is creating the expectations with strings, but FactoryGirl returns everything with sybols and integers | |
| 198 | + @project_image = FactoryGirl.create(:project_image) | |
| 199 | + @subject = FactoryGirl.create(:project) | |
| 200 | + @subject_params = Hash[FactoryGirl.attributes_for(:project).map { |k,v| [k.to_s, v.to_s] }] | |
| 201 | + | |
| 199 | 202 | end |
| 200 | 203 | |
| 201 | 204 | context 'when the user is logged in' do |
| ... | ... | @@ -207,9 +210,10 @@ describe ProjectsController, :type => :controller do |
| 207 | 210 | before do |
| 208 | 211 | @ownership = FactoryGirl.build(:project_ownership) |
| 209 | 212 | @ownerships = [] |
| 210 | - | |
| 211 | 213 | @ownerships.expects(:find_by_project_id).with("#{@subject.id}").returns(@ownership) |
| 212 | 214 | User.any_instance.expects(:project_ownerships).at_least_once.returns(@ownerships) |
| 215 | + ProjectImage.expects(:find_by_project_id).with(@subject.id).returns(@project_image) | |
| 216 | + | |
| 213 | 217 | end |
| 214 | 218 | |
| 215 | 219 | context 'with valid fields' do |
| ... | ... | @@ -221,7 +225,6 @@ describe ProjectsController, :type => :controller do |
| 221 | 225 | context 'rendering the show' do |
| 222 | 226 | before :each do |
| 223 | 227 | Project.expects(:exists?).returns(true) |
| 224 | - | |
| 225 | 228 | post :update, :id => @subject.id, :project => @subject_params |
| 226 | 229 | end |
| 227 | 230 | |
| ... | ... | @@ -241,7 +244,7 @@ describe ProjectsController, :type => :controller do |
| 241 | 244 | |
| 242 | 245 | context 'with an invalid field' do |
| 243 | 246 | before :each do |
| 244 | - Project.expects(:find).with(@subject.id.to_s).returns(@subject) | |
| 247 | + #Project.expects(:find).with(@subject.id.to_s).returns(@subject) | |
| 245 | 248 | Project.any_instance.expects(:update).with(@subject_params).returns(false) |
| 246 | 249 | |
| 247 | 250 | post :update, :id => @subject.id, :project => @subject_params | ... | ... |
spec/factories/project_images.rb
| 1 | 1 | # Read about factories at https://github.com/thoughtbot/factory_girl |
| 2 | 2 | |
| 3 | 3 | FactoryGirl.define do |
| 4 | - factory :project_image do | |
| 5 | - image_url "MyString" | |
| 6 | - end | |
| 4 | + factory :project_image do | |
| 5 | + project_id 1 | |
| 6 | + image_url "Example" | |
| 7 | + end | |
| 8 | + | |
| 9 | + factory :project_no_image, class: ProjectImage do | |
| 10 | + image_url nil | |
| 11 | + end | |
| 12 | + | |
| 7 | 13 | end | ... | ... |
spec/models/project_image_spec.rb
| ... | ... | @@ -3,5 +3,23 @@ require 'rails_helper' |
| 3 | 3 | RSpec.describe ProjectImage, :type => :model do |
| 4 | 4 | describe 'associations' do |
| 5 | 5 | it { is_expected.to belong_to(:project) } |
| 6 | + it { should belong_to(:project) } | |
| 6 | 7 | end |
| 8 | + | |
| 9 | + describe 'methods' do | |
| 10 | + | |
| 11 | + it 'should validate url blank' do | |
| 12 | + @project_no_image = FactoryGirl.create(:project_no_image) | |
| 13 | + expect(@project_no_image.image_url).to eq("no-image-available.png") | |
| 14 | + end | |
| 15 | + | |
| 16 | + it "Can be assigns" do | |
| 17 | + expect(ProjectImage.new).to be_an_instance_of(ProjectImage) | |
| 18 | + end | |
| 19 | + | |
| 20 | + it 'should validate url field' do | |
| 21 | + @project_no_image = FactoryGirl.create(:project_no_image) | |
| 22 | + expect(@project_no_image.check_no_image).to eq("") | |
| 23 | + end | |
| 24 | + end | |
| 7 | 25 | end | ... | ... |