From e6b5085f24f8867f5f9465df8f4aab7ade4c33e7 Mon Sep 17 00:00:00 2001 From: Eleanor Chamberlain-Stoltzfus Date: Thu, 31 Mar 2022 11:54:21 +0100 Subject: [PATCH 1/9] bundle installed gems --- Gemfile.lock | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Gemfile.lock b/Gemfile.lock index 7d4eb449..21826b1e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -18,6 +18,8 @@ GEM mini_mime (1.1.1) mustermann (1.1.1) ruby2_keywords (~> 0.0.1) + nokogiri (1.12.3-arm64-darwin) + racc (~> 1.4) nokogiri (1.12.3-x86_64-darwin) racc (~> 1.4) parallel (1.20.1) @@ -83,6 +85,7 @@ GEM nokogiri (~> 1.8) PLATFORMS + arm64-darwin-21 x86_64-darwin-20 DEPENDENCIES From 2514c074606938e07139e8eb3b1e0d73b106120e Mon Sep 17 00:00:00 2001 From: Eleanor Chamberlain-Stoltzfus Date: Thu, 31 Mar 2022 13:47:03 +0100 Subject: [PATCH 2/9] created view peeps --- app.rb | 15 +++++++++++++ lib/peeps.rb | 35 +++++++++++++++++++++++++++++ spec/features/viewing_peeps_spec.rb | 13 +++++++++++ spec/peeps_spec.rb | 17 ++++++++++++++ views/index.erb | 7 ++++++ views/new_peep.erb | 4 ++++ 6 files changed, 91 insertions(+) create mode 100644 lib/peeps.rb create mode 100644 spec/features/viewing_peeps_spec.rb create mode 100644 spec/peeps_spec.rb create mode 100644 views/index.erb create mode 100644 views/new_peep.erb diff --git a/app.rb b/app.rb index 2450fb92..da6cf580 100644 --- a/app.rb +++ b/app.rb @@ -1,9 +1,24 @@ require 'sinatra/base' +require './lib/peeps' class Chitter < Sinatra::Base get '/test' do 'Test page' end + get '/peeps' do + @peeps = Peeps.all + erb :index + end + + get '/peeps/new' do + erb :new_peep + end + + post '/peeps' do + Peeps.create(message: params[:message]) + redirect '/peeps' + end + run! if app_file == $0 end diff --git a/lib/peeps.rb b/lib/peeps.rb new file mode 100644 index 00000000..e6956af2 --- /dev/null +++ b/lib/peeps.rb @@ -0,0 +1,35 @@ +require 'pg' + +class Peeps + + attr_reader :id, :message + + def initialize(id:, message:) + @id = id + @message = message + end + + def self.all + if ENV['ENVIRONMENT'] == 'test' + connection = PG.connect(dbname: 'chitter_test') + else + connection = PG.connect(dbname: 'chitter') + end + + result = connection.exec("SELECT * FROM peeps;") + result.map do |peep| + Peeps.new(id: peep['id'], message: peep['message']) + end + end + + def self.create(message:) + if ENV['ENVIRONMENT'] == 'test' + connection = PG.connect(dbname: 'chitter_test') + else + connection = PG.connect(dbname: 'chitter') + end + + result = connection.exec_params("INSERT INTO peeps (message) VALUES($1) RETURNING id, message;", [message]) + Peeps.new(id: result[0]['id'], message: result[0]['message']) + end +end \ No newline at end of file diff --git a/spec/features/viewing_peeps_spec.rb b/spec/features/viewing_peeps_spec.rb new file mode 100644 index 00000000..7be5cf6a --- /dev/null +++ b/spec/features/viewing_peeps_spec.rb @@ -0,0 +1,13 @@ +feature 'Viewing peeps' do + scenario 'user can view all peeps' do + connection = PG.connect(dbname: 'chitter_test') + + Peeps.create(message: 'Test peep!') + Peeps.create(message: 'Second test peep!') + + visit ('/peeps') + + expect(page).to have_content('Test peep!') + expect(page).to have_content('Second test peep!') + end +end \ No newline at end of file diff --git a/spec/peeps_spec.rb b/spec/peeps_spec.rb new file mode 100644 index 00000000..3ec9e496 --- /dev/null +++ b/spec/peeps_spec.rb @@ -0,0 +1,17 @@ +require 'peeps' + +describe '.all' do + it 'returns a list of peeps' do + connection = PG.connect(dbname: 'chitter_test') + + chitter = Peeps.create(message: "Test peep!") + Peeps.create(message: "Second test peep!") + Peeps.create(message: "Third test peep!") + + chitter = Peeps.all + + expect(chitter.length).to eq 3 + expect(chitter.first).to be_a Peeps + expect(chitter.first.message).to eq "Test peep!" + end +end \ No newline at end of file diff --git a/views/index.erb b/views/index.erb new file mode 100644 index 00000000..9563e73e --- /dev/null +++ b/views/index.erb @@ -0,0 +1,7 @@ +

Welcome to Chitter!

+ + \ No newline at end of file diff --git a/views/new_peep.erb b/views/new_peep.erb new file mode 100644 index 00000000..4d80a526 --- /dev/null +++ b/views/new_peep.erb @@ -0,0 +1,4 @@ +
+ + +
\ No newline at end of file From f656b78210fe63164a124d2b3b2aa91e52ee35da Mon Sep 17 00:00:00 2001 From: Eleanor Chamberlain-Stoltzfus Date: Thu, 31 Mar 2022 13:52:48 +0100 Subject: [PATCH 3/9] added posting new tweet functionality --- spec/database_helpers.rb | 7 +++++++ spec/peeps_spec.rb | 13 +++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 spec/database_helpers.rb diff --git a/spec/database_helpers.rb b/spec/database_helpers.rb new file mode 100644 index 00000000..2bb1ec76 --- /dev/null +++ b/spec/database_helpers.rb @@ -0,0 +1,7 @@ +require 'pg' + +def persisted_data(id:) + connection = PG.connect(dbname: 'chitter_test') + result = connection.query("SELECT * FROM peeps WHERE id = #{id};") + result.first +end \ No newline at end of file diff --git a/spec/peeps_spec.rb b/spec/peeps_spec.rb index 3ec9e496..bb00849a 100644 --- a/spec/peeps_spec.rb +++ b/spec/peeps_spec.rb @@ -14,4 +14,17 @@ expect(chitter.first).to be_a Peeps expect(chitter.first.message).to eq "Test peep!" end +end + +require 'database_helpers' + +describe '.create' do + it 'creates a new peep' do + chitter = Peeps.create(message: "Test peep!") + persisted_data = persisted_data(id: chitter.id) + + expect(chitter).to be_a Peeps + expect(chitter.id).to eq persisted_data['id'] + expect(chitter.message).to eq "Test peep!" + end end \ No newline at end of file From 15d08c75cf358ad27d43d98cbd7e22f4a25e48a3 Mon Sep 17 00:00:00 2001 From: Eleanor Chamberlain-Stoltzfus Date: Thu, 31 Mar 2022 14:11:25 +0100 Subject: [PATCH 4/9] added image of birds to '/' --- Gemfile | 1 + Gemfile.lock | 8 ++++++++ app.rb | 7 ++++--- chitter_image.jpeg | Bin 0 -> 84456 bytes views/index.erb | 7 +------ views/peeps.erb | 7 +++++++ 6 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 chitter_image.jpeg create mode 100644 views/peeps.erb diff --git a/Gemfile b/Gemfile index 99d8e519..d0d971e8 100644 --- a/Gemfile +++ b/Gemfile @@ -6,6 +6,7 @@ ruby '3.0.2' gem 'pg' gem 'sinatra' +gem 'sinatra-contrib' group :test do gem 'capybara' diff --git a/Gemfile.lock b/Gemfile.lock index 21826b1e..89504308 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -16,6 +16,7 @@ GEM diff-lcs (1.4.4) docile (1.4.0) mini_mime (1.1.1) + multi_json (1.15.0) mustermann (1.1.1) ruby2_keywords (~> 0.0.1) nokogiri (1.12.3-arm64-darwin) @@ -77,6 +78,12 @@ GEM rack (~> 2.2) rack-protection (= 2.1.0) tilt (~> 2.0) + sinatra-contrib (2.1.0) + multi_json + mustermann (~> 1.0) + rack-protection (= 2.1.0) + sinatra (= 2.1.0) + tilt (~> 2.0) terminal-table (3.0.1) unicode-display_width (>= 1.1.1, < 3) tilt (2.0.10) @@ -96,6 +103,7 @@ DEPENDENCIES simplecov simplecov-console sinatra + sinatra-contrib RUBY VERSION ruby 3.0.2p107 diff --git a/app.rb b/app.rb index da6cf580..84481450 100644 --- a/app.rb +++ b/app.rb @@ -2,13 +2,14 @@ require './lib/peeps' class Chitter < Sinatra::Base - get '/test' do - 'Test page' + get '/' do + 'Welcome to Chitter!' + erb :index end get '/peeps' do @peeps = Peeps.all - erb :index + erb :peeps end get '/peeps/new' do diff --git a/chitter_image.jpeg b/chitter_image.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..f9d08fa6e2761141d05342d7ab3cc12a0f185326 GIT binary patch literal 84456 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 Welcome to Chitter! -
    - <% @peeps.each do |peep| %> -
  • <%= peep.message %>
  • - <% end %> -
- \ No newline at end of file +Chitter Birds \ No newline at end of file diff --git a/views/peeps.erb b/views/peeps.erb new file mode 100644 index 00000000..9563e73e --- /dev/null +++ b/views/peeps.erb @@ -0,0 +1,7 @@ +

Welcome to Chitter!

+
    + <% @peeps.each do |peep| %> +
  • <%= peep.message %>
  • + <% end %> +
+ \ No newline at end of file From 70326bb3348afd868d21a87e905294e2c605a548 Mon Sep 17 00:00:00 2001 From: Eleanor Chamberlain-Stoltzfus Date: Thu, 31 Mar 2022 15:54:05 +0100 Subject: [PATCH 5/9] added date feature to tables and programme --- app.rb | 6 +++++- db/migrations/01_add_date_column.sql | 1 + lib/peeps.rb | 13 +++++++------ spec/features/creating_peeps_spec.rb | 15 +++++++++++++++ spec/features/viewing_peeps_spec.rb | 4 ++-- spec/peeps_spec.rb | 10 ++++++---- views/new_peep.erb | 1 + views/peeps.erb | 1 + 8 files changed, 38 insertions(+), 13 deletions(-) create mode 100644 db/migrations/01_add_date_column.sql create mode 100644 spec/features/creating_peeps_spec.rb diff --git a/app.rb b/app.rb index 84481450..f639b3f3 100644 --- a/app.rb +++ b/app.rb @@ -2,6 +2,10 @@ require './lib/peeps' class Chitter < Sinatra::Base + get '/test' do + 'Test page' + end + get '/' do 'Welcome to Chitter!' erb :index @@ -17,7 +21,7 @@ class Chitter < Sinatra::Base end post '/peeps' do - Peeps.create(message: params[:message]) + Peeps.create(message: params[:message], entry_date: params[:entry_date]) redirect '/peeps' end diff --git a/db/migrations/01_add_date_column.sql b/db/migrations/01_add_date_column.sql new file mode 100644 index 00000000..8c0031f1 --- /dev/null +++ b/db/migrations/01_add_date_column.sql @@ -0,0 +1 @@ +ALTER TABLE peeps ADD entry_date date; \ No newline at end of file diff --git a/lib/peeps.rb b/lib/peeps.rb index e6956af2..23804600 100644 --- a/lib/peeps.rb +++ b/lib/peeps.rb @@ -2,11 +2,12 @@ class Peeps - attr_reader :id, :message + attr_reader :id, :message, :entry_date - def initialize(id:, message:) + def initialize(id:, message:, entry_date:) @id = id @message = message + @entry_date = entry_date end def self.all @@ -18,18 +19,18 @@ def self.all result = connection.exec("SELECT * FROM peeps;") result.map do |peep| - Peeps.new(id: peep['id'], message: peep['message']) + Peeps.new(id: peep['id'], message: peep['message'], entry_date: peep['entry_date']) end end - def self.create(message:) + def self.create(message:, entry_date:) if ENV['ENVIRONMENT'] == 'test' connection = PG.connect(dbname: 'chitter_test') else connection = PG.connect(dbname: 'chitter') end - result = connection.exec_params("INSERT INTO peeps (message) VALUES($1) RETURNING id, message;", [message]) - Peeps.new(id: result[0]['id'], message: result[0]['message']) + result = connection.exec_params("INSERT INTO peeps (message, entry_date) VALUES($1, $2) RETURNING id, message, entry_date;", [message, entry_date]) + Peeps.new(id: result[0]['id'], message: result[0]['message'], entry_date: result[0]['entry_date']) end end \ No newline at end of file diff --git a/spec/features/creating_peeps_spec.rb b/spec/features/creating_peeps_spec.rb new file mode 100644 index 00000000..afb793a7 --- /dev/null +++ b/spec/features/creating_peeps_spec.rb @@ -0,0 +1,15 @@ +feature 'Creating peeps' do + scenario 'user can add peeps and dates' do + connection = PG.connect(dbname: 'chitter_test') + + Peeps.create(message: 'Test peep!', entry_date: "2021-03-18") + Peeps.create(message: 'Second test peep!', entry_date: "2021-02-15") + + visit ('/peeps') + + expect(page).to have_content('Test peep!') + expect(page).to have_content('Second test peep!') + expect(page).to have_content("2021-03-18") + expect(page).to have_content("2021-02-15") + end +end \ No newline at end of file diff --git a/spec/features/viewing_peeps_spec.rb b/spec/features/viewing_peeps_spec.rb index 7be5cf6a..560b09e3 100644 --- a/spec/features/viewing_peeps_spec.rb +++ b/spec/features/viewing_peeps_spec.rb @@ -2,8 +2,8 @@ scenario 'user can view all peeps' do connection = PG.connect(dbname: 'chitter_test') - Peeps.create(message: 'Test peep!') - Peeps.create(message: 'Second test peep!') + Peeps.create(message: 'Test peep!', entry_date: "2021-03-18") + Peeps.create(message: 'Second test peep!', entry_date: "2021-02-15") visit ('/peeps') diff --git a/spec/peeps_spec.rb b/spec/peeps_spec.rb index bb00849a..a41ce2a3 100644 --- a/spec/peeps_spec.rb +++ b/spec/peeps_spec.rb @@ -4,15 +4,16 @@ it 'returns a list of peeps' do connection = PG.connect(dbname: 'chitter_test') - chitter = Peeps.create(message: "Test peep!") - Peeps.create(message: "Second test peep!") - Peeps.create(message: "Third test peep!") + chitter = Peeps.create(message: "Test peep!", entry_date: "2021-02-15") + Peeps.create(message: "Second test peep!", entry_date: "2021-02-13") + Peeps.create(message: "Third test peep!", entry_date: "2021-10-16") chitter = Peeps.all expect(chitter.length).to eq 3 expect(chitter.first).to be_a Peeps expect(chitter.first.message).to eq "Test peep!" + expect(chitter.first.entry_date).to eq "2021-02-15" end end @@ -20,11 +21,12 @@ describe '.create' do it 'creates a new peep' do - chitter = Peeps.create(message: "Test peep!") + chitter = Peeps.create(message: "Test peep!", entry_date: "2021-02-15") persisted_data = persisted_data(id: chitter.id) expect(chitter).to be_a Peeps expect(chitter.id).to eq persisted_data['id'] expect(chitter.message).to eq "Test peep!" + expect(chitter.entry_date).to eq "2021-02-15" end end \ No newline at end of file diff --git a/views/new_peep.erb b/views/new_peep.erb index 4d80a526..b3dde969 100644 --- a/views/new_peep.erb +++ b/views/new_peep.erb @@ -1,4 +1,5 @@
+
\ No newline at end of file diff --git a/views/peeps.erb b/views/peeps.erb index 9563e73e..7a684c43 100644 --- a/views/peeps.erb +++ b/views/peeps.erb @@ -2,6 +2,7 @@
    <% @peeps.each do |peep| %>
  • <%= peep.message %>
  • +
  • <%= peep.entry_date%>
  • <% end %>
\ No newline at end of file From 1a296dd606e47b5ff4dd90e6d18adc4dde20d5b9 Mon Sep 17 00:00:00 2001 From: Eleanor Chamberlain-Stoltzfus Date: Thu, 31 Mar 2022 16:15:47 +0100 Subject: [PATCH 6/9] improved html to refine /peeps page --- views/peeps.erb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/views/peeps.erb b/views/peeps.erb index 7a684c43..13349c0e 100644 --- a/views/peeps.erb +++ b/views/peeps.erb @@ -1,8 +1,10 @@

Welcome to Chitter!

-
    + + <% @peeps.each do |peep| %> -
  • <%= peep.message %>
  • -
  • <%= peep.entry_date%>
  • +
    + <%= peep.message %> + <%= peep.entry_date %> +
    <% end %> -
- \ No newline at end of file + From d31184141877ff2bcdc3b12e1572eb26caab4d56 Mon Sep 17 00:00:00 2001 From: Eleanor Chamberlain-Stoltzfus Date: Fri, 1 Apr 2022 11:54:04 +0100 Subject: [PATCH 7/9] added reverse chronology functionality --- app.rb | 7 ++++++- lib/peeps.rb | 13 +++++++++++++ spec/features/creating_peeps_spec.rb | 2 +- spec/features/reverse_chronological_order_spec.rb | 12 ++++++++++++ spec/features/viewing_peeps_spec.rb | 2 +- spec/peeps_spec.rb | 2 +- views/peeps.erb | 6 +++++- views/peeps_reverse.erb | 8 ++++++++ 8 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 spec/features/reverse_chronological_order_spec.rb create mode 100644 views/peeps_reverse.erb diff --git a/app.rb b/app.rb index f639b3f3..9e8ef1a8 100644 --- a/app.rb +++ b/app.rb @@ -5,7 +5,7 @@ class Chitter < Sinatra::Base get '/test' do 'Test page' end - + get '/' do 'Welcome to Chitter!' erb :index @@ -25,5 +25,10 @@ class Chitter < Sinatra::Base redirect '/peeps' end + get '/peeps/reverse' do + @peeps = Peeps.reverse_chronology + erb :peeps_reverse + end + run! if app_file == $0 end diff --git a/lib/peeps.rb b/lib/peeps.rb index 23804600..5afa46ea 100644 --- a/lib/peeps.rb +++ b/lib/peeps.rb @@ -33,4 +33,17 @@ def self.create(message:, entry_date:) result = connection.exec_params("INSERT INTO peeps (message, entry_date) VALUES($1, $2) RETURNING id, message, entry_date;", [message, entry_date]) Peeps.new(id: result[0]['id'], message: result[0]['message'], entry_date: result[0]['entry_date']) end + + def self.reverse_chronology + if ENV['ENVIRONMENT'] == 'test' + connection = PG.connect(dbname: 'chitter_test') + else + connection = PG.connect(dbname: 'chitter') + end + + result = connection.exec("SELECT * FROM peeps ORDER BY entry_date DESC;") + result.map do |peep| + Peeps.new(id: peep['id'], message: peep['message'], entry_date: peep['entry_date']) + end + end end \ No newline at end of file diff --git a/spec/features/creating_peeps_spec.rb b/spec/features/creating_peeps_spec.rb index afb793a7..a4b2b76d 100644 --- a/spec/features/creating_peeps_spec.rb +++ b/spec/features/creating_peeps_spec.rb @@ -1,6 +1,6 @@ feature 'Creating peeps' do scenario 'user can add peeps and dates' do - connection = PG.connect(dbname: 'chitter_test') + setup_test_database Peeps.create(message: 'Test peep!', entry_date: "2021-03-18") Peeps.create(message: 'Second test peep!', entry_date: "2021-02-15") diff --git a/spec/features/reverse_chronological_order_spec.rb b/spec/features/reverse_chronological_order_spec.rb new file mode 100644 index 00000000..5e899160 --- /dev/null +++ b/spec/features/reverse_chronological_order_spec.rb @@ -0,0 +1,12 @@ +feature 'Reverse chronological peeps' do + scenario 'user can see most recent peeps first' do + setup_test_database + + Peeps.create(message: 'Test peep!', entry_date: "2021-03-18") + Peeps.create(message: 'Second test peep!', entry_date: "2021-02-15") + + visit ('/peeps') + + page.body.index("2021-03-18").should < page.body.index("2021-02-15") + end +end \ No newline at end of file diff --git a/spec/features/viewing_peeps_spec.rb b/spec/features/viewing_peeps_spec.rb index 560b09e3..8a200986 100644 --- a/spec/features/viewing_peeps_spec.rb +++ b/spec/features/viewing_peeps_spec.rb @@ -1,6 +1,6 @@ feature 'Viewing peeps' do scenario 'user can view all peeps' do - connection = PG.connect(dbname: 'chitter_test') + setup_test_database Peeps.create(message: 'Test peep!', entry_date: "2021-03-18") Peeps.create(message: 'Second test peep!', entry_date: "2021-02-15") diff --git a/spec/peeps_spec.rb b/spec/peeps_spec.rb index a41ce2a3..9f9e55fc 100644 --- a/spec/peeps_spec.rb +++ b/spec/peeps_spec.rb @@ -2,7 +2,7 @@ describe '.all' do it 'returns a list of peeps' do - connection = PG.connect(dbname: 'chitter_test') + setup_test_database chitter = Peeps.create(message: "Test peep!", entry_date: "2021-02-15") Peeps.create(message: "Second test peep!", entry_date: "2021-02-13") diff --git a/views/peeps.erb b/views/peeps.erb index 13349c0e..732eafe8 100644 --- a/views/peeps.erb +++ b/views/peeps.erb @@ -7,4 +7,8 @@ <%= peep.entry_date %> <% end %> - + +
+ +
+ \ No newline at end of file diff --git a/views/peeps_reverse.erb b/views/peeps_reverse.erb new file mode 100644 index 00000000..b8340531 --- /dev/null +++ b/views/peeps_reverse.erb @@ -0,0 +1,8 @@ +

Welcome to Chitter!

+ + <% @peeps.each do |peep| %> +
+ <%= peep.message %> + <%= peep.entry_date %> +
+ <% end %> \ No newline at end of file From 2c3999edc2744b4b82150aae8fb8dc82035f3803 Mon Sep 17 00:00:00 2001 From: Eleanor Chamberlain-Stoltzfus Date: Fri, 1 Apr 2022 12:19:17 +0100 Subject: [PATCH 8/9] refactored code in peeps.rb --- lib/peeps.rb | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/peeps.rb b/lib/peeps.rb index 5afa46ea..b758f4e5 100644 --- a/lib/peeps.rb +++ b/lib/peeps.rb @@ -10,40 +10,40 @@ def initialize(id:, message:, entry_date:) @entry_date = entry_date end - def self.all + def self.open_connection if ENV['ENVIRONMENT'] == 'test' connection = PG.connect(dbname: 'chitter_test') else connection = PG.connect(dbname: 'chitter') end + end + + def self.row_to_peep(row) + Peeps.new(id: row['id'], message: row['message'], entry_date: row['entry_date']) + end + + def self.all + connection = open_connection result = connection.exec("SELECT * FROM peeps;") result.map do |peep| - Peeps.new(id: peep['id'], message: peep['message'], entry_date: peep['entry_date']) + row_to_peep(peep) end end def self.create(message:, entry_date:) - if ENV['ENVIRONMENT'] == 'test' - connection = PG.connect(dbname: 'chitter_test') - else - connection = PG.connect(dbname: 'chitter') - end + connection = open_connection result = connection.exec_params("INSERT INTO peeps (message, entry_date) VALUES($1, $2) RETURNING id, message, entry_date;", [message, entry_date]) - Peeps.new(id: result[0]['id'], message: result[0]['message'], entry_date: result[0]['entry_date']) + row_to_peep(result[0]) end def self.reverse_chronology - if ENV['ENVIRONMENT'] == 'test' - connection = PG.connect(dbname: 'chitter_test') - else - connection = PG.connect(dbname: 'chitter') - end + connection = open_connection result = connection.exec("SELECT * FROM peeps ORDER BY entry_date DESC;") result.map do |peep| - Peeps.new(id: peep['id'], message: peep['message'], entry_date: peep['entry_date']) + row_to_peep(peep) end - end + end end \ No newline at end of file From d4f0a506d49b199ca58355163ea7710f92fba574 Mon Sep 17 00:00:00 2001 From: Eleanor Chamberlain-Stoltzfus Date: Fri, 1 Apr 2022 17:08:32 +0100 Subject: [PATCH 9/9] added filter functionality --- app.rb | 5 +++++ lib/peeps.rb | 12 ++++++++++-- spec/features/filter_peeps_spec.rb | 15 +++++++++++++++ spec/features/reverse_chronological_order_spec.rb | 2 ++ spec/peeps_spec.rb | 12 ++++++++++++ views/peeps.erb | 5 +++++ views/peeps_filter.erb | 10 ++++++++++ 7 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 spec/features/filter_peeps_spec.rb create mode 100644 views/peeps_filter.erb diff --git a/app.rb b/app.rb index 9e8ef1a8..31fe9ea0 100644 --- a/app.rb +++ b/app.rb @@ -30,5 +30,10 @@ class Chitter < Sinatra::Base erb :peeps_reverse end + get '/peeps/filter' do + @filtered_peeps = Peeps.filter(params[:filter]) + erb :peeps_filter + end + run! if app_file == $0 end diff --git a/lib/peeps.rb b/lib/peeps.rb index b758f4e5..e86de18d 100644 --- a/lib/peeps.rb +++ b/lib/peeps.rb @@ -2,7 +2,7 @@ class Peeps - attr_reader :id, :message, :entry_date + attr_reader :id, :message, :entry_date, :filter def initialize(id:, message:, entry_date:) @id = id @@ -27,7 +27,7 @@ def self.all result = connection.exec("SELECT * FROM peeps;") result.map do |peep| - row_to_peep(peep) + row_to_peep(peep) end end @@ -46,4 +46,12 @@ def self.reverse_chronology row_to_peep(peep) end end + + def self.filter(filter) + connection = open_connection + result = connection.exec("SELECT * FROM peeps WHERE lower(message) LIKE '%#{filter.downcase}%';") + result.map do |peep| + row_to_peep(peep) + end + end end \ No newline at end of file diff --git a/spec/features/filter_peeps_spec.rb b/spec/features/filter_peeps_spec.rb new file mode 100644 index 00000000..7135c2d8 --- /dev/null +++ b/spec/features/filter_peeps_spec.rb @@ -0,0 +1,15 @@ +feature 'Filtering peeps' do + scenario 'user can filter peeps by keyword' do + setup_test_database + + Peeps.create(message: 'Test peep!', entry_date: "2021-03-18") + Peeps.create(message: 'Second test peep!', entry_date: "2021-02-15") + + visit ('/peeps') + fill_in('filter', with: 'peep') + click_button "Filter" + + expect(page).to have_content("Test peep!") + expect(page).to have_content("Second test peep!") + end +end \ No newline at end of file diff --git a/spec/features/reverse_chronological_order_spec.rb b/spec/features/reverse_chronological_order_spec.rb index 5e899160..b5a8a850 100644 --- a/spec/features/reverse_chronological_order_spec.rb +++ b/spec/features/reverse_chronological_order_spec.rb @@ -7,6 +7,8 @@ visit ('/peeps') + click_button "View Newest First" + page.body.index("2021-03-18").should < page.body.index("2021-02-15") end end \ No newline at end of file diff --git a/spec/peeps_spec.rb b/spec/peeps_spec.rb index 9f9e55fc..1938c936 100644 --- a/spec/peeps_spec.rb +++ b/spec/peeps_spec.rb @@ -29,4 +29,16 @@ expect(chitter.message).to eq "Test peep!" expect(chitter.entry_date).to eq "2021-02-15" end +end + +describe '.filter' do + it 'filters peeps by keyword' do + chitter = Peeps.create(message: "Test peep!", entry_date: "2021-02-15") + Peeps.create(message: "Second test peep!", entry_date: "2021-02-13") + Peeps.create(message: "Third say hello!", entry_date: "2021-10-16") + + filtered_results = Peeps.filter("Peep") + expect(filtered_results[0].message).to eq "Test peep!" + expect(filtered_results[1].message).to eq "Second test peep!" + end end \ No newline at end of file diff --git a/views/peeps.erb b/views/peeps.erb index 732eafe8..910b181d 100644 --- a/views/peeps.erb +++ b/views/peeps.erb @@ -11,4 +11,9 @@
+ +
+ + +
\ No newline at end of file diff --git a/views/peeps_filter.erb b/views/peeps_filter.erb new file mode 100644 index 00000000..6910f4a6 --- /dev/null +++ b/views/peeps_filter.erb @@ -0,0 +1,10 @@ +

Welcome to Chitter!

+ +

Here are your filtered results:

+ + <% @filtered_peeps.each do |peep| %> +
+ <%= peep.message %> + <%= peep.entry_date %> +
+ <% end %> \ No newline at end of file