# Offense count: 63
# Configuration parameters: CountComments.
Metrics/ClassLength:
- Max: 1801
+ Max: 1627
# Offense count: 72
Metrics/CyclomaticComplexity:
--- /dev/null
+class ChangesetCommentsController < ApplicationController
+ before_action :authorize_web, :only => [:index]
+ before_action :set_locale, :only => [:index]
+ before_action :authorize, :only => [:create, :destroy, :restore]
+ before_action :require_moderator, :only => [:destroy, :restore]
+ before_action :require_allow_write_api, :only => [:create, :destroy, :restore]
+ before_action :require_public_data, :only => [:create]
+ before_action :check_api_writable, :only => [:create, :destroy, :restore]
+ before_action :check_api_readable, :except => [:create, :index]
+ before_action(:only => [:index]) { |c| c.check_database_readable(true) }
+ around_action :api_call_handle_error, :except => [:index]
+ around_action :api_call_timeout, :except => [:index]
+ around_action :web_timeout, :only => [:index]
+
+ ##
+ # Add a comment to a changeset
+ def create
+ # Check the arguments are sane
+ raise OSM::APIBadUserInput, "No id was given" unless params[:id]
+ raise OSM::APIBadUserInput, "No text was given" if params[:text].blank?
+
+ # Extract the arguments
+ id = params[:id].to_i
+ body = params[:text]
+
+ # Find the changeset and check it is valid
+ changeset = Changeset.find(id)
+ raise OSM::APIChangesetNotYetClosedError, changeset if changeset.is_open?
+
+ # Add a comment to the changeset
+ comment = changeset.comments.create(:changeset => changeset,
+ :body => body,
+ :author => current_user)
+
+ # Notify current subscribers of the new comment
+ changeset.subscribers.visible.each do |user|
+ Notifier.changeset_comment_notification(comment, user).deliver_later if current_user != user
+ end
+
+ # Add the commenter to the subscribers if necessary
+ changeset.subscribers << current_user unless changeset.subscribers.exists?(current_user.id)
+
+ # Return a copy of the updated changeset
+ render :xml => changeset.to_xml.to_s
+ end
+
+ ##
+ # Sets visible flag on comment to false
+ def destroy
+ # Check the arguments are sane
+ raise OSM::APIBadUserInput, "No id was given" unless params[:id]
+
+ # Extract the arguments
+ id = params[:id].to_i
+
+ # Find the changeset
+ comment = ChangesetComment.find(id)
+
+ # Hide the comment
+ comment.update(:visible => false)
+
+ # Return a copy of the updated changeset
+ render :xml => comment.changeset.to_xml.to_s
+ end
+
+ ##
+ # Sets visible flag on comment to true
+ def restore
+ # Check the arguments are sane
+ raise OSM::APIBadUserInput, "No id was given" unless params[:id]
+
+ # Extract the arguments
+ id = params[:id].to_i
+
+ # Find the changeset
+ comment = ChangesetComment.find(id)
+
+ # Unhide the comment
+ comment.update(:visible => true)
+
+ # Return a copy of the updated changeset
+ render :xml => comment.changeset.to_xml.to_s
+ end
+
+ ##
+ # Get a feed of recent changeset comments
+ def index
+ if params[:id]
+ # Extract the arguments
+ id = params[:id].to_i
+
+ # Find the changeset
+ changeset = Changeset.find(id)
+
+ # Return comments for this changeset only
+ @comments = changeset.comments.includes(:author, :changeset).limit(comments_limit)
+ else
+ # Return comments
+ @comments = ChangesetComment.includes(:author, :changeset).where(:visible => true).order("created_at DESC").limit(comments_limit).preload(:changeset)
+ end
+
+ # Render the result
+ respond_to do |format|
+ format.rss
+ end
+ rescue OSM::APIBadUserInput
+ head :bad_request
+ end
+
+ private
+
+ ##
+ # Get the maximum number of comments to return
+ def comments_limit
+ if params[:limit]
+ if params[:limit].to_i.positive? && params[:limit].to_i <= 10000
+ params[:limit].to_i
+ else
+ raise OSM::APIBadUserInput, "Comments limit must be between 1 and 10000"
+ end
+ else
+ 100
+ end
+ end
+end
require "xml/libxml"
skip_before_action :verify_authenticity_token, :except => [:index]
- before_action :authorize_web, :only => [:index, :feed, :comments_feed]
- before_action :set_locale, :only => [:index, :feed, :comments_feed]
- before_action :authorize, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
- before_action :require_moderator, :only => [:hide_comment, :unhide_comment]
- before_action :require_allow_write_api, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
- before_action :require_public_data, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe]
- before_action :check_api_writable, :only => [:create, :update, :upload, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
- before_action :check_api_readable, :except => [:create, :update, :upload, :download, :query, :index, :feed, :comment, :subscribe, :unsubscribe, :comments_feed]
- before_action(:only => [:index, :feed, :comments_feed]) { |c| c.check_database_readable(true) }
- around_action :api_call_handle_error, :except => [:index, :feed, :comments_feed]
- around_action :api_call_timeout, :except => [:index, :feed, :comments_feed, :upload]
- around_action :web_timeout, :only => [:index, :feed, :comments_feed]
+ before_action :authorize_web, :only => [:index, :feed]
+ before_action :set_locale, :only => [:index, :feed]
+ before_action :authorize, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
+ before_action :require_allow_write_api, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
+ before_action :require_public_data, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
+ before_action :check_api_writable, :only => [:create, :update, :upload, :subscribe, :unsubscribe]
+ before_action :check_api_readable, :except => [:create, :update, :upload, :download, :query, :index, :feed, :subscribe, :unsubscribe]
+ before_action(:only => [:index, :feed]) { |c| c.check_database_readable(true) }
+ around_action :api_call_handle_error, :except => [:index, :feed]
+ around_action :api_call_timeout, :except => [:index, :feed, :upload]
+ around_action :web_timeout, :only => [:index, :feed]
# Helper methods for checking consistency
include ConsistencyValidations
index
end
- ##
- # Add a comment to a changeset
- def comment
- # Check the arguments are sane
- raise OSM::APIBadUserInput, "No id was given" unless params[:id]
- raise OSM::APIBadUserInput, "No text was given" if params[:text].blank?
-
- # Extract the arguments
- id = params[:id].to_i
- body = params[:text]
-
- # Find the changeset and check it is valid
- changeset = Changeset.find(id)
- raise OSM::APIChangesetNotYetClosedError, changeset if changeset.is_open?
-
- # Add a comment to the changeset
- comment = changeset.comments.create(:changeset => changeset,
- :body => body,
- :author => current_user)
-
- # Notify current subscribers of the new comment
- changeset.subscribers.visible.each do |user|
- Notifier.changeset_comment_notification(comment, user).deliver_later if current_user != user
- end
-
- # Add the commenter to the subscribers if necessary
- changeset.subscribers << current_user unless changeset.subscribers.exists?(current_user.id)
-
- # Return a copy of the updated changeset
- render :xml => changeset.to_xml.to_s
- end
-
##
# Adds a subscriber to the changeset
def subscribe
render :xml => changeset.to_xml.to_s
end
- ##
- # Sets visible flag on comment to false
- def hide_comment
- # Check the arguments are sane
- raise OSM::APIBadUserInput, "No id was given" unless params[:id]
-
- # Extract the arguments
- id = params[:id].to_i
-
- # Find the changeset
- comment = ChangesetComment.find(id)
-
- # Hide the comment
- comment.update(:visible => false)
-
- # Return a copy of the updated changeset
- render :xml => comment.changeset.to_xml.to_s
- end
-
- ##
- # Sets visible flag on comment to true
- def unhide_comment
- # Check the arguments are sane
- raise OSM::APIBadUserInput, "No id was given" unless params[:id]
-
- # Extract the arguments
- id = params[:id].to_i
-
- # Find the changeset
- comment = ChangesetComment.find(id)
-
- # Unhide the comment
- comment.update(:visible => true)
-
- # Return a copy of the updated changeset
- render :xml => comment.changeset.to_xml.to_s
- end
-
- ##
- # Get a feed of recent changeset comments
- def comments_feed
- if params[:id]
- # Extract the arguments
- id = params[:id].to_i
-
- # Find the changeset
- changeset = Changeset.find(id)
-
- # Return comments for this changeset only
- @comments = changeset.comments.includes(:author, :changeset).limit(comments_limit)
- else
- # Return comments
- @comments = ChangesetComment.includes(:author, :changeset).where(:visible => true).order("created_at DESC").limit(comments_limit).preload(:changeset)
- end
-
- # Render the result
- respond_to do |format|
- format.rss
- end
- rescue OSM::APIBadUserInput
- head :bad_request
- end
-
private
#------------------------------------------------------------
def conditions_nonempty(changesets)
changesets.where("num_changes > 0")
end
-
- ##
- # Get the maximum number of comments to return
- def comments_limit
- if params[:limit]
- if params[:limit].to_i.positive? && params[:limit].to_i <= 10000
- params[:limit].to_i
- else
- raise OSM::APIBadUserInput, "Comments limit must be between 1 and 10000"
- end
- else
- 100
- end
- end
end
-<h2><%= t "changeset.rss.comment", :author => comment.author.display_name,
+<h2><%= t ".comment", :author => comment.author.display_name,
:changeset_id => comment.changeset.id.to_s %></h2>
<div class="changeset-comment" style="margin-top: 5px">
- <div class="changeset-comment-description" style="font-size: smaller; color: #999999"><%= t "changeset.rss.commented_at_by_html", :when => friendly_date(comment.created_at), :user => comment.author.display_name %></div>
+ <div class="changeset-comment-description" style="font-size: smaller; color: #999999"><%= t ".commented_at_by_html", :when => friendly_date(comment.created_at), :user => comment.author.display_name %></div>
<div class="changeset-comment-text"><%= comment.body %></div>
</div>
comments.each do |comment|
xml.item do
- xml.title t("changeset.rss.comment", :author => comment.author.display_name, :changeset_id => comment.changeset.id.to_s)
+ xml.title t(".comment", :author => comment.author.display_name, :changeset_id => comment.changeset.id.to_s)
xml.link url_for(:controller => "browse", :action => "changeset", :id => comment.changeset.id, :anchor => "c#{comment.id}", :only_path => false)
xml.guid url_for(:controller => "browse", :action => "changeset", :id => comment.changeset.id, :anchor => "c#{comment.id}", :only_path => false)
"xmlns:dc" => "http://purl.org/dc/elements/1.1/") do
xml.channel do
if @changeset
- xml.title t("changeset.rss.title_particular", :changeset_id => @changeset.id)
+ xml.title t(".title_particular", :changeset_id => @changeset.id)
else
- xml.title t("changeset.rss.title_all")
+ xml.title t(".title_all")
end
xml.link url_for(:controller => "site", :action => "index", :only_path => false)
--- /dev/null
+atom_feed(:language => I18n.locale, :schema_date => 2009,
+ :id => url_for(params.merge(:only_path => false)),
+ :root_url => url_for(params.merge(:only_path => false, :format => nil)),
+ "xmlns:georss" => "http://www.georss.org/georss") do |feed|
+ feed.title @title
+
+ feed.subtitle :type => "xhtml" do |xhtml|
+ xhtml.p do |p|
+ p << t(".sorry")
+ end
+ end
+end
--- /dev/null
+<p><%= t '.sorry' %></p>
هذا التنقيح قبل تدميره.
flash: التنقيح تم تدميره.
error: حدث خطأ في تدمير هذا التنقيح.
+ validations:
+ leading_whitespace: لديه مسافة بيضاء أمامية
+ trailing_whitespace: لديه مسافة بيضاء زائدة
+ invalid_characters: يحتوي على أحرف غير صالحة
+ url_characters: يحتوي على أحرف يو آر إل خاصة (%{characters})
...
# Author: Bodhisattwa
# Author: Ehsanulhb
# Author: Elias Ahmmad
+# Author: Gronthokeet
# Author: Kayser Ahmad
# Author: Nasir8891
# Author: R4bb1
edit_link: এই ভুক্তি সম্পাদনা করুন
hide_link: এই ভুক্তি লুকান
confirm: নিশ্চিত করুন
+ report: এই ভুক্তির বিরুদ্ধে অভিযোগ করুন
diary_comment:
comment_from: '%{comment_created_at}-এ %{link_user} কর্তৃক মন্তব্য'
hide_link: এই মন্তব্যটি লুকান
confirm: নিশ্চিত করুন
+ report: এই মন্তব্যের বিরুদ্ধে অভিযোগ করুন
location:
location: 'অবস্থান:'
view: দেখাও
aerodrome: বিমানশালা
apron: বর্হিবাস
gate: প্রবেশপথ
+ hangar: বিমান রাখার স্থান
helipad: হেলিপ্যাড
parking_position: পার্কিং-এর স্থান
runway: রানওয়ে
office: দপ্তর
parking: পার্কিং
parking_entrance: পার্কিং প্রবেশপথ
+ parking_space: গাড়ি রাখার স্থান
pharmacy: ঔষধালয়
place_of_worship: উপাসনালয়
police: পুলিশ
youth_centre: যুব কেন্দ্র
boundary:
administrative: প্রশাসনিক সীমানা
+ census: আদমশুমারি এলাকা
national_park: জাতীয় উদ্যান
protected_area: সুরক্ষিত এলাকা
bridge:
"yes": কারুকাজ দোকান
emergency:
ambulance_station: রুগ্নবাহিকা স্টেশন
+ defibrillator: ডিফাইব্রিলেটর
landing_site: জরুরি অবতরণ ক্ষেত্র
phone: জরুরি ফোন
+ water_tank: জরুরি পানির ট্যাংক
"yes": জরুরী
highway:
abandoned: পরিত্যক্ত মহাসড়ক
emergency_access_point: জরুরি প্রবেশ স্থল
footway: ফুটপাথ
milestone: মাইলফলক
+ motorway: মোটরপথ
path: পাথ
pedestrian: পাদচারী পথ
platform: প্লাটফর্ম
service: পার্শ্ব সড়ক
speed_camera: গতিমাপক ক্যামেরা
steps: ধাপ
- stop: থাà¦\95ার চিহ্ন
+ stop: থামার চিহ্ন
street_lamp: রাস্তার বাতি
tertiary: প্রশাখা সড়ক
tertiary_link: প্রশাখা সড়ক
track: নির্ধারিত পথ
traffic_signals: ট্রাফিক সংকেত
+ trail: চলাচলের নিশানা
trunk: মূল সড়ক
trunk_link: মূল সড়ক
unclassified: অশ্রেণীকৃত সড়ক
battlefield: যুদ্ধক্ষেত্র
boundary_stone: সীমানাজ্ঞাপক পাথর
building: ঐতিহাসিক ভবন
+ bunker: আপদকালীন ভূগর্ভস্থ আশ্রয়স্থল
castle: কেল্লা
church: গির্জা
city_gate: নগর দ্বার
stone: প্রস্তর
tomb: সমাধি
tower: মিনার
+ wreck: ভগ্নাবশেষ
+ "yes": ঐতিহাসিক স্থান
junction:
"yes": জংশন
landuse:
"yes": ব্যবহার্য ভূমি
leisure:
beach_resort: সৈকতীয় রিসোর্ট
+ bird_hide: পক্ষীদর্শন স্থান
common: সাধারণ ভূমি
dog_park: কুকুর উদ্যান
fishing: মৎস শিকারের এলাকা
+ fitness_centre: শরীরচর্চা কেন্দ্র
garden: বাগান
golf_course: গল্ফ মাঠ
+ horse_riding: অশ্বারোহণ
+ miniature_golf: ক্ষুদ্রাকৃতির গল্ফ
nature_reserve: সংরক্ষিত প্রাকৃতিক ভূমি
park: উদ্যান
+ pitch: খেলার পিচ
playground: খেলার মাঠ
recreation_ground: চিত্তবিনোদন মাঠ
resort: রিসোর্ট
+ sauna: বাষ্পস্নান
+ slipway: নৌকা ছাড়ার পথ
sports_centre: ক্রীড়া কেন্দ্র
stadium: ক্রিড়াঙ্গন
swimming_pool: সুইমিং পুল
water_park: বারি উদ্যান
"yes": অবসর
man_made:
+ adit: খনি সুড়ঙ্গ
+ beehive: মৌমাছির কৃত্রিম বাসা
+ breakwater: বেড়িবাঁধ
bridge: সেতু
+ bunker_silo: গাড়ি ভর্তি ও খালি করার জায়গা
+ chimney: চিম্নী
+ crane: কপিকল
+ dyke: বাঁধ
+ flagpole: সতর্কীকরণ পতাকা
lighthouse: বাতিঘর
+ mast: টাওয়ার
mine: খনি
+ monitoring_station: আবহাওয়া পর্যবেক্ষ্ণ কেন্দ্র
+ petroleum_well: তেলের খনি
pipeline: পাইপলাইন
+ silo: সিলো
+ surveillance: নজরদারী ক্যামেরা
tower: টাওয়ার
+ water_tower: পানির ট্যাংক
+ water_well: পানির কূপ
works: কারখানা
"yes": মনুষ্য-নির্মিত
military:
rest_of_world: অন্যান্য দেশসমূহ
show:
my edits: আমার সম্পাদনা
+ my messages: আমার বার্তাসমূহ
my profile: আমার প্রোফাইল
my settings: আমার সেটিংস
+ my comments: আমার মন্তব্যস্মূহ
oauth settings: OAuth সেটিংস
+ send message: বার্তা পাঠান
+ diary: দিনলিপি
edits: সম্পাদনাসমূহ
+ remove as friend: আনফ্রেন্ড
+ add as friend: বন্ধু যোগ করুন
+ mapper since: থেকে ম্যাপ বানাচ্ছেন
+ ct undecided: সিদ্ধান্তহীন
+ ct declined: বাতিলকৃত
email address: 'ই-মেইল ঠিকানা:'
description: বিবরণ
+ user location: ব্যবহারকারীর অবস্থান
settings_link_text: সেটিংস
my friends: আমার বন্ধুগণ
no friends: আপনি বন্ধুতালিকায় কাউকে যুক্ত করেননি।
+ nearby users: কাছাকাছি অন্য ব্যবহারকারী
block_history: সক্রিয় বাধাসমূহ
moderator_history: প্রদত্ত বাধাগুলি
comments: মন্তব্যসমূহ
reopened_by_anonymous: Adweredekaet gant un den dianv <abbr title='%{exact_time}'>%{when}
zo</abbr>
hidden_by: Kuzhet gant %{user} <abbr title='%{exact_time}'>%{when} zo</abbr>
+ report: Disklêriañ an notenn-mañ
query:
title: Arc'hweladurioù enklask
introduction: Klikit war ar gartenn evit kavout arc'hweladurioù e-kichen.
update:
new_report: Enrollet mat eo bet ho tanevell
successful_update: Hizivaet mat eo bet ho tanevell
+ provide_details: Reiñ ar munudoù goulennet
show:
title: '%{status} Kudenn #%{issue_id}'
reports:
issue_comments:
create:
comment_created: Krouet mat eo bet hoc'h evezhiadenn.
+ reports:
+ new:
+ title_html: Danevell %{link}
+ missing_params: N'haller ket krouiñ un danevell nevez
+ details: Roit muioc'h a vunudoù diwar-benn ar gudenn (dre ret)
+ disclaimer:
+ not_just_mistake: Sur oc'h n'eo ket ar gudenn-se ur fazi hepken.
+ categories:
+ diary_entry:
+ other_label: All
+ diary_comment:
+ other_label: All
+ user:
+ other_label: All
+ note:
+ other_label: All
+ create:
+ successful_report: Enrollet mat eo bet ho tanevell
+ provide_details: Roit ar munudoù goulennet mar plij
layouts:
logo:
alt_text: Logo OpenStreetMap
edit: Aozañ
history: Istor
export: Ezporzhiañ
+ issues: Kudennoù
data: Roadennoù
export_data: Ezporzhiañ roadennoù
gps_traces: Roudoù GPS
tags_help: bevennet gant virgulennoù
visibility: 'Gwelusted :'
visibility_help: Petra a dalvez ?
+ visibility_help_url: https://wiki.openstreetmap.org/wiki/FR:Visibilit%C3%A9_des_traces_GPS
upload_button: Enporzhiañ
help: Skoazell
+ help_url: https://wiki.openstreetmap.org/wiki/FR:Upload
create:
upload_trace: Kas ar roud GPS
trace_uploaded: Kaset eo bet ho restr GPX hag emañ en gortoz a vezañ ensoc'het
delete_trace: Dilemel ar roudenn-mañ
trace_not_found: N'eo ket bet kavet ar roud !
visibility: 'Gwelusted :'
+ confirm_delete: Diverkañ ar roudenn-mañ
trace_paging_nav:
- showing_page: Page %{page}
+ showing_page: Pajenn %{page}
older: ↓Roudoù kozh
newer: ↓Roudoù nevez
trace:
map: kartenn
index:
public_traces: Roudoù GPS foran
+ my_traces: Ma roudennoù GPS
public_traces_from: Roudoù GPS foran gant %{user}
description: Furchal ar roud GPS pellgarget nevez zo
tagged_with: ' balizennet gant %{tags}'
ar <abajenn wiki>href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2i</a>.
upload_trace: Kas ur roud
see_all_traces: Gwelet an holl roudoù
+ see_my_traces: Gwelet ma roudennoù
delete:
scheduled_for_deletion: Roudenn da vezañ dilamet
make_public:
require_cookies:
cookies_needed: Diweredekaet eo an toupinoù ganeoc'h war a seblant - gweredekait
an toupinoù en ho merdeer a-raok mont pelloc'h, mar plij.
+ require_admin:
+ not_an_admin: Ret eo deoc'h bezañ merour evit kas an ober-mañ da benn.
require_moderator:
not_a_moderator: Ret eo deoc'h bezañ habaskaer evit kas an ober-mañ da benn.
+ require_moderator_or_admin:
+ not_a_moderator_or_admin: Ret eo deoc'h bezañ habaskaer pe merour evit kas an
+ ober-mañ da benn.
setup_user_auth:
blocked_zero_hour: Ur gemennadenn vallus zo war lec'hienn OpenStreetMap evidoc'h.
Ret eo deoc'h lenn ar gemennadenn-se a-raok gallout enrollañ ho kemmoù.
consider_pd: Ouzhpenn an asant amañ a-us, ez anavezan emañ ma zegasadennoù en
domani foran
consider_pd_why: petra eo se ?
+ consider_pd_why_url: https://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain
guidance: 'Titouroù da skoazellañ kompren an termenoù-mañ : a <a href="%{summary}">diverradenn
lennus gant mab-den</a> hag un nebeud <a href="%{translations}">troidigezhioù
anfurmel</a>'
agree: Mat eo din
+ declined: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
decline: Nac'h
you need to accept or decline: Lennit da gentañ Termenoù ar berzhidi nevez ha
goude-se nac'hit pe asantit evit gallout kenderc'hel.
if set location: Lakait ho lec'h-annez war ar bajenn %{settings_link} da welet
an implijerien war-dro.
settings_link_text: arventennoù
+ my friends: Ma mignoned
no friends: N'hoc'h eus ouzhpennet mignon ebet c'hoazh.
km away: war-hed %{count} km
m away: war-hed %{count} m
review link text: Heuilhit al liamm-mañ evel ma karot evit sellet ouzh diferadennoù
nevez ar c'henlabourer hag asantiñ dezho.
agreed_with_pd: Disklêriet hoc'h eus ivez emañ ho tegasadennoù en domani foran.
+ link: https://www.osmfoundation.org/wiki/License/Contributor_Terms
link text: Petra eo se ?
profile description: 'Deskrivadur ar profil :'
preferred languages: 'Yezhoù gwellañ karet :'
distance: Hed
errors:
no_route: Ne c'haller ket kavout un hent etre an daou lec'h-mañ.
- no_place: Ho tigarez, ne c'haller ket kavout al lec'h-mañ.
+ no_place: 'Ho tigarez, ne c''haller ket kavout al lec''h-mañ : %{place}.'
instructions:
continue_without_exit: Kenderc'hel war%{name}
slight_right_without_exit: Troit un tammig a-zehoù war %{name}
offramp_right_with_name: Kemer ar vretell dehou %{name}
+ offramp_right_with_directions: Kemer ar vretell dehou war-zu %{directions}
+ offramp_right_with_name_directions: Kemer ar vretell dehou war %{name}, war-zu
+ %{directions}
onramp_right_without_exit: Troit a-zehoù war ar bretell war %{name}
+ onramp_right_with_directions: Troit a-zehoù war ar vretell war-zu %{directions}
+ onramp_right_with_name_directions: Troit a-zehou war ar vretell war %{name},
+ war-zu %{directions}
+ onramp_right_without_directions: Treiñ a-zehou war ar vretell
+ onramp_right: Troit a gleiz war ar vretell
endofroad_right_without_exit: E penn an hent, troit a-zezhoù war %{name}
merge_right_without_exit: Mont a-zehoù war %{name}
fork_right_without_exit: Er forc'h-hent, troit a-zehoù war %{name}
uturn_without_exit: Grit hanter dro war %{name}
sharp_left_without_exit: Troit prim a-gleiz war %{name}
turn_left_without_exit: Treiñ a-gleiz war %{name}
+ offramp_left: Troit a gleiz war ar vretell
offramp_left_with_name: Kemer ar vretell gleiz betek %{name}
+ offramp_left_with_directions: Troit a-gleiz war ar vretell war-zu %{directions}
+ offramp_left_with_name_directions: Troit a-gleiz war ar vretell war %{name},
+ war-zu %{directions}
onramp_left_without_exit: Troit a-gleiz war ar vretell war %{name}
+ onramp_left_with_directions: Troit a-gleiz war ar vretell war-zu %{directions}
+ onramp_left_with_name_directions: Troit a-gleiz war ar vretell war %{name},
+ war-zu %{directions}
+ onramp_left_without_directions: Troit a-gleiz war ar vretell
+ onramp_left: Troit a-gleiz war ar vretell
endofroad_left_without_exit: E penn an hent, troit a-gleiz war %{name}
merge_left_without_exit: Mont a-gleiz war %{name}
fork_left_without_exit: Er forc'h-hent, troit a-gleiz war %{name}
roundabout_without_exit: Er c'hroashent-tro, troit %{name}
leave_roundabout_without_exit: Kuitaat ar c'roashent-tro - %{name}
stay_roundabout_without_exit: Chom war ar c'hroashent-tro -%{name}
- start_without_exit: Loc'hañ e dibenn %{name}
+ start_without_exit: Loc'hañ war %{name}
destination_without_exit: Tizhout al lec'h
against_oneway_without_exit: Mont gant ar straed untu war %{name}
end_oneway_without_exit: Dibenn an tremen untun war %{name}
reported_user: Rapporteret bruger
not_updated: Ikke opdateret
search: Søg
+ search_guidance: 'Søgning blandt sager:'
user_not_found: Brugeren findes ikke
status: Status
reports: Rapporter
der tilhører denne omarbejdelse, før du sletter den.
flash: Omarbejdelse slettet.
error: Der opstod en fejl under sletning af denne omarbejdelse.
+ validations:
+ invalid_characters: indholder ugyldige tegn
...
zugehörigen Versionen zurück, bevor du die Redaction löschst.
flash: Redaction wurde gelöscht.
error: Beim Löschen dieser Redaction ist ein Fehler aufgetreten.
+ validations:
+ leading_whitespace: hat anführendes Leerzeichen
+ trailing_whitespace: hat anhängendes Leerzeichen
+ invalid_characters: enthält ungültige Zeichen
+ url_characters: enthält besondere URL-Zeichen (%{characters})
...
σε αυτή τη σύνταξη πριν την καταστρέψετε.
flash: Η παράληψη καταστραφεί.
error: Εμφανίστηκε ένα σφάλμα που καταστρέφει αυτή τη σύνταξη.
+ validations:
+ invalid_characters: περιέχει μη έγκυρους χαρακτήρες
...
load_more: "Load more"
timeout:
sorry: "Sorry, the list of changesets you requested took too long to retrieve."
- rss:
- title_all: OpenStreetMap changeset discussion
- title_particular: "OpenStreetMap changeset #%{changeset_id} discussion"
+ changeset_comments:
+ comment:
comment: "New comment on changeset #%{changeset_id} by %{author}"
- commented_at_html: "Updated %{when} ago"
commented_at_by_html: "Updated %{when} ago by %{user}"
- full: Full discussion
+ comments:
+ comment: "New comment on changeset #%{changeset_id} by %{author}"
+ index:
+ title_all: OpenStreetMap changeset discussion
+ title_particular: "OpenStreetMap changeset #%{changeset_id} discussion"
+ timeout:
+ sorry: "Sorry, the list of changeset comments you requested took too long to retrieve."
diary_entries:
new:
title: New Diary Entry
monitoring_station: Observada stacio
petroleum_well: Naftoŝakto
pier: Marponto
- pipeline: Tubolinio
+ pipeline: Konduktubo
silo: Tur-stokejo
storage_tank: Rezervujo
surveillance: Supergardo
previas pertenecientes a esta redacción antes de destruirla.
flash: Redacción destruida.
error: Se produjo un error al destruir esta redacción
+ validations:
+ invalid_characters: contiene caracteres no válidos
...
english_link: اصل انگلیسی
native:
title: درباره این صفحه
- text: شما در حال مشاهده ویرایش انگلیسی قانون کپیرایت هستید. برای دیدن %{native_link} می
- توانید به عقب باز گردید یا خواندن متن کپی رایت و %{mapping_link} را متوقف
+ text: شما در حال مشاهدهٔ ویرایش انگلیسی قانون کپیرایت هستید. برای دیدن %{native_link}
+ میتوانید به عقب بازگردید یا مطالعه دربارهٔ کپیرایت را رها و %{mapping_link}
کنید.
native_link: نسخهٔ فارسی
mapping_link: شروع به نقشهکشی
owner: 'مالک:'
description: 'شرح:'
tags: 'برچسبها:'
- none: هیچ کدام
+ none: هیچ
edit_trace: ویرایش این رد
delete_trace: حذف این رد
trace_not_found: رد یافت نشد!
appartenant à ce masquage avant de le supprimer.
flash: Masquage supprimé.
error: Une erreur est survenue lors de la suppression de ce masquage.
+ validations:
+ leading_whitespace: a des espaces au début
+ trailing_whitespace: a des espaces à la fin
+ invalid_characters: contient des caractères non valides
+ url_characters: contient des caractères d’URL spéciaux (%{characters})
...
# Author: Tacsipacsi
# Author: Uno20001
# Author: Urbalazs
+# Author: Zizzerus
---
hu:
time:
mielőtt törlöd ezt a módosítást.
flash: Módosítás törölve.
error: Hiba történt a művelet végrehajtása során.
+ validations:
+ invalid_characters: érvénytelen karaktereket tartalmaz
...
other: File GPX con %{count} punti da %{user}
description_without_count: File GPX da %{user}
application:
+ permission_denied: Non disponi dei permessi necessari per eseguire questa azione
require_cookies:
cookies_needed: Pare che tu abbia i cookie non abilitati - abilita i cookie
nel tuo browser prima di continuare.
appartenenti a questa revisione prima di eliminarla.
flash: Revisione eliminata.
error: Si è verificato un errore durante l'eliminazione.
+ validations:
+ invalid_characters: contiene caratteri non validi
+ url_characters: contiene caratteri URL speciali (%{characters})
...
not_empty: 교정이 비어 있지 않습니다. 파기하기 전에 이 교정에 속하는 모든 판을 교정 취소하세요.
flash: 교정을 파기했습니다.
error: 이 교정을 파기하는 중에 오류가 발생했습니다.
+ validations:
+ invalid_characters: 유효하지 않은 문자가 포함됨
+ url_characters: 특정 URL 문자 포함 (%{characters})
...
на оваа редакција пред да ја поништите.
flash: Редакцијата е поништена.
error: Се појави грешка при поништувањето на редакцијата.
+ validations:
+ leading_whitespace: има почетна белина
+ trailing_whitespace: има завршна белина
+ invalid_characters: содржи неважечки знаци
+ url_characters: содржи посебни знаци во URL-то (%{characters})
...
site:
export:
title: Експортаре
+ traces:
+ edit:
+ save_button: Апликаря модификэрилор
users:
login:
title: Презентаци-вэ
openid:
link text: че май есте ши аста?
public editing:
+ heading: 'Редактаря публикэ:'
enabled link text: че май есте ши аста?
contributor terms:
link text: че май есте ши аста?
+ profile description: 'Дескриеря профилулуй:'
+ preferred languages: 'Лимбиле преферате:'
preferred editor: 'Редактор преферат:'
+ image: 'Имаӂине:'
gravatar:
+ gravatar: Фолосиря Граватарулуй
link text: че май есте ши аста?
+ new image: Адэугаря имаӂиний
+ home location: 'Локул де решединцэ:'
+ latitude: 'Латитудине:'
+ longitude: 'Лонӂитудине:'
+ save changes button: Апликаря модификэрилор
...
"yes": Ambachtswinkel
emergency:
ambulance_station: Ambulancepost
+ assembly_point: Verzamelplaats
defibrillator: Defibrillator
landing_site: Noodlandingsbaan
phone: Noodtelefoon
stationery: Kantoorartikelenwinkel
supermarket: Supermarkt
tailor: Kleermaker
+ ticket: Ticketwinkel
tobacco: Tabakswinkel
toys: Speelgoedwinkel
travel_agency: Reisbureau
map: kaart
index:
public_traces: Openbare GPS-traces
+ my_traces: Mijn GPS-tracks
public_traces_from: Openbare GPS-traces van %{user}
description: Recente GPS-trackuploads bekijken
tagged_with: ' gelabeld met %{tags}'
trace</a> of kom meer te weten over GPS tracen op de <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>wikipagina</a>.
upload_trace: Trace uploaden
see_all_traces: Alle traces bekijken
+ see_my_traces: Weergeef mijn tracks
delete:
scheduled_for_deletion: Trace staat op de lijst voor verwijdering
make_public:
betrokken zijn voordat u die vernietigt.
flash: De redigering is vernietigd.
error: Er is een fout opgetreden tijdens het verwijderen van de redigering.
+ validations:
+ invalid_characters: bevat ongeldige karakters
+ url_characters: bevat speciale URL karakters (%{characters})
...
a esta anulação antes de destruí-la.
flash: Redação destruída.
error: Houve um erro ao destruir esta anulação.
+ validations:
+ leading_whitespace: tem espaço em branco líder
+ trailing_whitespace: tem espaço em branco à direita
+ invalid_characters: contém caracteres inválidos
+ url_characters: contém caracteres de URL especiais (%{characters})
...
as versões pertencentes a esta supressão antes de a eliminar
flash: Supressão eliminada.
error: Ocorreu um erro ao tentar eliminar esta supressão.
+ validations:
+ leading_whitespace: tem espaços no início
+ trailing_whitespace: tem espaços no fim
+ invalid_characters: contém caracteres inválidos
+ url_characters: contém caracteres especiais dos URL (%{characters})
...
# Author: Irus
# Author: Kaganer
# Author: Komzpa
+# Author: Link2xt
# Author: Lockal
# Author: Macofe
# Author: Mavl
other: GPX-файл с %{count} точками от %{user}
description_without_count: GPX-файл от %{user}
application:
+ permission_denied: У вас нет прав для выполнения этого действия
require_cookies:
cookies_needed: Похоже, что у вас выключены куки. Пожалуйста, включите куки
в вашем браузере, прежде чем продолжить.
принадлежащих к этому исправлению перед удалением.
flash: Исправление уничтожено.
error: Произошла ошибка при уничтожении этого исправления.
+ validations:
+ invalid_characters: содержит недопустимые символы
+ url_characters: содержит специальные символы в URL (%{characters})
...
other: '%{user} tarafından %{count} noktalı GPX dosyası'
description_without_count: '%{user} tarafından GPX dosyası'
application:
+ permission_denied: Bu eyleme erişme izniniz yok
require_cookies:
cookies_needed: Çerezleri devre dışı bırakmış görünüyorsunuz - devam etmeden
önce lütfen tarayıcınızda çerezleri etkinleştirin.
against_oneway_without_exit: '%{name}X üzerinde tek yönlü git'
end_oneway_without_exit: '%{name} için tek yönün sonu'
roundabout_with_exit: Dönel kavşakta %{exit}. çıkışı kullanarak %{name} üzerine
+ roundabout_with_exit_ordinal: Dönel kavşakta %{exit} çıkışı kullanarak %{name}
+ üzerine
+ exit_roundabout: '%{name} giden kavşaktan çıkın'
unnamed: adsız yol
courtesy: Yolculuğun izniyle %{link}x
exit_counts:
sürümlerini tekrar düzenleyin.
flash: Redaksiyon kaldırıldı.
error: Bu redaksiyon kaldırılırken bir hata oluştu.
+ validations:
+ invalid_characters: geçersiz karakterler içeriyor
+ url_characters: özel URL karakterleri içerir (%{characters})
...
not_empty: 修訂尚未清空。請在銷毀前清除所有此修訂的版本。
flash: 修訂已銷毀。
error: 銷毀此修訂時發生錯誤。
+ validations:
+ leading_whitespace: 前頭有空白
+ trailing_whitespace: 後端有空白
+ invalid_characters: 包含無效字元
+ url_characters: 包含特定 URL 字元(%{characters})
...
put "changeset/:id" => "changeset#update", :id => /\d+/
put "changeset/:id/close" => "changeset#close", :id => /\d+/
get "changesets" => "changeset#query"
- post "changeset/:id/comment" => "changeset#comment", :as => :changeset_comment, :id => /\d+/
- post "changeset/comment/:id/hide" => "changeset#hide_comment", :as => :changeset_comment_hide, :id => /\d+/
- post "changeset/comment/:id/unhide" => "changeset#unhide_comment", :as => :changeset_comment_unhide, :id => /\d+/
+ post "changeset/:id/comment" => "changeset_comments#create", :as => :changeset_comment, :id => /\d+/
+ post "changeset/comment/:id/hide" => "changeset_comments#destroy", :as => :changeset_comment_hide, :id => /\d+/
+ post "changeset/comment/:id/unhide" => "changeset_comments#restore", :as => :changeset_comment_unhide, :id => /\d+/
put "node/create" => "nodes#create"
get "node/:id/ways" => "ways#ways_for_node", :id => /\d+/
get "/relation/:id" => "browse#relation", :id => /\d+/, :as => :relation
get "/relation/:id/history" => "browse#relation_history", :id => /\d+/
get "/changeset/:id" => "browse#changeset", :as => :changeset, :id => /\d+/
- get "/changeset/:id/comments/feed" => "changeset#comments_feed", :as => :changeset_comments_feed, :id => /\d*/, :defaults => { :format => "rss" }
+ get "/changeset/:id/comments/feed" => "changeset_comments#index", :as => :changeset_comments_feed, :id => /\d*/, :defaults => { :format => "rss" }
get "/note/:id" => "browse#note", :id => /\d+/, :as => "browse_note"
get "/note/new" => "browse#new_note"
get "/user/:display_name/history" => "changeset#index"
get "/about" => "site#about"
get "/history" => "changeset#index"
get "/history/feed" => "changeset#feed", :defaults => { :format => :atom }
- get "/history/comments/feed" => "changeset#comments_feed", :as => :changesets_comments_feed, :defaults => { :format => "rss" }
+ get "/history/comments/feed" => "changeset_comments#index", :as => :changesets_comments_feed, :defaults => { :format => "rss" }
get "/export" => "site#export"
match "/login" => "users#login", :via => [:get, :post]
match "/logout" => "users#logout", :via => [:get, :post]
require "test_helper"
-require "api_controller"
class ApiControllerTest < ActionController::TestCase
def setup
require "test_helper"
-require "browse_controller"
class BrowseControllerTest < ActionController::TestCase
##
--- /dev/null
+require "test_helper"
+
+class ChangesetCommentsControllerTest < ActionController::TestCase
+ ##
+ # test all routes which lead to this controller
+ def test_routes
+ assert_routing(
+ { :path => "/api/0.6/changeset/1/comment", :method => :post },
+ { :controller => "changeset_comments", :action => "create", :id => "1" }
+ )
+ assert_routing(
+ { :path => "/api/0.6/changeset/comment/1/hide", :method => :post },
+ { :controller => "changeset_comments", :action => "destroy", :id => "1" }
+ )
+ assert_routing(
+ { :path => "/api/0.6/changeset/comment/1/unhide", :method => :post },
+ { :controller => "changeset_comments", :action => "restore", :id => "1" }
+ )
+ assert_routing(
+ { :path => "/changeset/1/comments/feed", :method => :get },
+ { :controller => "changeset_comments", :action => "index", :id => "1", :format => "rss" }
+ )
+ assert_routing(
+ { :path => "/history/comments/feed", :method => :get },
+ { :controller => "changeset_comments", :action => "index", :format => "rss" }
+ )
+ end
+
+ ##
+ # create comment success
+ def test_create_comment_success
+ user = create(:user)
+ user2 = create(:user)
+ private_user = create(:user, :data_public => false)
+ suspended_user = create(:user, :suspended)
+ deleted_user = create(:user, :deleted)
+ private_user_closed_changeset = create(:changeset, :closed, :user => private_user)
+
+ basic_authorization user.email, "test"
+
+ assert_difference "ChangesetComment.count", 1 do
+ assert_no_difference "ActionMailer::Base.deliveries.size" do
+ perform_enqueued_jobs do
+ post :create, :params => { :id => private_user_closed_changeset.id, :text => "This is a comment" }
+ end
+ end
+ end
+ assert_response :success
+
+ changeset = create(:changeset, :closed, :user => private_user)
+ changeset.subscribers.push(private_user)
+ changeset.subscribers.push(user)
+ changeset.subscribers.push(suspended_user)
+ changeset.subscribers.push(deleted_user)
+
+ assert_difference "ChangesetComment.count", 1 do
+ assert_difference "ActionMailer::Base.deliveries.size", 1 do
+ perform_enqueued_jobs do
+ post :create, :params => { :id => changeset.id, :text => "This is a comment" }
+ end
+ end
+ end
+ assert_response :success
+
+ email = ActionMailer::Base.deliveries.first
+ assert_equal 1, email.to.length
+ assert_equal "[OpenStreetMap] #{user.display_name} has commented on one of your changesets", email.subject
+ assert_equal private_user.email, email.to.first
+
+ ActionMailer::Base.deliveries.clear
+
+ basic_authorization user2.email, "test"
+
+ assert_difference "ChangesetComment.count", 1 do
+ assert_difference "ActionMailer::Base.deliveries.size", 2 do
+ perform_enqueued_jobs do
+ post :create, :params => { :id => changeset.id, :text => "This is a comment" }
+ end
+ end
+ end
+ assert_response :success
+
+ email = ActionMailer::Base.deliveries.find { |e| e.to.first == private_user.email }
+ assert_not_nil email
+ assert_equal 1, email.to.length
+ assert_equal "[OpenStreetMap] #{user2.display_name} has commented on one of your changesets", email.subject
+
+ email = ActionMailer::Base.deliveries.find { |e| e.to.first == user.email }
+ assert_not_nil email
+ assert_equal 1, email.to.length
+ assert_equal "[OpenStreetMap] #{user2.display_name} has commented on a changeset you are interested in", email.subject
+
+ ActionMailer::Base.deliveries.clear
+ end
+
+ ##
+ # create comment fail
+ def test_create_comment_fail
+ # unauthorized
+ post :create, :params => { :id => create(:changeset, :closed).id, :text => "This is a comment" }
+ assert_response :unauthorized
+
+ basic_authorization create(:user).email, "test"
+
+ # bad changeset id
+ assert_no_difference "ChangesetComment.count" do
+ post :create, :params => { :id => 999111, :text => "This is a comment" }
+ end
+ assert_response :not_found
+
+ # not closed changeset
+ assert_no_difference "ChangesetComment.count" do
+ post :create, :params => { :id => create(:changeset).id, :text => "This is a comment" }
+ end
+ assert_response :conflict
+
+ # no text
+ assert_no_difference "ChangesetComment.count" do
+ post :create, :params => { :id => create(:changeset, :closed).id }
+ end
+ assert_response :bad_request
+
+ # empty text
+ assert_no_difference "ChangesetComment.count" do
+ post :create, :params => { :id => create(:changeset, :closed).id, :text => "" }
+ end
+ assert_response :bad_request
+ end
+
+ ##
+ # test hide comment fail
+ def test_destroy_comment_fail
+ # unauthorized
+ comment = create(:changeset_comment)
+ assert_equal true, comment.visible
+
+ post :destroy, :params => { :id => comment.id }
+ assert_response :unauthorized
+ assert_equal true, comment.reload.visible
+
+ basic_authorization create(:user).email, "test"
+
+ # not a moderator
+ post :destroy, :params => { :id => comment.id }
+ assert_response :forbidden
+ assert_equal true, comment.reload.visible
+
+ basic_authorization create(:moderator_user).email, "test"
+
+ # bad comment id
+ post :destroy, :params => { :id => 999111 }
+ assert_response :not_found
+ assert_equal true, comment.reload.visible
+ end
+
+ ##
+ # test hide comment succes
+ def test_hide_comment_success
+ comment = create(:changeset_comment)
+ assert_equal true, comment.visible
+
+ basic_authorization create(:moderator_user).email, "test"
+
+ post :destroy, :params => { :id => comment.id }
+ assert_response :success
+ assert_equal false, comment.reload.visible
+ end
+
+ ##
+ # test unhide comment fail
+ def test_restore_comment_fail
+ # unauthorized
+ comment = create(:changeset_comment, :visible => false)
+ assert_equal false, comment.visible
+
+ post :restore, :params => { :id => comment.id }
+ assert_response :unauthorized
+ assert_equal false, comment.reload.visible
+
+ basic_authorization create(:user).email, "test"
+
+ # not a moderator
+ post :restore, :params => { :id => comment.id }
+ assert_response :forbidden
+ assert_equal false, comment.reload.visible
+
+ basic_authorization create(:moderator_user).email, "test"
+
+ # bad comment id
+ post :restore, :params => { :id => 999111 }
+ assert_response :not_found
+ assert_equal false, comment.reload.visible
+ end
+
+ ##
+ # test unhide comment succes
+ def test_unhide_comment_success
+ comment = create(:changeset_comment, :visible => false)
+ assert_equal false, comment.visible
+
+ basic_authorization create(:moderator_user).email, "test"
+
+ post :restore, :params => { :id => comment.id }
+ assert_response :success
+ assert_equal true, comment.reload.visible
+ end
+
+ ##
+ # test comments feed
+ def test_feed
+ changeset = create(:changeset, :closed)
+ create_list(:changeset_comment, 3, :changeset => changeset)
+
+ get :index, :params => { :format => "rss" }
+ assert_response :success
+ assert_equal "application/rss+xml", @response.content_type
+ assert_select "rss", :count => 1 do
+ assert_select "channel", :count => 1 do
+ assert_select "item", :count => 3
+ end
+ end
+
+ get :index, :params => { :format => "rss", :limit => 2 }
+ assert_response :success
+ assert_equal "application/rss+xml", @response.content_type
+ assert_select "rss", :count => 1 do
+ assert_select "channel", :count => 1 do
+ assert_select "item", :count => 2
+ end
+ end
+
+ get :index, :params => { :id => changeset.id, :format => "rss" }
+ assert_response :success
+ assert_equal "application/rss+xml", @response.content_type
+ assert_select "rss", :count => 1 do
+ assert_select "channel", :count => 1 do
+ assert_select "item", :count => 3
+ end
+ end
+ end
+
+ ##
+ # test comments feed
+ def test_feed_bad_limit
+ get :index, :params => { :format => "rss", :limit => 0 }
+ assert_response :bad_request
+
+ get :index, :params => { :format => "rss", :limit => 100001 }
+ assert_response :bad_request
+ end
+end
{ :path => "/api/0.6/changeset/1/close", :method => :put },
{ :controller => "changeset", :action => "close", :id => "1" }
)
- assert_routing(
- { :path => "/api/0.6/changeset/1/comment", :method => :post },
- { :controller => "changeset", :action => "comment", :id => "1" }
- )
- assert_routing(
- { :path => "/api/0.6/changeset/comment/1/hide", :method => :post },
- { :controller => "changeset", :action => "hide_comment", :id => "1" }
- )
- assert_routing(
- { :path => "/api/0.6/changeset/comment/1/unhide", :method => :post },
- { :controller => "changeset", :action => "unhide_comment", :id => "1" }
- )
assert_routing(
{ :path => "/api/0.6/changesets", :method => :get },
{ :controller => "changeset", :action => "query" }
)
- assert_routing(
- { :path => "/changeset/1/comments/feed", :method => :get },
- { :controller => "changeset", :action => "comments_feed", :id => "1", :format => "rss" }
- )
assert_routing(
{ :path => "/user/name/history", :method => :get },
{ :controller => "changeset", :action => "index", :display_name => "name" }
{ :path => "/history/feed", :method => :get },
{ :controller => "changeset", :action => "feed", :format => :atom }
)
- assert_routing(
- { :path => "/history/comments/feed", :method => :get },
- { :controller => "changeset", :action => "comments_feed", :format => "rss" }
- )
end
# -----------------------
assert_select "osmChange node[id='#{node.id}'][version='1']", 0
end
- ##
- # create comment success
- def test_create_comment_success
- user = create(:user)
- user2 = create(:user)
- private_user = create(:user, :data_public => false)
- suspended_user = create(:user, :suspended)
- deleted_user = create(:user, :deleted)
- private_user_closed_changeset = create(:changeset, :closed, :user => private_user)
-
- basic_authorization user.email, "test"
-
- assert_difference "ChangesetComment.count", 1 do
- assert_no_difference "ActionMailer::Base.deliveries.size" do
- perform_enqueued_jobs do
- post :comment, :params => { :id => private_user_closed_changeset.id, :text => "This is a comment" }
- end
- end
- end
- assert_response :success
-
- changeset = create(:changeset, :closed, :user => private_user)
- changeset.subscribers.push(private_user)
- changeset.subscribers.push(user)
- changeset.subscribers.push(suspended_user)
- changeset.subscribers.push(deleted_user)
-
- assert_difference "ChangesetComment.count", 1 do
- assert_difference "ActionMailer::Base.deliveries.size", 1 do
- perform_enqueued_jobs do
- post :comment, :params => { :id => changeset.id, :text => "This is a comment" }
- end
- end
- end
- assert_response :success
-
- email = ActionMailer::Base.deliveries.first
- assert_equal 1, email.to.length
- assert_equal "[OpenStreetMap] #{user.display_name} has commented on one of your changesets", email.subject
- assert_equal private_user.email, email.to.first
-
- ActionMailer::Base.deliveries.clear
-
- basic_authorization user2.email, "test"
-
- assert_difference "ChangesetComment.count", 1 do
- assert_difference "ActionMailer::Base.deliveries.size", 2 do
- perform_enqueued_jobs do
- post :comment, :params => { :id => changeset.id, :text => "This is a comment" }
- end
- end
- end
- assert_response :success
-
- email = ActionMailer::Base.deliveries.find { |e| e.to.first == private_user.email }
- assert_not_nil email
- assert_equal 1, email.to.length
- assert_equal "[OpenStreetMap] #{user2.display_name} has commented on one of your changesets", email.subject
-
- email = ActionMailer::Base.deliveries.find { |e| e.to.first == user.email }
- assert_not_nil email
- assert_equal 1, email.to.length
- assert_equal "[OpenStreetMap] #{user2.display_name} has commented on a changeset you are interested in", email.subject
-
- ActionMailer::Base.deliveries.clear
- end
-
- ##
- # create comment fail
- def test_create_comment_fail
- # unauthorized
- post :comment, :params => { :id => create(:changeset, :closed).id, :text => "This is a comment" }
- assert_response :unauthorized
-
- basic_authorization create(:user).email, "test"
-
- # bad changeset id
- assert_no_difference "ChangesetComment.count" do
- post :comment, :params => { :id => 999111, :text => "This is a comment" }
- end
- assert_response :not_found
-
- # not closed changeset
- assert_no_difference "ChangesetComment.count" do
- post :comment, :params => { :id => create(:changeset).id, :text => "This is a comment" }
- end
- assert_response :conflict
-
- # no text
- assert_no_difference "ChangesetComment.count" do
- post :comment, :params => { :id => create(:changeset, :closed).id }
- end
- assert_response :bad_request
-
- # empty text
- assert_no_difference "ChangesetComment.count" do
- post :comment, :params => { :id => create(:changeset, :closed).id, :text => "" }
- end
- assert_response :bad_request
- end
-
##
# test subscribe success
def test_subscribe_success
assert_response :not_found
end
- ##
- # test hide comment fail
- def test_hide_comment_fail
- # unauthorized
- comment = create(:changeset_comment)
- assert_equal true, comment.visible
-
- post :hide_comment, :params => { :id => comment.id }
- assert_response :unauthorized
- assert_equal true, comment.reload.visible
-
- basic_authorization create(:user).email, "test"
-
- # not a moderator
- post :hide_comment, :params => { :id => comment.id }
- assert_response :forbidden
- assert_equal true, comment.reload.visible
-
- basic_authorization create(:moderator_user).email, "test"
-
- # bad comment id
- post :hide_comment, :params => { :id => 999111 }
- assert_response :not_found
- assert_equal true, comment.reload.visible
- end
-
- ##
- # test hide comment succes
- def test_hide_comment_success
- comment = create(:changeset_comment)
- assert_equal true, comment.visible
-
- basic_authorization create(:moderator_user).email, "test"
-
- post :hide_comment, :params => { :id => comment.id }
- assert_response :success
- assert_equal false, comment.reload.visible
- end
-
- ##
- # test unhide comment fail
- def test_unhide_comment_fail
- # unauthorized
- comment = create(:changeset_comment, :visible => false)
- assert_equal false, comment.visible
-
- post :unhide_comment, :params => { :id => comment.id }
- assert_response :unauthorized
- assert_equal false, comment.reload.visible
-
- basic_authorization create(:user).email, "test"
-
- # not a moderator
- post :unhide_comment, :params => { :id => comment.id }
- assert_response :forbidden
- assert_equal false, comment.reload.visible
-
- basic_authorization create(:moderator_user).email, "test"
-
- # bad comment id
- post :unhide_comment, :params => { :id => 999111 }
- assert_response :not_found
- assert_equal false, comment.reload.visible
- end
-
- ##
- # test unhide comment succes
- def test_unhide_comment_success
- comment = create(:changeset_comment, :visible => false)
- assert_equal false, comment.visible
-
- basic_authorization create(:moderator_user).email, "test"
-
- post :unhide_comment, :params => { :id => comment.id }
- assert_response :success
- assert_equal true, comment.reload.visible
- end
-
- ##
- # test comments feed
- def test_comments_feed
- changeset = create(:changeset, :closed)
- create_list(:changeset_comment, 3, :changeset => changeset)
-
- get :comments_feed, :params => { :format => "rss" }
- assert_response :success
- assert_equal "application/rss+xml", @response.content_type
- assert_select "rss", :count => 1 do
- assert_select "channel", :count => 1 do
- assert_select "item", :count => 3
- end
- end
-
- get :comments_feed, :params => { :format => "rss", :limit => 2 }
- assert_response :success
- assert_equal "application/rss+xml", @response.content_type
- assert_select "rss", :count => 1 do
- assert_select "channel", :count => 1 do
- assert_select "item", :count => 2
- end
- end
-
- get :comments_feed, :params => { :id => changeset.id, :format => "rss" }
- assert_response :success
- assert_equal "application/rss+xml", @response.content_type
- assert_select "rss", :count => 1 do
- assert_select "channel", :count => 1 do
- assert_select "item", :count => 3
- end
- end
- end
-
- ##
- # test comments feed
- def test_comments_feed_bad_limit
- get :comments_feed, :params => { :format => "rss", :limit => 0 }
- assert_response :bad_request
-
- get :comments_feed, :params => { :format => "rss", :limit => 100001 }
- assert_response :bad_request
- end
-
private
##
require "test_helper"
-require "geocoder_controller"
class GeocoderControllerTest < ActionController::TestCase
##
require "test_helper"
-require "redactions_controller"
class RedactionsControllerTest < ActionController::TestCase
##
require "test_helper"
-require "osm"
class RedactionTest < ActiveSupport::TestCase
def test_cannot_redact_current