Skip to content

Commit 4f72e51

Browse files
authored
Merge pull request #398 from coderdojo-japan/mod_dojo_event_services_upsert
facebook のイベント履歴収集+登録処理のエラーを解消する
2 parents 8dc30e8 + 7b554dd commit 4f72e51

File tree

8 files changed

+137
-8
lines changed

8 files changed

+137
-8
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ before_script:
2222
- psql -c 'create database coderdojo_jp_test;' -U postgres
2323
script:
2424
- bundle exec rake db:migrate --trace
25+
- bundle exec rake db:seed --trace
2526
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then bundle exec rspec spec; fi
2627
- if [ "$TRAVIS_PULL_REQUEST" != "false" ] && [ "$TRAVIS_PULL_REQUEST_SLUG" = "coderdojo-japan/coderdojo.jp"
2728
]; then bundle exec rspec spec; fi

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ group :development, :test do
6565
gem 'selenium-webdriver'
6666
gem 'capybara'
6767
gem 'rspec-rails', '~> 3.5'
68+
gem 'factory_bot_rails'
6869

6970
gem 'dotenv-rails'
7071
end

Gemfile.lock

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ GEM
9090
ethon (0.11.0)
9191
ffi (>= 1.3.0)
9292
execjs (2.7.0)
93+
factory_bot (5.0.2)
94+
activesupport (>= 4.2.0)
95+
factory_bot_rails (5.0.1)
96+
factory_bot (~> 5.0.0)
97+
railties (>= 4.2.0)
9398
faraday (0.15.4)
9499
multipart-post (>= 1.2, < 3)
95100
faraday_middleware (0.12.2)
@@ -401,6 +406,7 @@ DEPENDENCIES
401406
coffee-rails
402407
dotenv-rails
403408
dumper
409+
factory_bot_rails
404410
faraday
405411
faraday_middleware
406412
flamegraph

lib/tasks/dojo_event_services.rake

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
namespace :dojo_event_services do
22
desc '現在のyamlファイルを元にデータベースを更新します'
33
task upsert: :environment do
4-
result = { inserted: [], updated: [], kept: [], skipped: [] }
4+
result = { inserted: [], updated: [], deleted: [], kept: [], skipped: [] }
5+
reserved_ids = []
56

67
list = YAML.load_file(Rails.root.join('db','dojo_event_services.yaml'))
78
list.each do |des|
89
unless DojoEventService.names.keys.include?(des['name'])
9-
event_names = DojoEventService.names.keys.map {|s| "`#{s}`" }
10+
event_names = DojoEventService.names.keys.map { |s| "`#{s}`" }
1011
result[:skipped] << [des['dojo_id'], "Not used #{event_names.join(' or ')}"]
1112
next
1213
end
@@ -16,8 +17,10 @@ namespace :dojo_event_services do
1617
result[:skipped] << [des['dojo_id'], 'Not found record in `dojos` table']
1718
next
1819
end
19-
20+
# 比較対象は URL を除く dojo_id, name, group_id
21+
url = des.delete('url')
2022
dojo_event_service = dojo.dojo_event_services.find_or_initialize_by(des)
23+
dojo_event_service.url = url
2124
if dojo_event_service.changed?
2225
changes = dojo_event_service.changes
2326
new_record = dojo_event_service.new_record?
@@ -26,17 +29,22 @@ namespace :dojo_event_services do
2629
else
2730
result[:kept] << ["#{des['dojo_id']}:#{dojo_event_service.id}"]
2831
end
32+
reserved_ids << dojo_event_service.id
33+
end
34+
35+
DojoEventService.where.not(id: reserved_ids).find_each do |d|
36+
result[:deleted] << ["#{d.dojo_id}:#{d.id}"]
37+
d.destroy
2938
end
3039

3140
# Dump result
32-
if !result[:inserted].empty? || !result[:updated].empty?
33-
result[:skipped] = result[:skipped].uniq {|s| s.first }
41+
if result[:inserted] || result[:updated]
42+
result[:skipped] = result[:skipped].uniq { |s| s.first }
3443
result.except!(:kept, :skipped) unless ENV.key?('DEBUG')
35-
sorted = result.sort_by {|_, v| v.length }.reverse.to_h
36-
puts
44+
sorted = result.sort_by { |_, v| v.length }.reverse.to_h
3745
sorted.each do |k, v|
3846
puts "#{k.to_s.camelcase}: #{v.length}"
39-
v.each {|x| puts " #{x.join(': ')}"}
47+
v.each { |x| puts " #{x.join(': ')}" }
4048
end
4149
end
4250
end

spec/factories/dojo_event_services.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
require 'factory_bot'
2+
3+
FactoryBot.define do
4+
factory :dojo_event_service do
5+
# dojo_id
6+
name { :connpass }
7+
url { '' }
8+
group_id { '9999' }
9+
end
10+
end

spec/factories/dojos.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
FactoryBot.define do
2+
factory :dojo do
3+
name { 'dojo name' }
4+
email { '' }
5+
description { '' }
6+
prefecture_id { 13 }
7+
end
8+
end
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
require 'rails_helper'
2+
require 'rake'
3+
4+
RSpec.describe 'dojo_event_services' do
5+
before(:all) do
6+
@rake = Rake::Application.new
7+
Rake.application = @rake
8+
Rake.application.rake_require 'tasks/dojo_event_services'
9+
Rake::Task.define_task(:environment)
10+
end
11+
12+
before(:each) do
13+
@rake[task].reenable
14+
end
15+
16+
describe 'dojo_event_services:upsert' do
17+
before :each do
18+
@dojo_1 = create(:dojo, name: 'dojo_1', email: 'mail_1@test', tags: %w(Scratch ラズベリーパイ), description: '月1回開催', prefecture_id: 13)
19+
@dojo_2 = create(:dojo, name: 'dojo_2', email: 'mail_2@test', tags: %w(Scratch), description: '隔週開催', prefecture_id: 13)
20+
@dojo_3 = create(:dojo, name: 'dojo_3', email: 'mail_3@test', tags: %w(Scratch ラズベリーパイ Webサイト), description: '月1回開催', prefecture_id: 13)
21+
22+
create(:dojo_event_service, dojo_id: @dojo_1.id, name: :doorkeeper, group_id: '10001', url: 'https://coder-dojo-11.doorkeeper.jp/')
23+
create(:dojo_event_service, dojo_id: @dojo_1.id, name: :doorkeeper, group_id: '10002', url: 'https://coder-dojo-12.doorkeeper.jp/')
24+
create(:dojo_event_service, dojo_id: @dojo_2.id, name: :connpass, group_id: '20001', url: 'https://coder-dojo-21.connpass.jp/')
25+
end
26+
27+
let(:task) { 'dojo_event_services:upsert' }
28+
29+
it '単純追加' do
30+
allow(YAML).to receive(:load_file).and_return([
31+
{ 'dojo_id' => @dojo_1.id, "name" => 'doorkeeper', 'group_id' => '10001', 'url' => 'https://coder-dojo-11.doorkeeper.jp/' },
32+
{ 'dojo_id' => @dojo_1.id, "name" => 'doorkeeper', 'group_id' => '10002', 'url' => 'https://coder-dojo-12.doorkeeper.jp/' },
33+
{ 'dojo_id' => @dojo_2.id, "name" => 'connpass', 'group_id' => '20001', 'url' => 'https://coder-dojo-21.connpass.jp/' },
34+
{ 'dojo_id' => @dojo_3.id, "name" => 'facebook', 'group_id' => '30001', 'url' => 'https://coder-dojo-31.facebook.com/' }
35+
])
36+
37+
# before
38+
expect(DojoEventService.count).to eq(3)
39+
40+
# exec
41+
expect(@rake[task].invoke).to be_truthy
42+
43+
# after
44+
expect(DojoEventService.count).to eq(4)
45+
new_records = DojoEventService.where(dojo_id: @dojo_3.id, name: :facebook, group_id: '30001')
46+
expect(new_records.count).to eq(1)
47+
expect(new_records.first.url).to eq('https://coder-dojo-31.facebook.com/')
48+
end
49+
50+
it '単純更新' do
51+
allow(YAML).to receive(:load_file).and_return([
52+
{ 'dojo_id' => @dojo_1.id, "name" => 'doorkeeper', 'group_id' => '10001', 'url' => 'https://coder-dojo-11.doorkeeper.jp/' },
53+
{ 'dojo_id' => @dojo_1.id, "name" => 'doorkeeper', 'group_id' => '10002', 'url' => 'https://coder-dojo-12.doorkeeper.jp/' },
54+
{ 'dojo_id' => @dojo_2.id, "name" => 'connpass', 'group_id' => '20001', 'url' => 'https://coder-dojo-21.connpass.jp/zzz' }
55+
])
56+
57+
# before
58+
expect(DojoEventService.count).to eq(3)
59+
60+
# exec
61+
expect(@rake[task].invoke).to be_truthy
62+
63+
# after
64+
expect(DojoEventService.count).to eq(3)
65+
mod_records = DojoEventService.where(dojo_id: @dojo_2.id, name: :connpass, group_id: '20001')
66+
expect(mod_records.count).to eq(1)
67+
expect(mod_records.first.url).to eq('https://coder-dojo-21.connpass.jp/zzz')
68+
end
69+
70+
it '余剰データ削除 & 更新' do
71+
create(:dojo_event_service, dojo_id: @dojo_1.id, name: :doorkeeper, group_id: '10002', url: 'https://coder-dojo-12.doorkeeper.jp/abc')
72+
73+
allow(YAML).to receive(:load_file).and_return([
74+
{ 'dojo_id' => @dojo_1.id, "name" => 'doorkeeper', 'group_id' => '10001', 'url' => 'https://coder-dojo-11.doorkeeper.jp/' },
75+
{ 'dojo_id' => @dojo_1.id, "name" => 'doorkeeper', 'group_id' => '10002', 'url' => 'https://coder-dojo-12.doorkeeper.jp/12345' },
76+
{ 'dojo_id' => @dojo_2.id, "name" => 'connpass', 'group_id' => '20001', 'url' => 'https://coder-dojo-21.connpass.jp/' }
77+
])
78+
79+
# before
80+
expect(DojoEventService.count).to eq(4)
81+
expect(DojoEventService.where(dojo_id: @dojo_1.id, name: :doorkeeper, group_id: '10002').size).to eq(2)
82+
83+
# exec
84+
expect(@rake[task].invoke).to be_truthy
85+
86+
# after
87+
expect(DojoEventService.count).to eq(3)
88+
mod_records = DojoEventService.where(dojo_id: @dojo_1.id, name: :doorkeeper, group_id: '10002')
89+
expect(mod_records.count).to eq(1)
90+
expect(mod_records.first.url).to eq('https://coder-dojo-12.doorkeeper.jp/12345')
91+
end
92+
end
93+
end

spec/rails_helper.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,6 @@
6262
example.skip
6363
end
6464
end
65+
66+
config.include FactoryBot::Syntax::Methods
6567
end

0 commit comments

Comments
 (0)