diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..d16f0fc8
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+setup/entry text eol=lf
diff --git a/.travis.yml b/.travis.yml
index 3cadc3c7..cdc2d81a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,4 +3,4 @@ services: docker
before_install:
- docker-compose build
script:
- - docker-compose run -e "RAILS_ENV=test" web rake db:test:prepare spec cucumber
+ - docker-compose run -e "RAILS_ENV=test" web rake db:test:prepare spec
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 46d03054..d988c205 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -26,7 +26,7 @@ It will be available at localhost:3000
### 5 Run the Tests
```
-docker-compose run -e "RAILS_ENV=test" web rake db:test:prepare spec cucumber
+docker-compose run -e "RAILS_ENV=test" web rake db:test:prepare spec
```
### 6 Optional tasks:
diff --git a/Gemfile b/Gemfile
index c508139b..52af7f4a 100644
--- a/Gemfile
+++ b/Gemfile
@@ -7,7 +7,6 @@ gem 'pg_search'
gem 'sass-rails'
gem 'bootstrap-sass'
gem 'haml'
-gem 'rails_12factor'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.2'
gem 'jquery-rails'
@@ -33,6 +32,10 @@ gem 'puma'
# Upgraded to 1.0.0 for Rails 5.1.4
gem 'activeadmin', '~> 1.0.0'
+group :production do
+ gem 'rails_12factor'
+end
+
group :development, :test do
gem 'rspec-rails'
gem 'factory_bot_rails', '~> 4.8.2'
@@ -40,12 +43,15 @@ group :development, :test do
gem 'pry'
gem 'better_errors', '~> 2.4.0'
gem 'binding_of_caller'
+end
+
+group :development do
gem 'i18n-debug'
end
group :test do
gem 'rake'
- gem 'cucumber-rails', '~> 1.5.0', require: false
+ gem 'capybara'
gem 'database_cleaner'
gem 'simplecov', '~> 0.7.1', require: false
gem 'poltergeist'
diff --git a/Gemfile.lock b/Gemfile.lock
index e8ca34bd..0e349f5b 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -63,7 +63,6 @@ GEM
descendants_tracker (~> 0.0.4)
ice_nine (~> 0.11.0)
thread_safe (~> 0.3, >= 0.3.1)
- backports (3.10.3)
bcrypt (3.1.11)
better_errors (2.4.0)
coderay (>= 1.0.0)
@@ -109,28 +108,6 @@ GEM
crack (0.4.3)
safe_yaml (~> 1.0.0)
crass (1.0.2)
- cucumber (3.0.1)
- builder (>= 2.1.2)
- cucumber-core (~> 3.0.0)
- cucumber-expressions (~> 4.0.3)
- cucumber-wire (~> 0.0.1)
- diff-lcs (~> 1.3)
- gherkin (~> 4.0)
- multi_json (>= 1.7.5, < 2.0)
- multi_test (>= 0.1.2)
- cucumber-core (3.0.0)
- backports (>= 3.8.0)
- cucumber-tag_expressions (>= 1.0.1)
- gherkin (>= 4.1.3)
- cucumber-expressions (4.0.4)
- cucumber-rails (1.5.0)
- capybara (>= 1.1.2, < 3)
- cucumber (>= 1.3.8, < 4)
- mime-types (>= 1.17, < 4)
- nokogiri (~> 1.5)
- railties (>= 4, < 5.2)
- cucumber-tag_expressions (1.0.1)
- cucumber-wire (0.0.1)
database_cleaner (1.6.2)
debug_inspector (0.0.3)
descendants_tracker (0.0.4)
@@ -159,7 +136,6 @@ GEM
actionpack (>= 3.2.13)
formtastic_i18n (0.6.0)
geocoder (1.2.14)
- gherkin (4.1.3)
globalid (0.4.1)
activesupport (>= 4.2.0)
grape (0.7.0)
@@ -224,16 +200,12 @@ GEM
actionmailer (>= 3.2, < 5.2)
activemodel (>= 3.2, < 5.2)
method_source (0.9.0)
- mime-types (3.1)
- mime-types-data (~> 3.2015)
- mime-types-data (3.2016.0521)
mini_mime (0.1.4)
mini_portile2 (2.3.0)
minitest (5.10.3)
money (6.9.0)
i18n (>= 0.6.4, < 0.9)
multi_json (1.12.2)
- multi_test (0.1.2)
multi_xml (0.6.0)
nio4r (2.1.0)
nokogiri (1.8.1)
@@ -394,9 +366,9 @@ DEPENDENCIES
binding_of_caller
bootstrap-sass
bugsnag
+ capybara
coffee-rails (~> 4.2)
country_select
- cucumber-rails (~> 1.5.0)
database_cleaner
devise (~> 4.3)
dotenv-rails (~> 2.2.1)
diff --git a/README.md b/README.md
index 8052605d..d0fcb639 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,9 @@ Staging: [Link](http://staging.refugerestrooms.org)
## Contributing
-Changes to the site can be tested locally before deploying to the web. To get set up to edit the site and test your changes, see [`CONTRIBUTING.md`](https://github.com/RefugeRestrooms/refugerestrooms/blob/develop/CONTRIBUTING.md).
+For more information on how to contribute to Refuge Restrooms, or how the technology works, see the [Wiki](https://github.com/RefugeRestrooms/refugerestrooms/wiki).
+
+If you just want to get your environment set up for making changes locally and testing, you can head directly to [CONTRIBUTING.md](https://github.com/RefugeRestrooms/refugerestrooms/blob/develop/CONTRIBUTING.md).
## Tech
diff --git a/app/assets/javascripts/views/restrooms/index.js b/app/assets/javascripts/views/restrooms/index.js
index 1584b993..9a6681dd 100644
--- a/app/assets/javascripts/views/restrooms/index.js
+++ b/app/assets/javascripts/views/restrooms/index.js
@@ -1,77 +1,55 @@
$(function(){
- var headerHidden = false;
- var mapOn = false;
- var mapShow = false;
- var mapHeight, listHeight;
- var mapContainer = $("#mapContainer");
- var list = $("#list");
- var mapToggle = $(".mapToggle");
- var search = $("#search");
-
- function toggleMap (){
- if (mapShow) {
- mapToggle.html("Map View");
- //animate
- scrollUp(mapContainer, function(){scrollDown(list, listHeight);});
- }else{
- mapToggle.html("List View");
- //animate
- scrollUp(list, function(){scrollDown(mapContainer, mapHeight, doInit);});
- }
- mapShow = !mapShow;
- }
-
- function scrollDown(object, height, callback){
- object.show();
- object.animate({height: height}, 1000, function(){
- if (callback) {
- callback();
- }
- });
- }
-
- function scrollUp(object, callback){
- object.animate({height: 0}, 1000, function(){
- object.hide();
- if (callback) {
- callback();
- }
- })
- }
-
- function doInit(){
- //initialize the map if it wasn't already on
- if (!mapOn && mapContainer.data('latitude') && mapContainer.data('longitude')) {
- initMap(mapContainer.data('latitude'), mapContainer.data('longitude'));
-
- //get a list of points from the server based on the searched location
- $.get( '/restrooms' + window.location.search , {}, function( data ) {
- for(var i = 0; i < data.length; i++){
- //for each point in the data, put a point on the map
- setPoint(data[i], i + 1);
- }
- }, 'json');
- mapOn = true;
- }
- }
-
-
- if (mapContainer.length > 0 && list.length > 0 && mapToggle.length > 0) {
- if (!mapContainer.data('latitude') || !mapContainer.data('longitude')) {
- //catch bad URL
- searchLocation(search.val());
- }
- //get default height for animation later
- mapHeight = mapContainer.height();
- listHeight = list.height();
-
- //hide the map
- mapContainer.hide();
- mapContainer.height(0);
-
- mapToggle.click(function(){
- //toggle which display is open
- toggleMap();
- });
- }
-});
\ No newline at end of file
+ var headerHidden = false;
+ var mapInitialized = false;
+ var mapShow = false;
+ var mapContainer = $("#mapContainer");
+ var list = $("#list");
+ var mapToggle = $(".mapToggle");
+ var search = $("#search");
+
+ function toggleMap (){
+ if (mapShow) {
+ mapToggle.html("Map View");
+ // animate
+ mapContainer.fadeIn(500, function() { list.fadeOut(500) });
+ } else{
+ mapToggle.html("List View");
+ // animate
+ list.fadeOut(500, function() { mapContainer.fadeIn(500, initPoints) });
+ }
+ mapShow = !mapShow;
+ }
+
+ function initPoints(){
+ // initialize the map if it wasn't already on
+ if (!mapInitialized && mapContainer.data('latitude') && mapContainer.data('longitude')) {
+ initMap(mapContainer.data('latitude'), mapContainer.data('longitude'));
+
+ // get a list of points from the server based on the searched location
+ $.get( '/restrooms' + window.location.search , {}, function( data ) {
+ for(var i = 0; i < data.length; i++){
+ // for each point in the data, put a point on the map
+ setPoint(data[i], i + 1);
+ }
+ }, 'json');
+ mapInitialized = true;
+ }
+ }
+
+
+ if (mapContainer.length > 0 && list.length > 0 && mapToggle.length > 0) {
+ if (!mapContainer.data('latitude') || !mapContainer.data('longitude')) {
+ // catch bad URL
+ searchLocation(search.val());
+ }
+ // get default height for animation later
+ mapHeight = mapContainer.height();
+ listHeight = list.height();
+
+ // hide the map
+ mapContainer.fadeOut(0);
+
+ // toggle which display is open
+ mapToggle.click(toggleMap);
+ }
+});
diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml
index e3e4a3fd..6d81acde 100644
--- a/app/views/layouts/_head.html.haml
+++ b/app/views/layouts/_head.html.haml
@@ -6,7 +6,7 @@
%meta{:content => "RefugeRestrooms.org", :name => "author"}/
%meta{:content => "initial-scale=1, maximum-scale=1", :name => "viewport"}/
-%script{:src => "https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=places&key=AIzaSyBXcCrqzMlm-ZmtNQve7AuipNdE4vySUF0"}
+%script{:src => "https://maps.googleapis.com/maps/api/js?v=3.31&libraries=places&key=AIzaSyBXcCrqzMlm-ZmtNQve7AuipNdE4vySUF0"}
= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true
= javascript_include_tag "application", "data-turbolinks-track" => true
= csrf_meta_tags
diff --git a/bin/cucumber b/bin/cucumber
deleted file mode 100755
index caa06543..00000000
--- a/bin/cucumber
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env ruby
-#
-# This file was generated by Bundler.
-#
-# The application 'cucumber' is installed as part of a gem, and
-# this file is here to facilitate running it.
-#
-
-require 'pathname'
-ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
- Pathname.new(__FILE__).realpath)
-
-require 'rubygems'
-require 'bundler/setup'
-
-load Gem.bin_path('cucumber', 'cucumber')
diff --git a/config/application.rb b/config/application.rb
index eb655ab5..e441bfb4 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -23,7 +23,10 @@ class Application < Rails::Application
# I18n stuff
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
- config.i18n.available_locales = [:en, :es]
+ config.i18n.available_locales = [:en, :es, :fr]
+ #config.i18n.default_locale = :fr
+
+
end
end
diff --git a/config/environments/test.rb b/config/environments/test.rb
index 8e5cbde5..abc4df7c 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -39,4 +39,6 @@
# Raises error for missing translations
# config.action_view.raise_on_missing_translations = true
+
+ config.log_level = :error
end
diff --git a/config/locales/fr/about.fr.yml b/config/locales/fr/about.fr.yml
new file mode 100644
index 00000000..c1f12fa9
--- /dev/null
+++ b/config/locales/fr/about.fr.yml
@@ -0,0 +1,22 @@
+fr:
+ about:
+ title: 'À propos de REFUGE'
+ p1header: "REFUGE restrooms, qu'est-ce que c'est ?"
+ p1:
+ first: "Refuge Restrooms est une application web visant à fournir un accès sécurisé à des toilettes aux personnes transgenres, intersexuées et non conformes dans le genre. Les utilisateurs peuvent chercher des toilettes à proximité d'un lieu, référencer de nouvelles toilettes, ainsi que commenter et noter les toilettes listées."
+ second: "Nous sommes transgenres et cherchons à créer une communauté axée non seulement sur la recherche de l'accès sécurisé aux toilettes, mais aussi préconiser la sécurité des personnes transgenres, intersexuées et non conformes dans le genre."
+ p2header: 'Où avez vous eu toutes ces données ?'
+ p2: "Les premières 4500 entrées proviennent de l'ancienne base de données Safe2Pee. Le reste de notre base de données est générée par nos utilisateurs. Si vous connaissez des toilettes non sexistes ou sécurisées, veuillez les ajouter à notre base de données !"
+ p3header: 'Pourquoi avoir choisi le nom REFUGE ?'
+ p3: "Nous croyons fermement que tout le monde a le droit d'utiliser les toilettes en toute sécurité et nous voulions que le nom de notre application reflète la dignité que nous voulons donner à nos utilisateurs. Nous espérons simplement offrir un lieu de refuge pour vos besoins."
+ p4header: "Quelle est l'importance des toilettes et pourquoi avons nous besoin de cette application ?"
+ p4: "L'un des plus grands champs de bataille où se déroule chaque jour la lutte pour les droits des transgenres est celui des toilettes : il semble que toutes les deux semaines un enfant transgenre est au centre d'un reportage national parce qu'il utilise les toilettes assignées au sexe qui l'identifie. Évidemment, nous croyons que toute personne transgenre devrait avoir le droit d'utiliser les toilettes qu'elle souhaite. Pourtant, nous réalisons également que malgré les victoires législatives de ces dernières années concernant l'utilisation des toilettes, de nombreux individus transgenres sont toujours confrontés au harcèlement verbal et physique simplement pour avoir utilisé les toilettes. Personne ne devrait être confronté à cela - et c'est pourquoi nous avons créé REFUGE."
+ p5header: 'Que pouvons nous faire pour aider?'
+ p5:
+ first: "1. Référencer des toilettes. La taille de la base de données dépend de votre participation. Plus il y a de toilettes référencées, plus l'application sera complète et aura de la valeure."
+ second: "2. Diffuser le message. Tweet. Facebook. Tumblr. Blog. Quoi que vous fassiez, faites-le. Faites connaître aux gens cette application."
+ third: "3. Si vous savez coder, visitez GitHub et informez-nous d'un bug, suggérez une amélioration, ou ajoutez un peu de code et aidez le projet. REFUGE est open source et nous ne pouvons pas le faire sans vous."
+ fourth: "4. Faites un don. Gardez les yeux ouverts pour une campagne de crowdfunding à venir pour financer une partie de la technologie dont nous avons besoin et pour payer un peu nos fabuleux designers et développeurs pour leur travail acharné et inlassable. Ils ont travaillé gratuitement pour vous offrir ce service et nous pensons que tout travail mérite salaire. La plupart des membres de l'équipe de base sont transgenres et sous-employés en ce moment."
+ p6header: "Pourquoi mon entreprise ou organisation est-elle répertoriée ?"
+ p6: "En savoir plus sur notre Business FAQ!"
+ contribute: 'Contribuez sur GitHub!'
diff --git a/config/locales/fr/business_info.yml b/config/locales/fr/business_info.yml
new file mode 100644
index 00000000..fe167139
--- /dev/null
+++ b/config/locales/fr/business_info.yml
@@ -0,0 +1,23 @@
+fr:
+ business_info:
+ title: "Questions fréquentes des organisations et entreprises à propos de Refuge Restrooms"
+ p1header: "1) Qu'est ce que Refuge Restrooms ?"
+ p1: "REFUGE est une application web visant à fournir un accès sécurisé à des toilettes aux personnes transgenres, intersexuées et non conformes dans le genre. En lire plus à propos de nous sur notre page À Propos."
+ p2header: "2) Comment mon établissement est-il entré dans cette liste ?"
+ p2: "Quelqu'un a utilisé vos toilettes et voulait soumettre votre emplacement en tant que ressource. Toutes nos données sont fournies par l'utilisateur et soumises par l'utilisateur."
+ p3header: "3) Comment puis-je être un bon hôte ?"
+ p3: "Merci d'avoir posé la question! Souvent, les visiteurs de REFUGE espèrent faire un arrêt rapide et être sur notre chemin, et comme tout autre visiteur, potentiellement soutenir votre entreprise ou votre emplacement pendant que nous sommes là. Le personnel amical et de bonnes expériences peuvent apporter un peu d'amour pour votre espace dans la section des commentaires de l'application (plus d'informations ci-dessous)"
+ p4header: "4) Why are safe restrooms an issue?"
+ p4:
+ first: "Aller aux toilettes es une activité quotidienne qui peut être difficile à effectuer pour les membres de notre communauté -- en particulier quand ils se rendent dans des lieux étrangers à leurs habitudes. C'est à ce moment que notre projet carthographie intervient."
+ second: "Selon l'US Trans Survey:"
+ list1: "59% des répondants évitent d'utiliser les toilettes par peur de confrontation"
+ list2: "31% évitent de manger ou boire à l'extérieur pour eviter d'utiliser les toilettes"
+ list3: "24% ont été questionnés sur leur présence aux toilettes"
+ list4: "12% ont été harcelés, attaqués, ou agressés sexuellement dans les toilettes"
+ list5: "9% se sont vus refuser l'accès aux toilettes"
+ list6: "8% ont développé un problème rénal ou une infection des voies urinaires pour avoir éviter l'utilisation des toilettes"
+ p5header: "5) Que signifient les avis?"
+ p5: "Les avis aident les visiteurs à partager leurs expériences les uns avec les autres sur l'emplacement. Nous encourageons les visiteurs à partager autant d'informations que nous avons sur chaque emplacement de la carte."
+ p6header: "6) Comment puis je retirer mon référencement ?"
+ p6: "Nous espérons que vous envisagerez de conserver votre référencement. Cela peut signifier beaucoup pour la santé et le bien-être de la population. Cependant, si vous préférez ne pas être référencer, utilisez notre formulaire de contact pour demander un retrait et nos volontaires travailleront dessus dès que possible (ceci est un projet open source, tout le travail est donc réalisé par des bénévoles)."
diff --git a/config/locales/fr/contacts.fr.yml b/config/locales/fr/contacts.fr.yml
new file mode 100644
index 00000000..46b753ab
--- /dev/null
+++ b/config/locales/fr/contacts.fr.yml
@@ -0,0 +1,11 @@
+fr:
+ contacts:
+ new:
+ request-edit-for-restroom: "Demande d'edition pour Toilettes %{restroom_name}"
+ contact-title: 'Contact'
+ leave-this-field-blank: 'Laissez ce champ vide !'
+ submitted:
+ thank-you-period: 'Merci pour votre message.'
+ thank-you-exclamation: 'Merci pour votre message !'
+ cannot-send: "Impossible d'envoyer votre message."
+ we-will-get-back-to-you: "Nous reviendrons vers vous bientôt."
diff --git a/config/locales/fr/devise.fr.yml b/config/locales/fr/devise.fr.yml
new file mode 100644
index 00000000..56e345be
--- /dev/null
+++ b/config/locales/fr/devise.fr.yml
@@ -0,0 +1,59 @@
+# Additional translations at https://github.com/plataformatec/devise/wiki/I18n
+
+fr:
+ devise:
+ confirmations:
+ confirmed: "Votre compte a été validé avec succès."
+ send_instructions: "Vous recevrez un email contenant des instructions pour valider votre compte dans quelques instants."
+ send_paranoid_instructions: "Si votre adresse email existe déjà dans notre base de données, vous recevrez un email contenant des instructions pour valider votre compte dans quelques instants."
+ failure:
+ already_authenticated: "Vous êtes déjà connecté."
+ inactive: "Votre compte n'a pas encore été activé."
+ invalid: "Email et/ou mot de passe invalide(s)."
+ locked: "Votre compte est bloqué."
+ last_attempt: "Il vous reste encore un essai avant que votre compte ne soit bloqué."
+ not_found_in_database: "Email et/ou mot de passe invalide(s)."
+ timeout: "Votre session a expiré. Veuillez vous reconnecter pour continuer."
+ unauthenticated: "Vous devez être connecté ou inscrit avant de continuer."
+ unconfirmed: "Vous devez confirmer votre compte avant de continuer."
+ mailer:
+ confirmation_instructions:
+ subject: "Instructions de confirmation"
+ reset_password_instructions:
+ subject: "Instructions de réinitialisation de votre mot de passe"
+ unlock_instructions:
+ subject: "Instructions de déblocage"
+ omniauth_callbacks:
+ failure: "Impossible de vous authentifier en tant que %{kind} en raison de \"%{reason}\"."
+ success: "Authentifié avec succès à partir du compte %{kind}."
+ passwords:
+ no_token: " Vous ne pouvez pas accéder à cette page sans passer par le lien de réinitialisation de mot de passe envoyé par email. Si vous venez bien de ce lien, veuillez vérifier que vous utilisez bien l'intégralité de l'url fournie."
+ send_instructions: "Vous recevrez un email contenant des instructions pour réinitialiser votre mot de passe dans quelques instants."
+ send_paranoid_instructions: "Si votre email est bien enregistré dans notre base de données, vous allez recevoir un lien de réinitialisation de votre mot de passe dans quelques minutes."
+ updated: "Votre mot de passe a été modifié avec succès. Vous êtes maintenant connecté."
+ updated_not_active: "Votre mot de passe a été modifié avec succès."
+ registrations:
+ destroyed: "Au revoir! Votre compte a bien été désactivé. Nous espèrons vous revoir bientôt."
+ signed_up: "Bienvenue ! Inscription réalisée avec succès."
+ signed_up_but_inactive: "Inscription réalisée avec succès. Toutefois, vous ne pouvez pas vous connecter car votre compte n'a pas encore été activé."
+ signed_up_but_locked: "Inscription réalisée avec succès. Toutefois, vous ne pouvez pas vous connecter car votre compte est bloqué."
+ signed_up_but_unconfirmed: "Un e-mail a été envoyé à votre adresse email. Veuillez ouvrir le lien fourni pour activer votre compte."
+ update_needs_confirmation: "Votre compte a été mis à jour avec succès. Toutefois nous devons vérifier votre nouvelle adresse email. Veuillez vérifier votre email et cliquer sur le lien de confirmation reçu pour finaliser la confirmation de votre nouvelle adresse email."
+ updated: " Votre compte a été modifié avec succès."
+ sessions:
+ signed_in: "Connecté avec succès"
+ signed_out: "Déconnecté avec succès."
+ unlocks:
+ send_instructions: "Vou recevrez un email contenant des instructions pour débloquer votre compte dans quelques instants."
+ send_paranoid_instructions: "Si votre compte existe, vous recevrez un email contenant des instructions pour débloquer votre compte dans quelques instants."
+ unlocked: "Votre compte a été débloqué avec succès. Veuillez vous connecter pour continuer."
+ errors:
+ messages:
+ already_confirmed: " a déjà été activé, veuillez essayer de vous connecter."
+ confirmation_period_expired: "a besoin d'être activé sous %{period}, veuillez demander un nouveau lien d'activation."
+ expired: "a expiré, veuillez demander un nouveau lien d'activation."
+ not_found: "est introuvable"
+ not_locked: "n'a pas été bloqué"
+ not_saved:
+ one: " 1 erreur interdit cette %{resource} d'être enregistré:"
+ other: "%{count} erreurs interdisent cette %{resource} d'être enregistré:"
diff --git a/config/locales/fr/footer.fr.yml b/config/locales/fr/footer.fr.yml
new file mode 100644
index 00000000..7ec8d625
--- /dev/null
+++ b/config/locales/fr/footer.fr.yml
@@ -0,0 +1,15 @@
+fr:
+ layouts:
+ footer:
+ aria-labels:
+ github: 'Refuge Restrooms sur GitHub'
+ twitter: 'Refuge Restrooms sur twitter'
+ facebook: 'Refuge Restrooms sur Facebook'
+ tumblr: 'Le blog de Refuge Restrooms sur tumblr'
+ email: 'Email Refuge Restrooms'
+ refuge-restrooms-is-open-source: 'Refuge Restrooms est open source.'
+ code-on-github: 'Code sur github.'
+ contribute-to-the-project: 'Contribuez au projet'
+ on-patreon: 'sur Patreon.'
+ copyleft: 'copyleft'
+ refuge-restrooms: 'Refuge Restrooms.'
\ No newline at end of file
diff --git a/config/locales/fr/navigation.fr.yml b/config/locales/fr/navigation.fr.yml
new file mode 100644
index 00000000..ae93fe30
--- /dev/null
+++ b/config/locales/fr/navigation.fr.yml
@@ -0,0 +1,11 @@
+fr:
+ layouts:
+ navigation:
+ toggle-navigation-button-label: 'Basculer en mode navigation'
+ submit-a-new-restroom-hyperlink-label: 'Soumettre de nouvelles toilettes'
+ about-hyperlink-label: 'À Propos'
+ contact-hyperlink-label: 'Contact'
+
+ resources-dropdown-button-label: 'Ressources'
+ download-unisex-restroom-signs-hyperlink-label: 'Télécharger des panneaux pour toilettes unisexes'
+ public-api-hyperlink-label: "API Publique"
diff --git a/config/locales/fr/restroom.fr.yml b/config/locales/fr/restroom.fr.yml
new file mode 100644
index 00000000..66315676
--- /dev/null
+++ b/config/locales/fr/restroom.fr.yml
@@ -0,0 +1,59 @@
+fr:
+ activerecord:
+ attributes:
+ restroom:
+ # only overridden attributes here, defaults work as expected
+ # (e.g. database field 'city' will be appear as 'City')
+ name: "Emplacement/Lieu/Nom de l'entreprise"
+ street: 'Adresse'
+ state: 'État/Région'
+ access: 'Accessible?'
+ bath_type: 'Type de toilettes'
+
+ search_bar:
+ enter_location: 'Entrez une adresse'
+
+ restroom:
+ add_new: 'Soumettre des toilettes à notre base de données'
+ preview: 'Aperçu'
+ required: '* indique un champ requis'
+ guess_location: 'Trouver ma position actuelle'
+ directions: 'Indications'
+ directions_hint: "(ex: troisième étage au fond, à coté des cabines d'essayage...)"
+ comments_hint: '(ex: vous devez être un client, faites comme si vous cherchiez quelque chose...)'
+ comments: 'Commentaires'
+ accessible: 'Accessible'
+ not_accessible: 'Inacessible'
+ changing_table: 'Table à langer'
+ no_changing_table: 'Pas de table à langer'
+ type:
+ unisex: 'Unisexe / Non-sexiste'
+ single_stall: 'Toilettes individuelles (avec genre) ou lieu sûr'
+ restsubmit: 'Enregistrer les toilettes'
+ rating:
+ positive: '%{percentage}% positif'
+ unrated: 'Pas encore noté'
+ upvote: "J'ai adoré !"
+ downvote: 'Pas sécurisé'
+ confirm:
+ upvote: 'Êtes vous sûr de vouloir donner un vote positif pour ces toilettes ?'
+ downvote: 'Êtes vous sûr de vouloir donner un vote négatif pour ces toilettes ?'
+ flash:
+ field: "Un champ requis n'a pas été complété. Veuillez revérifier vos données et soumettre le formulaire à nouveau."
+ unexpected: 'Nous avons rencontré un problème inattendu, veuillez nous contacter si ce problème persiste.'
+ upvoteerror: "Une erreur inattendu s'est produite durant le vote positif de cette publication."
+ upvotesuccess: 'Ces toilettes ont reçu un vote positif ! Merci pour votre contribution à notre communauté.'
+ downvoteerror: "Une erreur inattendu s'est produite durant le vote négatif de cette publication."
+ downvotesuccess: 'Ces toilettes ont reçu un vote négatif ! Merci pour votre contribution à notre communauté.'
+ new: 'De nouvelles toilettes ont été ajoutées pour %{name}.'
+ updated: 'Ces toilettes ont été mises à jour'
+ deleted: 'Ces toilettes ont été supprimées'
+ searcherror: "Une erreur s'est produite lors de la recherche de votre position."
+ contact:
+ contactlisting: "Contactez nous à propos de cette publication !"
+
+ restrooms:
+ nearby:
+ heading: 'Toilettes à proximité'
+ body: "Avant de soumettre des toilettes, veuillez vous assurer qu'il ne s'agit pas de toilettes proches et déja connues."
+ none: 'Aucune toilettes trouvée à proximité.'
diff --git a/config/locales/fr/restrooms.fr.yml b/config/locales/fr/restrooms.fr.yml
new file mode 100644
index 00000000..2fc2405e
--- /dev/null
+++ b/config/locales/fr/restrooms.fr.yml
@@ -0,0 +1,8 @@
+fr:
+ restrooms:
+ index:
+ map-view-button-label: 'Voir la carte'
+
+ show:
+ thumbs-up-button-label: "J'aime ces toilettes"
+ thumbs-down-button-label: "Je n'aime pas ces toilettes"
diff --git a/config/locales/fr/search.fr.yml b/config/locales/fr/search.fr.yml
new file mode 100644
index 00000000..fd74e19c
--- /dev/null
+++ b/config/locales/fr/search.fr.yml
@@ -0,0 +1,5 @@
+fr:
+ layouts:
+ search:
+ search: 'Recherche'
+ search-by-current-location: "Recherche à partir de votre position actuelle"
\ No newline at end of file
diff --git a/config/locales/fr/signs.fr.yml b/config/locales/fr/signs.fr.yml
new file mode 100644
index 00000000..da6aa1f4
--- /dev/null
+++ b/config/locales/fr/signs.fr.yml
@@ -0,0 +1,8 @@
+fr:
+ pages:
+ signs:
+ title: 'Panneaux pour toilettes à técharger'
+ intro: "Si vous avez des toilettes publiques dans votre immeuble ou votre entreprise qui ne sont pas sexistes, faites-le savoir. Vous (et/ou le propriétaire du bâtiment/la direction) pouvez l'ajouter à la base de données et afficher l'un des panneaux ci-dessous pour faire savoir aux gens que vous soutenez un accès sûr pour tous. Les deux panneaux sont des fichiers PDF imprimables."
+ head-accessible: 'Toilettes Accesibles'
+ head-non-accessible: 'Toilettes Inacessibles'
+ download: 'Télécharger au format PDF'
diff --git a/config/locales/fr/simple_form.fr.yml b/config/locales/fr/simple_form.fr.yml
new file mode 100644
index 00000000..279cb56b
--- /dev/null
+++ b/config/locales/fr/simple_form.fr.yml
@@ -0,0 +1,55 @@
+# See this documentation: https://github.com/plataformatec/simple_form#i18n
+# And this StackOverflow answer: https://stackoverflow.com/questions/35906089/changing-simple-form-submit-button-i18n-text
+
+fr:
+ simple_form:
+ "oui": 'Oui'
+ "non": 'Non'
+ required:
+ text: 'requis'
+ mark: '*'
+ # You can uncomment the line below if you need to overwrite the whole required html.
+ # When using html, text and mark won't be used.
+ # html: '*'
+ error_notification:
+ default_message: "Veuillez corriger les problèmes ci-dessous:"
+
+ labels:
+ defaults:
+ name: 'Nom'
+ street: 'Adresse'
+ city: 'Ville'
+ state: 'État/Région'
+ country: 'Pays'
+ accessible: 'Accessible'
+ unisex: 'Unisexe'
+ changing_table: 'Table à langer'
+ directions: 'Indications'
+ comment: 'Commentaire'
+ email: 'Email'
+ message: 'Message'
+ contact:
+ name: 'Nom'
+ email: 'Email'
+ message: 'Message'
+
+ helpers:
+ submit:
+ contact:
+ # This is the "Send message" button on the "Contact" page.
+ create: 'Envoyer'
+
+ # Labels and hints examples
+ # labels:
+ # defaults:
+ # password: 'Password'
+ # user:
+ # new:
+ # email: 'E-mail to sign in.'
+ # edit:
+ # email: 'E-mail.'
+ # hints:
+ # defaults:
+ # username: 'User name to sign in.'
+ # password: 'No special characters, please.'
+
diff --git a/config/locales/fr/splash.fr.yml b/config/locales/fr/splash.fr.yml
new file mode 100644
index 00000000..d51f2903
--- /dev/null
+++ b/config/locales/fr/splash.fr.yml
@@ -0,0 +1,6 @@
+fr:
+ pages:
+ index:
+ life-is-tough: 'Parfois la vie est dure...'
+ find-refuge: 'Trouver un Refuge'
+ add-restroom-button-label: 'Ajouter Des Toilettes'
diff --git a/config/locales/fr/text_msg.fr.yml b/config/locales/fr/text_msg.fr.yml
new file mode 100644
index 00000000..376241a9
--- /dev/null
+++ b/config/locales/fr/text_msg.fr.yml
@@ -0,0 +1,7 @@
+fr:
+ pages:
+ text:
+ title: "Recevez les toilettes les plus proches par SMS"
+ intro: "Si vous avez besoin de connaitre les toilettes sécurisées les plus proches tout de suite, vous pouvez les recevoir par SMS sur n'importe quel téléphone."
+ instructions: "Envoyez votre localisation au +1 (415) 367-3288 "
+ tip: "Pour des résultats plus précis, veuillez inclure l'adresse exacte, la ville, la région et le pays. Vous recevrez en un instant le nom de l'emplacement et son adresse exacte !"
diff --git a/features/contact.feature b/features/contact.feature
deleted file mode 100644
index 64bbd892..00000000
--- a/features/contact.feature
+++ /dev/null
@@ -1,9 +0,0 @@
-Feature: Request a contact form
-
- Scenario: Request edit from restroom
- Given I click to edit from restroom Mission Creek Cafe
- Then I should see Mission Creek Cafe in the header
-
- Scenario: Request generic contact from restroom
- Given I click to contact from restroom Mission Creek Cafe
- Then I should not see Mission Creek Cafe in the header
diff --git a/features/guess.feature.back b/features/guess.feature.back
deleted file mode 100644
index 82d254a6..00000000
--- a/features/guess.feature.back
+++ /dev/null
@@ -1,11 +0,0 @@
-@javascript
-Feature: Guess location
- Scenario: Guess in Oakland
- When I am in Oakland and I guess my location on the submission page
- Then I should see that I am at 1400 Broadway
- And I should see that I am in Oakland, California, US
-
- Scenario: Guess from Canada
- When I am in Winnipeg and I guess my location on the submission page
- Then I should see that I am at 93 Albert Street
- And I should see that I am in Winnipeg, Manitoba, CA
diff --git a/features/nearby.feature b/features/nearby.feature
deleted file mode 100644
index 2378ec15..00000000
--- a/features/nearby.feature
+++ /dev/null
@@ -1,11 +0,0 @@
-@javascript
-Feature: Suggest nearby restrooms
-
- Scenario: Show nearby restrooms when guessing
- Given a restroom exists in Winnipeg
- When I am in Winnipeg and I guess my location on the submission page
- Then I should see an existing restroom nearby
-
- Scenario: Show absence of nearby restrooms
- When I am in Winnipeg and I guess my location on the submission page
- Then I should not see an existing restroom nearby
diff --git a/features/preview.feature b/features/preview.feature
deleted file mode 100644
index 0f9a6a5f..00000000
--- a/features/preview.feature
+++ /dev/null
@@ -1,7 +0,0 @@
-@javascript
-Feature: Preview a restroom's location
-
- Scenario: Preview a restroom before submitting
- Given I have filled out the address information
- When I click the preview button
- Then I should see the map preview
\ No newline at end of file
diff --git a/features/search.feature b/features/search.feature
deleted file mode 100644
index 22988217..00000000
--- a/features/search.feature
+++ /dev/null
@@ -1,26 +0,0 @@
-@javascript
-Feature: Search for restrooms
-
- Scenario: Text search from splash page
- Given a restroom exists in Winnipeg
- When I am on the splash page
- And I search for "Winnipeg"
- Then I should see a restroom
-
- Scenario: Location search from splash page
- Given a restroom exists in Winnipeg
- When I am on the splash page
- And I search from Vancouver
- Then I should not see a restroom
-
- Scenario: Search from splash page (screen reader accessibility check)
- When I am on the splash page
- Then the search buttons should have ARIA labels
-
- Scenario: Map display
- Given a restroom exists in Winnipeg
- When I am on the splash page
- And I search from Winnipeg
- And I show the map
- Then I should see a restroom on the map
-
diff --git a/features/step_definitions/contact_steps.rb b/features/step_definitions/contact_steps.rb
deleted file mode 100644
index 268dbf3c..00000000
--- a/features/step_definitions/contact_steps.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-Given(/^I click to edit from restroom Mission Creek Cafe$/) do
- restroom = Restroom.find_by name: "Mission Creek Cafe"
- visit restroom_path restroom
- click_link 'Contact us about this post!'
-end
-
-Then(/^I should see Mission Creek Cafe in the header$/) do
- expect(page).to have_content('Mission Creek Cafe')
-end
-
-Given(/^I click to contact from restroom Mission Creek Cafe$/) do
- restroom = Restroom.find_by name: "Mission Creek Cafe"
- visit restroom_path restroom
- click_link 'Contact'
-end
-
-Then(/^I should not see Mission Creek Cafe in the header$/) do
- expect(page).to have_no_content('Mission Creek Cafe')
-end
diff --git a/features/step_definitions/location_steps.rb b/features/step_definitions/location_steps.rb
deleted file mode 100644
index a8269ba9..00000000
--- a/features/step_definitions/location_steps.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-Then(/^I should see that I am at (.*)$/) do |address|
- expect(page).to have_field('restroom[street]', with: address)
-end
-
-Then(/^I should see that I am in ([^,]*), ([^,]*), ([^,]*)$/) do |city, region, country|
- expect(page).to have_field('restroom[city]', with: city)
- expect(page).to have_field('restroom[state]', with: region)
- expect(page).to have_field('restroom[country]', with: country)
-end
diff --git a/features/step_definitions/map_steps.rb b/features/step_definitions/map_steps.rb
deleted file mode 100644
index 144abacd..00000000
--- a/features/step_definitions/map_steps.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-When(/^I show the map$/) do
- # TODO: Figure out why this isn't working.
- # print page.html
- page.has_css?(".mapToggle", :visible => true)
- # find('.mapToggle').click
- # print page.html
-end
-
-Then(/^I should see a restroom on the map$/) do
- # TODO: Figure Out why This isn't working either
- # page.has_css?(#)
- # expect(page).to have_css('#mapArea.loaded')
- # expect(page).to have_css('#mapArea .numberCircleText')
-end
diff --git a/features/step_definitions/navigation_steps.rb b/features/step_definitions/navigation_steps.rb
deleted file mode 100644
index 541938b7..00000000
--- a/features/step_definitions/navigation_steps.rb
+++ /dev/null
@@ -1,3 +0,0 @@
-When(/^I am on the splash page$/) do
- visit "/"
-end
diff --git a/features/step_definitions/preview_steps.rb b/features/step_definitions/preview_steps.rb
deleted file mode 100644
index 6b646296..00000000
--- a/features/step_definitions/preview_steps.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-Given(/^I have filled out the address information$/) do
- visit "/"
- click_link "Submit a New Restroom"
- fill_in "restroom[name]", with: "Vancouver restroom"
- fill_in "restroom[street]", with: "684 East Hastings"
- fill_in "restroom[city]", with: "Vancouver"
- fill_in "restroom[state]", with: "British Columbia"
- find(:select, "Country").first(:option, "Canada").select_option
-end
-
-When(/^I click the preview button$/) do
- click_button "Preview"
-end
-
-Then(/^I should see the map preview$/) do
- expect(page).to have_css("div#mapArea", :visible => true)
-end
diff --git a/features/step_definitions/restroom_steps.rb b/features/step_definitions/restroom_steps.rb
deleted file mode 100644
index 87c0e165..00000000
--- a/features/step_definitions/restroom_steps.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-Given(/^a restroom exists in Winnipeg$/) do
- FactoryBot.create(:restroom, {name: 'Winnipeg restroom', street: '91 Albert St.', city: 'Winnipeg', state: 'MB', country: 'Canada'}.merge(locations[:Winnipeg]))
-end
-
-Then(/^I should( not)? see a restroom$/) do |negation|
- expect(page).send(negation ? :not_to : :to, have_css('#list .listItem'))
-end
-
-Then(/^I should see an existing restroom nearby$/) do
- page.has_css?(".nearby-container .listItem", :visible => true)
-end
-
-Then(/^I should not see an existing restroom nearby$/) do
- page.has_css?(".nearby-container .none", :visible => true)
-end
diff --git a/features/step_definitions/search_steps.rb b/features/step_definitions/search_steps.rb
deleted file mode 100644
index fb357cd2..00000000
--- a/features/step_definitions/search_steps.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-When(/^I search for "(.*?)"$/) do |search|
- fill_in 'search', with: search
- find('.submit-search-button').click
-end
-
-When(/^I search from (.*?)$/) do |location|
- mock_location location
- find('.current-location-button').click
-end
-
-Then(/^the search buttons should have ARIA labels$/) do
- expect(find('button.submit-search-button')['aria-label']).to be_truthy
- expect(find('button.current-location-button')['aria-label']).to be_truthy
-end
diff --git a/features/step_definitions/submission_steps.rb b/features/step_definitions/submission_steps.rb
deleted file mode 100644
index f0963475..00000000
--- a/features/step_definitions/submission_steps.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-Given(/^I submit a restroom in Vancouver$/) do
- visit "/"
- click_link "Submit a New Restroom"
-
- fill_in "restroom[name]", with: "Vancouver restroom"
- fill_in "restroom[street]", with: "684 East Hastings"
- fill_in "restroom[city]", with: "Vancouver"
- fill_in "restroom[state]", with: "British Columbia"
- find(:select, "Country").first(:option, "Canada").select_option
- click_button "Save Restroom"
-end
-
-Then(/^I should see that the restroom has been created$/) do
- expect(page).to have_content("A new restroom entry has been created for")
-end
-
-When(/^I submit a spam restroom$/) do
- visit '/'
- click_link 'Submit a New Restroom'
-
- fill_in 'restroom[name]', with: 'Spam restroom'
- fill_in 'restroom[street]', with: 'Spamstreet'
- fill_in 'restroom[city]', with: 'Spamland'
- fill_in 'restroom[state]', with: 'Spamstate'
- find('#restroom_country').find(:xpath, "option[contains(., 'Canada')][1]").select_option
- click_button 'Save Restroom'
-end
-
-When(/^I am in (.*) and I guess my location on the submission page$/) do |city|
- visit "/"
- click_link "Submit a New Restroom"
-
- mock_location(city.to_sym)
-
- find(".guess-btn").click
-end
-
-Then(/^I should see a spam rejection message$/) do
- expect(page).to have_content("Your submission was rejected as spam.")
-end
diff --git a/features/submit.feature b/features/submit.feature
deleted file mode 100644
index 044eeae0..00000000
--- a/features/submit.feature
+++ /dev/null
@@ -1,10 +0,0 @@
-@javascript
-Feature: Submit a restroom
-
- Scenario: Submit a restroom manually
- When I submit a restroom in Vancouver
- Then I should see that the restroom has been created
-
- Scenario: Block a spam submission
- When I submit a spam restroom
- Then I should see a spam rejection message
diff --git a/features/support/env.rb b/features/support/env.rb
deleted file mode 100644
index 8bae73d4..00000000
--- a/features/support/env.rb
+++ /dev/null
@@ -1,62 +0,0 @@
-# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
-# It is recommended to regenerate this file in the future when you upgrade to a
-# newer version of cucumber-rails. Consider adding your own code to a new file
-# instead of editing this one. Cucumber will automatically load all features/**/*.rb
-# files.
-
-require 'cucumber/rails'
-
-# Seed the db for testing
-load "#{Rails.root}/db/seeds.rb"
-
-# Capybara defaults to CSS3 selectors rather than XPath.
-# If you'd prefer to use XPath, just uncomment this line and adjust any
-# selectors in your step definitions to use the XPath syntax.
-# Capybara.default_selector = :xpath
-
-# By default, any exception happening in your Rails application will bubble up
-# to Cucumber so that your scenario will fail. This is a different from how
-# your application behaves in the production environment, where an error page will
-# be rendered instead.
-#
-# Sometimes we want to override this default behaviour and allow Rails to rescue
-# exceptions and display an error page (just like when the app is running in production).
-# Typical scenarios where you want to do this is when you test your error pages.
-# There are two ways to allow Rails to rescue exceptions:
-#
-# 1) Tag your scenario (or feature) with @allow-rescue
-#
-# 2) Set the value below to true. Beware that doing this globally is not
-# recommended as it will mask a lot of errors for you!
-#
-ActionController::Base.allow_rescue = false
-
-# Remove/comment out the lines below if your app doesn't have a database.
-# For some databases (like MongoDB and CouchDB) you may need to use :truncation instead.
-begin
- DatabaseCleaner.strategy = :transaction
-rescue NameError
- raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it."
-end
-
-# You may also want to configure DatabaseCleaner to use different strategies for certain features and scenarios.
-# See the DatabaseCleaner documentation for details. Example:
-#
-# Before('@no-txn,@selenium,@culerity,@celerity,@javascript') do
-# # { :except => [:widgets] } may not do what you expect here
-# # as Cucumber::Rails::Database.javascript_strategy overrides
-# # this setting.
-# DatabaseCleaner.strategy = :truncation
-# end
-#
-# Before('~@no-txn', '~@selenium', '~@culerity', '~@celerity', '~@javascript') do
-# DatabaseCleaner.strategy = :transaction
-# end
-#
-
-# Possible values are :truncation and :transaction
-# The :transaction strategy is faster, but might give you threading problems.
-# See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature
-# Note: Changing this to truncation would require putting seeds in a before block
-Cucumber::Rails::Database.javascript_strategy = :transaction
-
diff --git a/features/support/poltergeist.rb b/features/support/poltergeist.rb
deleted file mode 100644
index 5160e10e..00000000
--- a/features/support/poltergeist.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-require 'capybara/poltergeist'
-
-Capybara.register_driver :poltergeist_debug do |app|
- Capybara::Poltergeist::Driver.new(app, :inspector => true)
-end
-
-Capybara.javascript_driver = :poltergeist_debug
diff --git a/features/support/webmock.rb b/features/support/webmock.rb
deleted file mode 100644
index 57d395d4..00000000
--- a/features/support/webmock.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-require 'webmock/cucumber'
-WebMock.disable_net_connect!(allow_localhost: true)
-
-Before do |scenario|
- # guess in Oakland
- stub_request(:get, "http://maps.googleapis.com/maps/api/geocode/json?language=en&latlng=37.8044,-122.2708").
- with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}).
- to_return(:status => 200, :body => File.new("#{Rails.root}/spec/fixtures/guess_in_oakland.json"), :headers => {})
-
- # guess in Winnipeg
- stub_request(:get, "http://maps.googleapis.com/maps/api/geocode/json?language=en&latlng=49.8975494,-97.140118").
- with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}).
- to_return(:status => 200, :body => File.new("#{Rails.root}/spec/fixtures/guess_in_winnipeg.json"), :headers => {})
-
- # guess in Vancouver
- stub_request(:get, "http://maps.googleapis.com/maps/api/geocode/json?language=en&latlng=49.281006,-123.089959").
- with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}).
- to_return(:status => 200, :body => File.new("#{Rails.root}/spec/fixtures/guess_in_vancouver.json"), :headers => {})
-
- # Akismet response for spam
- stub_request(:post, /.*.rest.akismet.com\/1.1\/comment-check/).
- with(body: /^.*Spam.*$/).
- to_return(status: 200, body: 'true', headers: {})
-
- # Akismet response for non-spam
- stub_request(:post, /.*.rest.akismet.com\/1.1\/comment-check/).
- with{|request| !request.body.include? "Spam"}.
- to_return(status: 200, body: 'false', headers: {})
-end
diff --git a/lib/tasks/cucumber.rake b/lib/tasks/cucumber.rake
deleted file mode 100644
index 9f53ce49..00000000
--- a/lib/tasks/cucumber.rake
+++ /dev/null
@@ -1,65 +0,0 @@
-# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
-# It is recommended to regenerate this file in the future when you upgrade to a
-# newer version of cucumber-rails. Consider adding your own code to a new file
-# instead of editing this one. Cucumber will automatically load all features/**/*.rb
-# files.
-
-
-unless ARGV.any? {|a| a =~ /^gems/} # Don't load anything when running the gems:* tasks
-
-vendored_cucumber_bin = Dir["#{Rails.root}/vendor/{gems,plugins}/cucumber*/bin/cucumber"].first
-$LOAD_PATH.unshift(File.dirname(vendored_cucumber_bin) + '/../lib') unless vendored_cucumber_bin.nil?
-
-begin
- require 'cucumber/rake/task'
-
- namespace :cucumber do
- Cucumber::Rake::Task.new({:ok => 'test:prepare'}, 'Run features that should pass') do |t|
- t.binary = vendored_cucumber_bin # If nil, the gem's binary is used.
- t.fork = true # You may get faster startup if you set this to false
- t.profile = 'default'
- end
-
- Cucumber::Rake::Task.new({:wip => 'test:prepare'}, 'Run features that are being worked on') do |t|
- t.binary = vendored_cucumber_bin
- t.fork = true # You may get faster startup if you set this to false
- t.profile = 'wip'
- end
-
- Cucumber::Rake::Task.new({:rerun => 'test:prepare'}, 'Record failing features and run only them if any exist') do |t|
- t.binary = vendored_cucumber_bin
- t.fork = true # You may get faster startup if you set this to false
- t.profile = 'rerun'
- end
-
- desc 'Run all features'
- task :all => [:ok, :wip]
-
- task :statsetup do
- require 'rails/code_statistics'
- ::STATS_DIRECTORIES << %w(Cucumber\ features features) if File.exist?('features')
- ::CodeStatistics::TEST_TYPES << "Cucumber features" if File.exist?('features')
- end
- end
- desc 'Alias for cucumber:ok'
- task :cucumber => 'cucumber:ok'
-
- task :default => :cucumber
-
- task :features => :cucumber do
- STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***"
- end
-
- # In case we don't have the generic Rails test:prepare hook, append a no-op task that we can depend upon.
- task 'test:prepare' do
- end
-
- task :stats => 'cucumber:statsetup'
-rescue LoadError
- desc 'cucumber rake task not available (cucumber not installed)'
- task :cucumber do
- abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
- end
-end
-
-end
diff --git a/script/cucumber b/script/cucumber
deleted file mode 100755
index 7fa5c920..00000000
--- a/script/cucumber
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env ruby
-
-vendored_cucumber_bin = Dir["#{File.dirname(__FILE__)}/../vendor/{gems,plugins}/cucumber*/bin/cucumber"].first
-if vendored_cucumber_bin
- load File.expand_path(vendored_cucumber_bin)
-else
- require 'rubygems' unless ENV['NO_RUBYGEMS']
- require 'cucumber'
- load Cucumber::BINARY
-end
diff --git a/spec/factories/restrooms.rb b/spec/factories/restrooms.rb
index 10532f34..4ded6654 100644
--- a/spec/factories/restrooms.rb
+++ b/spec/factories/restrooms.rb
@@ -8,6 +8,11 @@
upvote 22
downvote 11
+ trait :geocoded do
+ latitude 37.7749
+ longitude -122.4194
+ end
+
trait :unisex do
unisex true
end
@@ -27,5 +32,13 @@
factory :unisex_restroom, traits: [:unisex]
factory :ada_restroom, traits: [:ada]
factory :unisex_and_ada_restroom, traits: [:unisex, :ada]
+
+ factory :oakland_restroom do
+ name 'Some Cafe'
+ street '1400 Broadway'
+ city 'Oakland'
+ state 'CA'
+ country 'US'
+ end
end
end
diff --git a/spec/features/contacts_spec.rb b/spec/features/contacts_spec.rb
new file mode 100644
index 00000000..3f4218c5
--- /dev/null
+++ b/spec/features/contacts_spec.rb
@@ -0,0 +1,21 @@
+require 'spec_helper'
+
+describe 'the contact process', type: :feature do
+ it 'should show a restroom when contact is from edit restroom form' do
+ restroom = create(:restroom, name: "Mission Creek Cafe")
+
+ visit restroom_path restroom
+ click_link 'Contact us about this post!'
+
+ expect(page).to have_content('Mission Creek Cafe')
+ end
+
+ it 'should show a generic contact when contact is not from restroom form' do
+ restroom = create(:restroom, name: "Mission Creek Cafe")
+
+ visit restroom_path restroom
+ click_link 'Contact'
+
+ expect(page).to_not have_content('Mission Creek Cafe')
+ end
+end
diff --git a/spec/features/restrooms_spec.rb b/spec/features/restrooms_spec.rb
new file mode 100644
index 00000000..319326e6
--- /dev/null
+++ b/spec/features/restrooms_spec.rb
@@ -0,0 +1,128 @@
+require 'spec_helper'
+
+describe 'the restroom submission process', type: :feature, js: true do
+ it 'should add a restroom when submitted' do
+ visit root_path
+ click_link "Submit a New Restroom"
+ fill_in "restroom[name]", with: "Vancouver restroom"
+ fill_in "restroom[street]", with: "684 East Hastings"
+ fill_in "restroom[city]", with: "Vancouver"
+ fill_in "restroom[state]", with: "British Columbia"
+ find(:select, "Country").first(:option, "Canada").select_option
+ click_button "Save Restroom"
+
+ expect(page).to have_content("A new restroom entry has been created for")
+ end
+
+ it 'should block a spam submission' do
+ visit root_path
+ click_link 'Submit a New Restroom'
+ fill_in 'restroom[name]', with: 'Spam restroom'
+ fill_in 'restroom[street]', with: 'Spamstreet'
+ fill_in 'restroom[city]', with: 'Spamland'
+ fill_in 'restroom[state]', with: 'Spamstate'
+ find('#restroom_country').find(:xpath, "option[contains(., 'Canada')][1]").select_option
+ click_button 'Save Restroom'
+
+ expect(page).to have_content("Your submission was rejected as spam.")
+ end
+
+ #it "should guess my location" do
+ # visit "/"
+ # click_link "Submit a New Restroom"
+ # mock_location("Oakland")
+
+ # find(".guess-btn").click
+
+ # expect(page).to have_field('restroom[street]', with: "1400 Broadway")
+ # expect(page).to have_field('restroom[city]', with: "Oakland")
+ # expect(page).to have_field('restroom[state]', with: "CA")
+ #end
+end
+
+describe 'the restroom search process', type: :feature, js: true do
+ it 'should search for text from the splash page' do
+ create(:restroom, :geocoded, name: 'Mission Creek Cafe')
+
+ visit root_path
+ fill_in 'search', with: 'Mission Creek Cafe'
+ click_on 'Search'
+
+ expect(page).to have_content 'Mission Creek Cafe'
+ end
+
+ it 'should search for location from the splash page' do
+ create(:oakland_restroom, name: "Some Cafe")
+
+ visit root_path
+ mock_location "Oakland"
+ click_on 'Search by Current Location'
+
+ expect(page).to_not have_content 'Some Cafe'
+ end
+
+ it 'should search from the splash page with a screen reader' do
+ visit root_path
+
+ expect(find('button.submit-search-button')['aria-label']).to be_truthy
+ expect(find('button.current-location-button')['aria-label']).to be_truthy
+ end
+
+ it 'should display a map' do
+ create(:oakland_restroom)
+
+ visit root_path
+ mock_location "Oakland"
+ find('.current-location-button').click
+ # TODO: Figure out why this isn't working.
+ # print page.html
+ page.has_css?(".mapToggle", :visible => true)
+ # find('.mapToggle').click
+ # print page.html
+
+ # TODO: Figure Out why This isn't working either
+ # page.has_css?(#)
+ # expect(page).to have_css('#mapArea.loaded')
+ # expect(page).to have_css('#mapArea .numberCircleText')
+ end
+end
+
+
+describe 'the preview process', type: :feature, js: true do
+ it 'should preview a restroom before submitting' do
+ visit "/"
+ click_link "Submit a New Restroom"
+ fill_in "restroom[name]", with: "Vancouver restroom"
+ fill_in "restroom[street]", with: "684 East Hastings"
+ fill_in "restroom[city]", with: "Vancouver"
+ fill_in "restroom[state]", with: "British Columbia"
+ find(:select, "Country").first(:option, "Canada").select_option
+
+ click_on "Preview"
+
+ expect(page).to have_css("div#mapArea", :visible => true)
+ end
+end
+
+describe 'the nearby restroom display process', type: :feature, js: true do
+ it 'should show nearby restrooms when they exist' do
+ create(:oakland_restroom)
+ visit "/"
+ click_link "Submit a New Restroom"
+ mock_location "Oakland"
+
+ find(".guess-btn").click
+
+ page.has_css?(".nearby-container .listItem", :visible => true)
+ end
+
+ it "should not show nearby restrooms when they don't exist" do
+ visit "/"
+ click_link "Submit a New Restroom"
+ mock_location "Oakland"
+
+ find(".guess-btn").click
+
+ page.has_css?(".nearby-container .none", :visible => true)
+ end
+end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index bae93939..da3496f8 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -42,9 +42,6 @@
# the seed, which is printed after each run.
# --seed 1234
config.order = "random"
-
- # Include FactoryBot methods into the RSpec test suite.
- config.include FactoryBot::Syntax::Methods
end
Geocoder.configure(:lookup => :test)
diff --git a/spec/support/factory_bot.rb b/spec/support/factory_bot.rb
new file mode 100644
index 00000000..a33d2590
--- /dev/null
+++ b/spec/support/factory_bot.rb
@@ -0,0 +1,4 @@
+RSpec.configure do |config|
+ config.include FactoryBot::Syntax::Methods
+end
+
diff --git a/features/support/locations.rb b/spec/support/locations.rb
similarity index 98%
rename from features/support/locations.rb
rename to spec/support/locations.rb
index 44e2fc68..02c7a898 100644
--- a/features/support/locations.rb
+++ b/spec/support/locations.rb
@@ -32,5 +32,3 @@ def mock_location(location_name)
"
end
end
-
-World(Locations)
diff --git a/spec/support/rspec.rb b/spec/support/rspec.rb
new file mode 100644
index 00000000..df12fc35
--- /dev/null
+++ b/spec/support/rspec.rb
@@ -0,0 +1,37 @@
+require 'capybara/poltergeist'
+require 'capybara/rspec'
+require 'rspec/rails'
+# spec/spec_helper.rb
+#
+
+Capybara.register_driver :poltergeist_debug do |app|
+ Capybara::Poltergeist::Driver.new(app,
+ :js_errors => false
+ )
+end
+
+Capybara.javascript_driver = :poltergeist_debug
+
+WebMock.disable_net_connect!(allow_localhost: true)
+
+
+RSpec.configure do |config|
+ config.include Locations
+
+ config.before(:each) do
+ stub_request(:get, "http://maps.googleapis.com/maps/api/geocode/json?language=en&latlng=37.8044,-122.2708")
+ .with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'})
+ .to_return(:status => 200, :body => File.new("#{Rails.root}/spec/fixtures/guess_in_oakland.json"), :headers => {})
+
+ # Akismet response for spam
+ stub_request(:post, /.*.rest.akismet.com\/1.1\/comment-check/).
+ with(body: /^.*Spam.*$/).
+ to_return(status: 200, body: 'true', headers: {})
+
+ # Akismet response for non-spam
+ stub_request(:post, /.*.rest.akismet.com\/1.1\/comment-check/).
+ with{|request| !request.body.include? "Spam"}.
+ to_return(status: 200, body: 'false', headers: {})
+ end
+end
+