diff --git a/Gemfile b/Gemfile index 7e8a652..9840022 100644 --- a/Gemfile +++ b/Gemfile @@ -60,8 +60,8 @@ group :development, :test do gem 'debug', platforms: %i[mri mingw x64_mingw] gem 'rails-controller-testing' gem 'rspec-rails' - gem 'selenium-webdriver' gem 'webdrivers' + # gem 'webdrivers', '~> 5.0', require: false end group :development do @@ -83,3 +83,5 @@ group :test do end gem 'tailwindcss-rails', '~> 2.0' + +gem 'kaminari', '~> 1.2', '>= 1.2.1' diff --git a/Gemfile.lock b/Gemfile.lock index a373402..d647608 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -114,6 +114,18 @@ GEM jbuilder (2.11.5) actionview (>= 5.0.0) activesupport (>= 5.0.0) + kaminari (1.2.2) + activesupport (>= 4.1.0) + kaminari-actionview (= 1.2.2) + kaminari-activerecord (= 1.2.2) + kaminari-core (= 1.2.2) + kaminari-actionview (1.2.2) + actionview + kaminari-core (= 1.2.2) + kaminari-activerecord (1.2.2) + activerecord + kaminari-core (= 1.2.2) + kaminari-core (1.2.2) launchy (2.5.2) addressable (~> 2.8) letter_opener (1.8.1) @@ -273,6 +285,7 @@ DEPENDENCIES dotenv-rails importmap-rails jbuilder + kaminari (~> 1.2, >= 1.2.1) letter_opener pg (~> 1.1) puma (~> 5.0) @@ -280,7 +293,6 @@ DEPENDENCIES rails-controller-testing rails_live_reload rspec-rails - selenium-webdriver sprockets-rails stimulus-rails tailwindcss-rails (~> 2.0) diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 0b74359..409a5de 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -1,19 +1,15 @@ class PostsController < ApplicationController def index @user = User.find(params[:user_id]) - @posts = @user.posts - @tester = 'herer' + @posts = Post.includes(:user, comments: :user).where(user_id: params[:user_id]).page(params[:page]).per(1) + # @user = @posts.user end def show - @post = Post.find(params[:id]) + @post = Post.includes(:comments).find(params[:id]) # @comments = @post.comments end - # def custom_post - # @post = Post.find(params[:id]) - # end - def new @post = Post.new end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 93a9ce5..4ae4c7c 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,5 +1,5 @@ class UsersController < ApplicationController - before_action :authenticate_user! + # before_action :authenticate_user! def index @users = User.all @@ -10,7 +10,8 @@ def show end def edit - @user = current_user + # @user = current_user + @user = User.find(params[:id]) end def update diff --git a/app/models/user.rb b/app/models/user.rb index 523c89d..a9fe4cc 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,8 +1,8 @@ class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable - devise :database_authenticatable, :registerable, - :recoverable, :rememberable, :validatable, :confirmable + # devise :database_authenticatable, :registerable, + # :recoverable, :rememberable, :validatable, :confirmable has_many :posts, dependent: :destroy has_many :comments, dependent: :destroy has_many :likes, dependent: :destroy diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index db495bd..86b7996 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -14,7 +14,7 @@
- <%if user_signed_in? %> + <%if false %>
diff --git a/app/views/posts/index.html.erb b/app/views/posts/index.html.erb index 3601f0e..e19b822 100644 --- a/app/views/posts/index.html.erb +++ b/app/views/posts/index.html.erb @@ -1,3 +1,7 @@ +

All Posts

+ <%= render @user%> -<%= render partial:'posts/post', collection:@posts, locals: {show_comments:true} %> \ No newline at end of file +<%= paginate @posts %> +<%= render partial:'posts/post', collection:@posts, locals: {show_comments:true} %> +<%= paginate @posts %> diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 13de090..dfd6a60 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -1,4 +1,5 @@ <%= form_for(@user) do |f|%> +

Edit User

<%= f.label :name %> <%= f.text_field :name %> diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb index d2257fa..17644fe 100644 --- a/app/views/users/index.html.erb +++ b/app/views/users/index.html.erb @@ -1,7 +1,7 @@ -

All Users

+

All Users

diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index 27120dc..3b66ebb 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -1,4 +1,4 @@ - <%= render 'user', user:@user %> + <%= render @user %>
<%= link_to 'Edit User Data', edit_user_path %> diff --git a/config/initializers/selenium.rb b/config/initializers/selenium.rb new file mode 100644 index 0000000..e69de29 diff --git a/config/routes.rb b/config/routes.rb index 41adf51..c0c0eca 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,6 @@ Rails.application.routes.draw do - devise_for :users + # devise_for :users root 'users#index' diff --git a/spec/features/post_index_spec.rb b/spec/features/post_index_spec.rb new file mode 100644 index 0000000..6caee5d --- /dev/null +++ b/spec/features/post_index_spec.rb @@ -0,0 +1,71 @@ +require 'rails_helper' + +RSpec.describe 'Posts Index', type: :feature do + before(:all) do + @user = User.create(name: 'Jann Doe', bio: 'I am John Doe', email: 'rand_email', photo: 'https://robohash.org/hey?set=set4') + @post = Post.create(user: @user, title: 'Hello', text: 'Teacher need to get trained') + @post1 = Post.create(user: @user, title: 'Hello1', text: 'Teacher need to get trained2') + @post2 = Post.create(user: @user, title: 'Hello2', text: 'Teacher need to get trained3') + @comment = Comment.create(user: @user, post: @post, text: 'I agree') + end + + after(:all) do + @user.destroy + @post.destroy + @post1.destroy + @post2.destroy + @comment.destroy + end + + it 'displays users profile picture' do + visit user_posts_path(@user) + expect(page).to have_css("img[src*='https://robohash.org/hey?set=set4']") + end + + it 'displays users name' do + visit user_posts_path(@user) + expect(page).to have_content('Jann Doe') + end + + it 'displays number of posts by user' do + visit user_posts_path(@user) + expect(page).to have_content('No of posts: 3') + end + + it 'displays posts title' do + visit user_posts_path(@user) + expect(page).to have_content('Hello') + end + + it 'displays posts text' do + visit user_posts_path(@user) + expect(page).to have_content('Teacher need to get trained2') + end + + it 'displays posts comments' do + visit user_posts_path(@user) + expect(page).to have_content('Teacher need to get trained2') + end + + it 'displays posts comments count' do + visit user_posts_path(@user) + expect(page).to have_content('Comments: 0') + end + + it 'displays posts like count' do + visit user_posts_path(@user) + expect(page).to have_content('Likes: 0') + end + + it 'redirects to show page when post title is clicked' do + visit user_posts_path(@user) + click_link('Hello') + expect(page).to have_content('Hello') + end + + it 'will paginate posts' do + visit user_posts_path(@user) + expect(page).to have_content('Next') + expect(page).to have_content('Last') + end +end diff --git a/spec/features/post_spec.rb b/spec/features/post_spec.rb new file mode 100644 index 0000000..bb98063 --- /dev/null +++ b/spec/features/post_spec.rb @@ -0,0 +1,50 @@ +require 'rails_helper' + +RSpec.describe 'Posts Show', type: :feature do + before(:all) do + @user = User.create(name: 'Jann Doe', bio: 'I am John Doe', email: 'rand_email') + @post = Post.create(user: @user, title: 'Hello', text: 'Teacher need to get trained') + @comment = Comment.create(user: @user, post: @post, text: 'I agree') + end + + after(:all) do + @user.destroy + @post.destroy + end + + it 'displays the title of the post' do + visit user_posts_path(@user) + expect(page).to have_content('Hello') + end + + it 'displays who wrote the post' do + visit user_posts_path(@user) + expect(page).to have_content('Jann Doe') + end + + it 'displays number of comments' do + visit user_post_path(user_id: @user.id, id: @post.id) + expect(page).to have_content('Comments: 1') + end + + it 'displays number of likes' do + visit user_posts_path(@user) + expect(page).to have_content('Likes: 0') + end + + it 'displays the text of the post' do + visit user_posts_path(@user) + expect(page).to have_content('Teacher need to get trained') + end + + it 'displays user name of commentor' do + visit user_post_path(user_id: @user.id, id: @post.id) + expect(page).to have_content('Jann Doe :') + end + + it 'displays each comment the commentor left' do + visit user_post_path(user_id: @user.id, id: @post.id) + + expect(page).to have_content('Jann Doe : I agree') + end +end diff --git a/spec/features/user_index_spec.rb b/spec/features/user_index_spec.rb new file mode 100644 index 0000000..2a00186 --- /dev/null +++ b/spec/features/user_index_spec.rb @@ -0,0 +1,45 @@ +require 'rails_helper' + +RSpec.describe 'Users Index Page', type: :feature do + before(:all) do + @user = User.create(name: 'John Doe', bio: 'I am John Doe', email: 'rand_email2', photo: 'https://robohash.org/hey?set=set4') + + @user2 = User.create(name: 'Jann Doe', bio: 'I am Jann Doe', email: 'rand_email3', photo: 'https://robohash.org/ho?set=set4') + @post = Post.create(user: @user, title: 'Hello', text: 'Teacher need to get trained') + + @post2 = Post.create(user: @user, title: 'Hello', text: 'My second post') + + @post3 = Post.create(user: @user2, title: 'Hello', text: 'My first post') + end + + after(:all) do + @user.destroy + @user2.destroy + @post.destroy + end + + it 'displays all users names' do + visit users_path + expect(page).to have_content('Jann Doe') + expect(page).to have_content('Jann Doe') + end + + it 'displays all users profile pictures' do + visit users_path + expect(page).to have_css("img[src*='https://robohash.org/hey?set=set4']") + expect(page).to have_css("img[src*='https://robohash.org/ho?set=set4']") + end + + it 'displays all the users post count' do + visit users_path + expect(page).to have_content('No of posts: 2') + expect(page).to have_content('No of posts: 1') + end + + it 'redirects to the users show page when clicked' do + visit users_path + find('a', text: 'Jann Doe', wait: 5).click + + assert_current_path(user_path(@user2)) + end +end diff --git a/spec/features/user_spec.rb b/spec/features/user_spec.rb new file mode 100644 index 0000000..a5bdbee --- /dev/null +++ b/spec/features/user_spec.rb @@ -0,0 +1,92 @@ +require 'rails_helper' + +RSpec.feature 'User', type: :feature do + before(:all) do + @user = User.create(name: 'Jann Doe', bio: 'I am Jann Doe', email: 'ran.com', photo: 'https://robohash.org/hey?set=set4') + @post = Post.create(user_id: @user.id, title: 'Hello', text: 'Teacher need to get trained') + @post2 = Post.create(user_id: @user.id, title: 'Hello', text: 'My second post') + @post3 = Post.create(user_id: @user.id, title: 'Hello', text: 'My third post') + end + + after(:all) do + @user.destroy + @post.destroy + @post2.destroy + @post3.destroy + end + + it 'displays a users profile picture' do + visit user_path(@user) + expect(page).to have_css("img[src*='https://robohash.org/hey?set=set4']") + end + + it 'displays a user UserName' do + visit user_path(@user) + expect(page).to have_content('Jann Doe') + end +end + +RSpec.feature 'User show', type: :feature do + before(:all) do + @user = User.create(name: 'Jann Doe', bio: 'I am Jann Doe', email: 'ran.com', photo: 'https://robohash.org/hey?set=set4') + @post = Post.create(user_id: @user.id, title: 'Hello', text: 'Teacher need to get trained') + @post2 = Post.create(user_id: @user.id, title: 'Hello', text: 'My second post') + @post3 = Post.create(user_id: @user.id, title: 'Hello', text: 'My third post') + end + + after(:all) do + @user.destroy + @post.destroy + @post2.destroy + @post3.destroy + end + + it 'displays a user bio' do + visit user_path(@user) + expect(page).to have_content('I am Jann Doe') + end + it 'displays button to view all posts' do + visit user_path(@user) + expect(page).to have_content('See All Posts') + end + + it 'redirects to all posts page when view all posts is clicked' do + visit user_path(@user) + click_button 'See All Posts' + expect(page).to have_content('My third post') + expect(page).to have_content('My second post') + expect(page).to have_content('Teacher need to get trained') + end +end + +RSpec.feature 'User show and nav', type: :feature do + before(:all) do + @user = User.create(name: 'Jann Doe', bio: 'I am Jann Doe', email: 'ran.com', photo: 'https://robohash.org/hey?set=set4') + @post = Post.create(user_id: @user.id, title: 'Hello', text: 'Teacher need to get trained') + @post2 = Post.create(user_id: @user.id, title: 'Hello', text: 'My second post') + @post3 = Post.create(user_id: @user.id, title: 'Hello', text: 'My third post') + end + + after(:all) do + @user.destroy + @post.destroy + @post2.destroy + @post3.destroy + end + it 'displays a users 3 most recent posts' do + visit user_path(@user) + expect(page).to have_content('My third post') + expect(page).to have_content('My second post') + expect(page).to have_content('Teacher need to get trained') + end + + it 'displays number of posts' do + visit user_path(@user) + expect(page).to have_content('No of posts: 3') + end + it 'redirects to post show page when post is clicked' do + visit user_path(@user) + click_on 'My third post' + expect(page).to have_content('My third post') + end +end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 6584c98..cb42a0b 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -33,6 +33,8 @@ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures config.fixture_path = "#{Rails.root}/spec/fixtures" + Capybara.javascript_driver = :selenium_firefox + # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false # instead of true. @@ -60,4 +62,15 @@ config.filter_rails_from_backtrace! # arbitrary gems may also be filtered via: # config.filter_gems_from_backtrace("gem name") + Capybara.register_driver :selenium_chrome_headless do |app| + options = Selenium::WebDriver::Chrome::Options.new + options.add_argument('--headless') + options.add_argument('--no-sandbox') + options.add_argument('--disable-dev-shm-usage') + + Capybara::Selenium::Driver.new(app, browser: :chrome, options:) + end + + Capybara.javascript_driver = :selenium_chrome_headless + Capybara.server = :puma end diff --git a/spec/views/users/index.html.erb_spec.rb b/spec/views/users/index.html.erb_spec.rb deleted file mode 100644 index 533b1d8..0000000 --- a/spec/views/users/index.html.erb_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'users/index.html.erb', type: :feature, new: true do - let!(:user) do - User.create(name: 'Tati', bio: 'Coding', photo: 'https://avatars.githubusercontent.com/u/80094659?v=4') - end - - before do - visit users_path - end - - describe 'GET /users' do - it 'displays users' do - # visit users_path - - expect(page).to have_content(' ') - end - end -end