<%= content_for :title || "FMB" %>
+
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
+ <%= yield :head %>
+
+
+
+
+
+
<%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
<%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>
<%= favicon_link_tag asset_path("favicon.ico") %>
diff --git a/app/views/pwa/manifest.json.erb b/app/views/pwa/manifest.json.erb
new file mode 100644
index 00000000..116d2fbd
--- /dev/null
+++ b/app/views/pwa/manifest.json.erb
@@ -0,0 +1,22 @@
+{
+ "name": "<%= camelized %>",
+ "icons": [
+ {
+ "src": "/icon.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ },
+ {
+ "src": "/icon.png",
+ "type": "image/png",
+ "sizes": "512x512",
+ "purpose": "maskable"
+ }
+ ],
+ "start_url": "/",
+ "display": "standalone",
+ "scope": "/",
+ "description": "<%= camelized %>.",
+ "theme_color": "red",
+ "background_color": "red"
+}
\ No newline at end of file
diff --git a/app/views/pwa/service-worker.js b/app/views/pwa/service-worker.js
new file mode 100644
index 00000000..b3a13fb7
--- /dev/null
+++ b/app/views/pwa/service-worker.js
@@ -0,0 +1,26 @@
+// Add a service worker for processing Web Push notifications:
+//
+// self.addEventListener("push", async (event) => {
+// const { title, options } = await event.data.json()
+// event.waitUntil(self.registration.showNotification(title, options))
+// })
+//
+// self.addEventListener("notificationclick", function(event) {
+// event.notification.close()
+// event.waitUntil(
+// clients.matchAll({ type: "window" }).then((clientList) => {
+// for (let i = 0; i < clientList.length; i++) {
+// let client = clientList[i]
+// let clientPath = (new URL(client.url)).pathname
+//
+// if (clientPath == event.notification.data.path && "focus" in client) {
+// return client.focus()
+// }
+// }
+//
+// if (clients.openWindow) {
+// return clients.openWindow(event.notification.data.path)
+// }
+// })
+// )
+// })
diff --git a/bin/rubocop b/bin/rubocop
new file mode 100755
index 00000000..40330c0f
--- /dev/null
+++ b/bin/rubocop
@@ -0,0 +1,8 @@
+#!/usr/bin/env ruby
+require "rubygems"
+require "bundler/setup"
+
+# explicit rubocop config increases performance slightly while avoiding config confusion.
+ARGV.unshift("--config", File.expand_path("../.rubocop.yml", __dir__))
+
+load Gem.bin_path("rubocop", "rubocop")
diff --git a/bin/setup b/bin/setup
index 3ec5486b..81dc8f76 100755
--- a/bin/setup
+++ b/bin/setup
@@ -1,8 +1,8 @@
#!/usr/bin/env ruby
require "fileutils"
-# path to your application root.
APP_ROOT = File.expand_path("..", __dir__)
+APP_NAME = "fmb"
def system!(*)
system(*, exception: true)
@@ -30,4 +30,8 @@ FileUtils.chdir APP_ROOT do
puts "\n== Restarting application server =="
system! "bin/rails restart"
+
+ # puts "\n== Configuring puma-dev =="
+ # system "ln -nfs #{APP_ROOT} ~/.puma-dev/#{APP_NAME}"
+ # system "curl -Is https://#{APP_NAME}.test/up | head -n 1"
end
diff --git a/config/application.rb b/config/application.rb
index a737bc2c..5c38f5cc 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -21,7 +21,7 @@
module Fmb
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
- config.load_defaults 7.0
+ config.load_defaults 7.2
config.time_zone = "Asia/Kolkata"
config.i18n.available_locales = [:en]
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 2e7fb486..cfc85a5b 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -14,7 +14,7 @@
# Show full error reports.
config.consider_all_requests_local = true
- # Enable server timing
+ # Enable server timing.
config.server_timing = true
# Enable/disable caching. By default caching is disabled.
@@ -24,9 +24,7 @@
config.action_controller.enable_fragment_cache_logging = true
config.cache_store = :memory_store
- config.public_file_server.headers = {
- "Cache-Control" => "public, max-age=#{2.days.to_i}"
- }
+ config.public_file_server.headers = {"Cache-Control" => "public, max-age=#{2.days.to_i}"}
else
config.action_controller.perform_caching = false
@@ -39,8 +37,12 @@
# Don't care if the mailer can't send.
config.action_mailer.raise_delivery_errors = false
+ # Disable caching for Action Mailer templates even if Action Controller
+ # caching is enabled.
config.action_mailer.perform_caching = false
+ config.action_mailer.default_url_options = {host: "localhost", port: 3000}
+
# Print deprecation notices to the Rails logger.
config.active_support.deprecation = :log
@@ -66,11 +68,14 @@
# config.i18n.raise_on_missing_translations = true
# Annotate rendered view with file names.
- # config.action_view.annotate_rendered_view_with_filenames = true
+ config.action_view.annotate_rendered_view_with_filenames = true
# Uncomment if you wish to allow Action Cable access from any origin.
# config.action_cable.disable_request_forgery_protection = true
- # Raise error when a before_action's only/except options reference missing actions
+ # Raise error when a before_action's only/except options reference missing actions.
config.action_controller.raise_on_missing_callback_actions = true
+
+ # Apply autocorrection by RuboCop to files generated by `bin/rails generate`.
+ # config.generators.apply_rubocop_autocorrect_after_generate!
end
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 7bab8728..cc51852b 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -23,12 +23,6 @@
# Disable serving static files from `public/`, relying on NGINX/Apache to do so instead.
# config.public_file_server.enabled = false
- # Compress CSS using a preprocessor.
- # config.assets.css_compressor = :sass
-
- # Do not fallback to assets pipeline if a precompiled asset is missed.
- config.assets.compile = false
-
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
# config.asset_host = "http://assets.example.com"
@@ -51,6 +45,9 @@
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
config.force_ssl = true
+ # Skip http-to-https redirect for the default health check endpoint.
+ # config.ssl_options = { redirect: { exclude: ->(request) { request.path == "/up" } } }
+
# Log to STDOUT by default
config.logger = ActiveSupport::Logger.new($stdout)
.tap { |logger| logger.formatter = ::Logger::Formatter.new }
@@ -59,7 +56,7 @@
# Prepend all log lines with the following tags.
config.log_tags = [:request_id]
- # Info include generic and useful information about system operation, but avoids logging too much
+ # "info" includes generic and useful information about system operation, but avoids logging too much
# information to avoid inadvertent exposure of personally identifiable information (PII). If you
# want to log everything, set the level to "debug".
config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info")
@@ -71,6 +68,7 @@
# config.active_job.queue_adapter = :resque
# config.active_job.queue_name_prefix = "fmb_production"
+ # Disable caching for Action Mailer templates even if Action Controller caching is enabled.
config.action_mailer.perform_caching = false
# Ignore bad email addresses and do not raise email delivery errors.
@@ -87,6 +85,9 @@
# Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false
+ # Only use :id for inspections in production.
+ config.active_record.attributes_for_inspect = [:id]
+
# Enable DNS rebinding protection and other `Host` header attacks.
# config.hosts = [
# "example.com", # Allow requests from example.com
diff --git a/config/environments/test.rb b/config/environments/test.rb
index 24136a3a..5c5658bc 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -21,10 +21,7 @@
config.eager_load = ENV["CI"].present?
# Configure public file server for tests with Cache-Control for performance.
- config.public_file_server.enabled = true
- config.public_file_server.headers = {
- "Cache-Control" => "public, max-age=#{1.hour.to_i}"
- }
+ config.public_file_server.headers = {"Cache-Control" => "public, max-age=#{1.hour.to_i}"}
# Show full error reports and disable caching.
config.consider_all_requests_local = true
@@ -40,6 +37,7 @@
# Store uploaded files on the local file system in a temporary directory.
config.active_storage.service = :test
+ # Disable caching for Action Mailer templates even if Action Controller caching is enabled.
config.action_mailer.perform_caching = false
# Tell Action Mailer not to deliver emails to the real world.
@@ -47,6 +45,10 @@
# ActionMailer::Base.deliveries array.
config.action_mailer.delivery_method = :test
+ # Unlike controllers, the mailer instance doesn't have any context about the
+ # incoming request so you'll need to provide the :host parameter yourself.
+ config.action_mailer.default_url_options = {host: "www.example.com"}
+
# Print deprecation notices to the stderr.
config.active_support.deprecation = :stderr
@@ -62,6 +64,6 @@
# Annotate rendered view with file names.
# config.action_view.annotate_rendered_view_with_filenames = true
- # Raise error when a before_action's only/except options reference missing actions
+ # Raise error when a before_action's only/except options reference missing actions.
config.action_controller.raise_on_missing_callback_actions = true
end
diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb
index 1324daa9..48732442 100644
--- a/config/initializers/assets.rb
+++ b/config/initializers/assets.rb
@@ -5,9 +5,3 @@
# Add additional assets to the asset load path.
# Rails.application.config.assets.paths << Emoji.images_path
-# Rails.application.config.assets.paths << Rails.root.join("node_modules/bootstrap-icons/font")
-
-# Precompile additional assets.
-# application.js, application.css, and all non-JS/CSS in the app/assets
-# folder are already added.
-# Rails.application.config.assets.precompile += %w( admin.js admin.css )
diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb
index c2d89e28..c010b83d 100644
--- a/config/initializers/filter_parameter_logging.rb
+++ b/config/initializers/filter_parameter_logging.rb
@@ -4,5 +4,5 @@
# Use this to limit dissemination of sensitive information.
# See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors.
Rails.application.config.filter_parameters += [
- :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn
+ :passw, :email, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn
]
diff --git a/config/initializers/new_framework_defaults_7_1.rb b/config/initializers/new_framework_defaults_7_1.rb
deleted file mode 100644
index cda7419b..00000000
--- a/config/initializers/new_framework_defaults_7_1.rb
+++ /dev/null
@@ -1,279 +0,0 @@
-# Be sure to restart your server when you modify this file.
-#
-# This file eases your Rails 7.1 framework defaults upgrade.
-#
-# Uncomment each configuration one by one to switch to the new default.
-# Once your application is ready to run with all new defaults, you can remove
-# this file and set the `config.load_defaults` to `7.1`.
-#
-# Read the Guide for Upgrading Ruby on Rails for more info on each option.
-# https://guides.rubyonrails.org/upgrading_ruby_on_rails.html
-
-###
-# No longer add autoloaded paths into `$LOAD_PATH`. This means that you won't be able
-# to manually require files that are managed by the autoloader, which you shouldn't do anyway.
-#
-# This will reduce the size of the load path, making `require` faster if you don't use bootsnap, or reduce the size
-# of the bootsnap cache if you use it.
-#++
-# Rails.application.config.add_autoload_paths_to_load_path = false
-
-###
-# Remove the default X-Download-Options headers since it is used only by Internet Explorer.
-# If you need to support Internet Explorer, add back `"X-Download-Options" => "noopen"`.
-#++
-# Rails.application.config.action_dispatch.default_headers = {
-# "X-Frame-Options" => "SAMEORIGIN",
-# "X-XSS-Protection" => "0",
-# "X-Content-Type-Options" => "nosniff",
-# "X-Permitted-Cross-Domain-Policies" => "none",
-# "Referrer-Policy" => "strict-origin-when-cross-origin"
-# }
-
-###
-# Do not treat an `ActionController::Parameters` instance
-# as equal to an equivalent `Hash` by default.
-#++
-# Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality = false
-
-###
-# Active Record Encryption now uses SHA-256 as its hash digest algorithm.
-#
-# There are 3 scenarios to consider.
-#
-# 1. If you have data encrypted with previous Rails versions, and you have
-# +config.active_support.key_generator_hash_digest_class+ configured as SHA1 (the default
-# before Rails 7.0), you need to configure SHA-1 for Active Record Encryption too:
-#++
-# Rails.application.config.active_record.encryption.hash_digest_class = OpenSSL::Digest::SHA1
-#
-# 2. If you have +config.active_support.key_generator_hash_digest_class+ configured as SHA256 (the new default
-# in 7.0), then you need to configure SHA-256 for Active Record Encryption:
-#++
-# Rails.application.config.active_record.encryption.hash_digest_class = OpenSSL::Digest::SHA256
-#
-# 3. If you don't currently have data encrypted with Active Record encryption, you can disable this setting to
-# configure the default behavior starting 7.1+:
-#++
-# Rails.application.config.active_record.encryption.support_sha1_for_non_deterministic_encryption = false
-
-###
-# No longer run after_commit callbacks on the first of multiple Active Record
-# instances to save changes to the same database row within a transaction.
-# Instead, run these callbacks on the instance most likely to have internal
-# state which matches what was committed to the database, typically the last
-# instance to save.
-#++
-# Rails.application.config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction = false
-
-###
-# Configures SQLite with a strict strings mode, which disables double-quoted string literals.
-#
-# SQLite has some quirks around double-quoted string literals.
-# It first tries to consider double-quoted strings as identifier names, but if they don't exist
-# it then considers them as string literals. Because of this, typos can silently go unnoticed.
-# For example, it is possible to create an index for a non existing column.
-# See https://www.sqlite.org/quirks.html#double_quoted_string_literals_are_accepted for more details.
-#++
-# Rails.application.config.active_record.sqlite3_adapter_strict_strings_by_default = true
-
-###
-# Disable deprecated singular associations names.
-#++
-# Rails.application.config.active_record.allow_deprecated_singular_associations_name = false
-
-###
-# Enable the Active Job `BigDecimal` argument serializer, which guarantees
-# roundtripping. Without this serializer, some queue adapters may serialize
-# `BigDecimal` arguments as simple (non-roundtrippable) strings.
-#
-# When deploying an application with multiple replicas, old (pre-Rails 7.1)
-# replicas will not be able to deserialize `BigDecimal` arguments from this
-# serializer. Therefore, this setting should only be enabled after all replicas
-# have been successfully upgraded to Rails 7.1.
-#++
-# Rails.application.config.active_job.use_big_decimal_serializer = true
-
-###
-# Specify if an `ArgumentError` should be raised if `Rails.cache` `fetch` or
-# `write` are given an invalid `expires_at` or `expires_in` time.
-# Options are `true`, and `false`. If `false`, the exception will be reported
-# as `handled` and logged instead.
-#++
-# Rails.application.config.active_support.raise_on_invalid_cache_expiration_time = true
-
-###
-# Specify whether Query Logs will format tags using the SQLCommenter format
-# (https://open-telemetry.github.io/opentelemetry-sqlcommenter/), or using the legacy format.
-# Options are `:legacy` and `:sqlcommenter`.
-#++
-# Rails.application.config.active_record.query_log_tags_format = :sqlcommenter
-
-###
-# Specify the default serializer used by `MessageEncryptor` and `MessageVerifier`
-# instances.
-#
-# The legacy default is `:marshal`, which is a potential vector for
-# deserialization attacks in cases where a message signing secret has been
-# leaked.
-#
-# In Rails 7.1, the new default is `:json_allow_marshal` which serializes and
-# deserializes with `ActiveSupport::JSON`, but can fall back to deserializing
-# with `Marshal` so that legacy messages can still be read.
-#
-# In Rails 7.2, the default will become `:json` which serializes and
-# deserializes with `ActiveSupport::JSON` only.
-#
-# Alternatively, you can choose `:message_pack` or `:message_pack_allow_marshal`,
-# which serialize with `ActiveSupport::MessagePack`. `ActiveSupport::MessagePack`
-# can roundtrip some Ruby types that are not supported by JSON, and may provide
-# improved performance, but it requires the `msgpack` gem.
-#
-# For more information, see
-# https://guides.rubyonrails.org/v7.1/configuring.html#config-active-support-message-serializer
-#
-# If you are performing a rolling deploy of a Rails 7.1 upgrade, wherein servers
-# that have not yet been upgraded must be able to read messages from upgraded
-# servers, first deploy without changing the serializer, then set the serializer
-# in a subsequent deploy.
-#++
-# Rails.application.config.active_support.message_serializer = :json_allow_marshal
-
-###
-# Enable a performance optimization that serializes message data and metadata
-# together. This changes the message format, so messages serialized this way
-# cannot be read by older versions of Rails. However, messages that use the old
-# format can still be read, regardless of whether this optimization is enabled.
-#
-# To perform a rolling deploy of a Rails 7.1 upgrade, wherein servers that have
-# not yet been upgraded must be able to read messages from upgraded servers,
-# leave this optimization off on the first deploy, then enable it on a
-# subsequent deploy.
-#++
-# Rails.application.config.active_support.use_message_serializer_for_metadata = true
-
-###
-# Set the maximum size for Rails log files.
-#
-# `config.load_defaults 7.1` does not set this value for environments other than
-# development and test.
-#++
-# if Rails.env.local?
-# Rails.application.config.log_file_size = 100 * 1024 * 1024
-# end
-
-###
-# Enable raising on assignment to attr_readonly attributes. The previous
-# behavior would allow assignment but silently not persist changes to the
-# database.
-#++
-Rails.application.config.active_record.raise_on_assign_to_attr_readonly = true
-
-###
-# Enable validating only parent-related columns for presence when the parent is mandatory.
-# The previous behavior was to validate the presence of the parent record, which performed an extra query
-# to get the parent every time the child record was updated, even when parent has not changed.
-#++
-# Rails.application.config.active_record.belongs_to_required_validates_foreign_key = false
-
-###
-# Enable precompilation of `config.filter_parameters`. Precompilation can
-# improve filtering performance, depending on the quantity and types of filters.
-#++
-# Rails.application.config.precompile_filter_parameters = true
-
-###
-# Enable before_committed! callbacks on all enrolled records in a transaction.
-# The previous behavior was to only run the callbacks on the first copy of a record
-# if there were multiple copies of the same record enrolled in the transaction.
-#++
-# Rails.application.config.active_record.before_committed_on_all_records = true
-
-###
-# Disable automatic column serialization into YAML.
-# To keep the historic behavior, you can set it to `YAML`, however it is
-# recommended to explicitly define the serialization method for each column
-# rather than to rely on a global default.
-#++
-# Rails.application.config.active_record.default_column_serializer = nil
-
-###
-# Enable a performance optimization that serializes Active Record models
-# in a faster and more compact way.
-#
-# To perform a rolling deploy of a Rails 7.1 upgrade, wherein servers that have
-# not yet been upgraded must be able to read caches from upgraded servers,
-# leave this optimization off on the first deploy, then enable it on a
-# subsequent deploy.
-#++
-# Rails.application.config.active_record.marshalling_format_version = 7.1
-
-###
-# Run `after_commit` and `after_*_commit` callbacks in the order they are defined in a model.
-# This matches the behaviour of all other callbacks.
-# In previous versions of Rails, they ran in the inverse order.
-#++
-# Rails.application.config.active_record.run_after_transaction_callbacks_in_order_defined = true
-
-###
-# Whether a `transaction` block is committed or rolled back when exited via `return`, `break` or `throw`.
-#++
-# Rails.application.config.active_record.commit_transaction_on_non_local_return = true
-
-###
-# Controls when to generate a value for has_secure_token declarations.
-#++
-# Rails.application.config.active_record.generate_secure_token_on = :initialize
-
-###
-# ** Please read carefully, this must be configured in config/application.rb **
-#
-# Change the format of the cache entry.
-#
-# Changing this default means that all new cache entries added to the cache
-# will have a different format that is not supported by Rails 7.0
-# applications.
-#
-# Only change this value after your application is fully deployed to Rails 7.1
-# and you have no plans to rollback.
-# When you're ready to change format, add this to `config/application.rb` (NOT
-# this file):
-# config.active_support.cache_format_version = 7.1
-
-###
-# Configure Action View to use HTML5 standards-compliant sanitizers when they are supported on your
-# platform.
-#
-# `Rails::HTML::Sanitizer.best_supported_vendor` will cause Action View to use HTML5-compliant
-# sanitizers if they are supported, else fall back to HTML4 sanitizers.
-#
-# In previous versions of Rails, Action View always used `Rails::HTML4::Sanitizer` as its vendor.
-#++
-# Rails.application.config.action_view.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor
-
-###
-# Configure Action Text to use an HTML5 standards-compliant sanitizer when it is supported on your
-# platform.
-#
-# `Rails::HTML::Sanitizer.best_supported_vendor` will cause Action Text to use HTML5-compliant
-# sanitizers if they are supported, else fall back to HTML4 sanitizers.
-#
-# In previous versions of Rails, Action Text always used `Rails::HTML4::Sanitizer` as its vendor.
-#++
-# Rails.application.config.action_text.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor
-
-###
-# Configure the log level used by the DebugExceptions middleware when logging
-# uncaught exceptions during requests.
-#++
-# Rails.application.config.action_dispatch.debug_exception_log_level = :error
-
-###
-# Configure the test helpers in Action View, Action Dispatch, and rails-dom-testing to use HTML5
-# parsers.
-#
-# Nokogiri::HTML5 isn't supported on JRuby, so JRuby applications must set this to :html4.
-#
-# In previous versions of Rails, these test helpers always used an HTML4 parser.
-#++
-# Rails.application.config.dom_testing_default_html_version = :html5
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 498098ad..ce7fe141 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -148,3 +148,4 @@ en:
flash:
un_authorize: "Not Authorized"
active_session: "Logged in!"
+ invalid_apartment: "Invalid Apartment"
diff --git a/config/puma.rb b/config/puma.rb
index daaf0369..03c166f4 100644
--- a/config/puma.rb
+++ b/config/puma.rb
@@ -1,43 +1,34 @@
-# Puma can serve each request in a thread from an internal thread pool.
-# The `threads` method setting takes two numbers: a minimum and maximum.
-# Any libraries that use thread pools should be configured to match
-# the maximum value specified for Puma. Default is set to 5 threads for minimum
-# and maximum; this matches the default thread size of Active Record.
-#
-max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
-min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
-threads min_threads_count, max_threads_count
+# This configuration file will be evaluated by Puma. The top-level methods that
+# are invoked here are part of Puma's configuration DSL. For more information
+# about methods provided by the DSL, see https://puma.io/puma/Puma/DSL.html.
-# Specifies the `worker_timeout` threshold that Puma will use to wait before
-# terminating a worker in development environments.
+# Puma starts a configurable number of processes (workers) and each process
+# serves each request in a thread from an internal thread pool.
#
-worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development"
-
-# Specifies the `port` that Puma will listen on to receive requests; default is 3000.
+# The ideal number of threads per worker depends both on how much time the
+# application spends waiting for IO operations and on how much you wish to
+# to prioritize throughput over latency.
#
-port ENV.fetch("PORT") { 3000 }
-
-# Specifies the `environment` that Puma will run in.
+# As a rule of thumb, increasing the number of threads will increase how much
+# traffic a given process can handle (throughput), but due to CRuby's
+# Global VM Lock (GVL) it has diminishing returns and will degrade the
+# response time (latency) of the application.
#
-environment ENV.fetch("RAILS_ENV") { "development" }
-
-# Specifies the `pidfile` that Puma will use.
-pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
-
-# Specifies the number of `workers` to boot in clustered mode.
-# Workers are forked web server processes. If using threads and workers together
-# the concurrency of the application would be max `threads` * `workers`.
-# Workers do not work on JRuby or Windows (both of which do not support
-# processes).
+# The default is set to 3 threads as it's deemed a decent compromise between
+# throughput and latency for the average Rails application.
#
-# workers ENV.fetch("WEB_CONCURRENCY") { 2 }
+# Any libraries that use a connection pool or another resource pool should
+# be configured to provide at least as many connections as the number of
+# threads. This includes Active Record's `pool` parameter in `database.yml`.
+threads_count = ENV.fetch("RAILS_MAX_THREADS", 3)
+threads threads_count, threads_count
-# Use the `preload_app!` method when specifying a `workers` number.
-# This directive tells Puma to first boot the application and load code
-# before forking the application. This takes advantage of Copy On Write
-# process behavior so workers use less memory.
-#
-# preload_app!
+# Specifies the `port` that Puma will listen on to receive requests; default is 3000.
+port ENV.fetch("PORT", 3000)
# Allow puma to be restarted by `bin/rails restart` command.
plugin :tmp_restart
+
+# Specify the PID file. Defaults to tmp/pids/server.pid in development.
+# In other environments, only set the PID file if requested.
+pidfile ENV["PIDFILE"] if ENV["PIDFILE"]
diff --git a/config/routes.rb b/config/routes.rb
index 5c981c8a..4fcda4ca 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -42,4 +42,8 @@
# * ERRORS
match "/404", to: "errors#not_found", via: :all
match "/500", to: "errors#internal_server", via: :all
+
+ # Render dynamic PWA files from app/views/pwa/* (remember to link manifest in application.html.erb)
+ # get "manifest" => "rails/pwa#manifest", as: :pwa_manifest
+ # get "service-worker" => "rails/pwa#service_worker", as: :pwa_service_worker
end
diff --git a/db/schema.rb b/db/schema.rb
index dad57286..5d2ab4e0 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[7.1].define(version: 2024_02_09_122254) do
+ActiveRecord::Schema[7.2].define(version: 2024_02_09_122254) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
diff --git a/package.json b/package.json
index 88c30b29..a80a5bd2 100644
--- a/package.json
+++ b/package.json
@@ -1,19 +1,19 @@
{
- "name": "app",
- "private": "true",
- "dependencies": {
- "@fortawesome/fontawesome-free": "^6.7.1",
- "@hotwired/stimulus": "^3.2.2",
- "@hotwired/turbo-rails": "^8.0.12",
- "@popperjs/core": "2.11.8",
- "bootstrap": "^5.3.3",
- "debounce": "^2.2.0",
- "esbuild": "^0.24.0",
- "sass": "^1.82.0"
- },
- "scripts": {
- "build": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds --public-path=assets",
- "build:css": "sass ./app/assets/stylesheets/application.bootstrap.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules"
- },
- "packageManager": "yarn@1.22.19"
+ "name": "app",
+ "private": "true",
+ "dependencies": {
+ "@fortawesome/fontawesome-free": "^6.7.1",
+ "@hotwired/stimulus": "^3.2.2",
+ "@hotwired/turbo-rails": "^8.0.12",
+ "@popperjs/core": "2.11.8",
+ "bootstrap": "^5.3.3",
+ "debounce": "^2.2.0",
+ "esbuild": "^0.24.0",
+ "sass": "^1.82.0"
+ },
+ "scripts": {
+ "build": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds --public-path=assets",
+ "build:css": "sass ./app/assets/stylesheets/application.bootstrap.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules"
+ },
+ "packageManager": "yarn@1.22.22"
}
diff --git a/public/406-unsupported-browser.html b/public/406-unsupported-browser.html
new file mode 100644
index 00000000..7cf1e168
--- /dev/null
+++ b/public/406-unsupported-browser.html
@@ -0,0 +1,66 @@
+
+
+
+ Your browser is not supported (406)
+
+
+
+
+
+
+
+
+
Your browser is not supported.
+
Please upgrade your browser to continue.
+
+
+
+
diff --git a/public/icon.png b/public/icon.png
new file mode 100644
index 00000000..856a2cb1
Binary files /dev/null and b/public/icon.png differ
diff --git a/public/icon.svg b/public/icon.svg
new file mode 100644
index 00000000..f9c95dd9
--- /dev/null
+++ b/public/icon.svg
@@ -0,0 +1,1130 @@
+
+
diff --git a/public/images/request-response-cycle.png b/public/images/request-response-cycle.png
deleted file mode 100644
index 584f1bdf..00000000
Binary files a/public/images/request-response-cycle.png and /dev/null differ
diff --git a/public/images/schema.png b/public/images/schema.png
deleted file mode 100644
index 10fe199b..00000000
Binary files a/public/images/schema.png and /dev/null differ
diff --git a/spec/features/layout/footer_spec.rb b/spec/features/layout/footer_spec.rb
index 61669fa0..f6f6fb6b 100644
--- a/spec/features/layout/footer_spec.rb
+++ b/spec/features/layout/footer_spec.rb
@@ -10,7 +10,7 @@
end
describe "contact of" do
- before { click_link "Contact" }
+ before { click_on "Contact" }
it "email" do
within("footer") { expect(page).to have_link(nil, href: "mailto:juzershakir.webdev@gmail.com") }
diff --git a/spec/features/layout/navbar_spec.rb b/spec/features/layout/navbar_spec.rb
index 1949301b..5939535b 100644
--- a/spec/features/layout/navbar_spec.rb
+++ b/spec/features/layout/navbar_spec.rb
@@ -99,13 +99,13 @@
describe "doesn't display" do
# * Home
it do
- within("#member") { expect(page).not_to have_content("Home") }
+ within("#member") { expect(page).to have_no_content("Home") }
end
end
# * New User
it do
- within("#member") { expect(page).not_to have_content("New User") }
+ within("#member") { expect(page).to have_no_content("New User") }
end
end
@@ -124,17 +124,17 @@
# * My Profile
it do
- within("#viewer") { expect(page).not_to have_content("My Profile") }
+ within("#viewer") { expect(page).to have_no_content("My Profile") }
end
# * Home
it do
- within("#viewer") { expect(page).not_to have_content("Home") }
+ within("#viewer") { expect(page).to have_no_content("Home") }
end
# * New User
it do
- within("#viewer") { expect(page).not_to have_content("New User") }
+ within("#viewer") { expect(page).to have_no_content("New User") }
end
end
@@ -144,7 +144,7 @@
# * New Sabeel
it do
- within(".navbar-nav") { expect(page).not_to have_content("Create Sabeel") }
+ within(".navbar-nav") { expect(page).to have_no_content("Create Sabeel") }
end
end
end
diff --git a/spec/features/sabeels/active_spec.rb b/spec/features/sabeels/active_spec.rb
index 15d23c3f..0bb57ff4 100644
--- a/spec/features/sabeels/active_spec.rb
+++ b/spec/features/sabeels/active_spec.rb
@@ -27,7 +27,7 @@
describe "Generates PDF of an apartment" do # rubocop:disable RSpec/MultipleMemoizedHelpers
let(:pdf_window) { switch_to_window(windows.last) }
- before { click_link("Generate PDF") }
+ before { click_on("Generate PDF") }
it { within_window pdf_window { expect(page).to have_content("#{apt} - #{CURR_YR}") } }
it { within_window pdf_window { expect(page).to have_content(sabeel.flat_no) } }
diff --git a/spec/features/sabeels/destroy_spec.rb b/spec/features/sabeels/destroy_spec.rb
index 407496c0..df21d21b 100644
--- a/spec/features/sabeels/destroy_spec.rb
+++ b/spec/features/sabeels/destroy_spec.rb
@@ -9,7 +9,7 @@
before do
page.set_rack_session(user_id: user.id)
visit sabeel_path(sabeel)
- click_button "Delete"
+ click_on "Delete"
end
# * Admin
@@ -26,7 +26,7 @@
end
context "when clicking 'delete button'" do
- before { click_button "Yes, delete it!" }
+ before { click_on "Yes, delete it!" }
it { expect(page).to have_current_path sabeels_path(format: :html) }
diff --git a/spec/features/sabeels/edit_spec.rb b/spec/features/sabeels/edit_spec.rb
index 325d2c72..6d8aa739 100644
--- a/spec/features/sabeels/edit_spec.rb
+++ b/spec/features/sabeels/edit_spec.rb
@@ -18,7 +18,7 @@
context "with valid values" do
before do
fill_in "sabeel_mobile", with: Faker::Number.number(digits: 10)
- click_button "Update Sabeel"
+ click_on "Update Sabeel"
end
it { expect(page).to have_current_path sabeel_path(sabeel) }
@@ -29,7 +29,7 @@
context "with invalid values" do
before do
fill_in "sabeel_mobile", with: 0
- click_button "Update Sabeel"
+ click_on "Update Sabeel"
end
it { expect(page).to have_content("Mobile is the wrong length (should be 10 characters)") }
diff --git a/spec/features/sabeels/index_spec.rb b/spec/features/sabeels/index_spec.rb
index 865d852f..e8c52800 100644
--- a/spec/features/sabeels/index_spec.rb
+++ b/spec/features/sabeels/index_spec.rb
@@ -28,14 +28,14 @@
before { fill_in "q_slug_or_name_cont", with: first.its }
it { within("section#sabeels") { expect(page).to have_content(first.name) } }
- it { within("section#sabeels") { expect(page).not_to have_content(last.name) } }
+ it { within("section#sabeels") { expect(page).to have_no_content(last.name) } }
end
context "with name" do
before { fill_in "q_slug_or_name_cont", with: last.name }
it { within("section#sabeels") { expect(page).to have_content(last.name) } }
- it { within("section#sabeels") { expect(page).not_to have_content(first.name) } }
+ it { within("section#sabeels") { expect(page).to have_no_content(first.name) } }
end
end
end
diff --git a/spec/features/sabeels/new_spec.rb b/spec/features/sabeels/new_spec.rb
index c255fc4b..8c94e15e 100644
--- a/spec/features/sabeels/new_spec.rb
+++ b/spec/features/sabeels/new_spec.rb
@@ -25,7 +25,7 @@
before do
choose apartment
- click_button "Create Sabeel"
+ within("#new_sabeel") { click_on "Create Sabeel" }
end
it "redirects to newly created thaali" do
@@ -37,7 +37,9 @@
end
context "with invalid values" do
- before { click_button "Create Sabeel" }
+ before do
+ within("#new_sabeel") { click_on "Create Sabeel" }
+ end
it { expect(page).to have_content("selection is required") }
end
diff --git a/spec/features/sabeels/show_spec.rb b/spec/features/sabeels/show_spec.rb
index 4d330c62..5afee10f 100644
--- a/spec/features/sabeels/show_spec.rb
+++ b/spec/features/sabeels/show_spec.rb
@@ -56,7 +56,7 @@
end
context "when it's CURRENTLY taking it" do
- it { expect(page).not_to have_link("New Thaali") }
+ it { expect(page).to have_no_link("New Thaali") }
end
end
end
@@ -68,7 +68,7 @@
describe "action buttons" do
it_behaves_like "hide_edit_delete"
- it { expect(page).not_to have_link("New Thaali") }
+ it { expect(page).to have_no_link("New Thaali") }
end
end
end
diff --git a/spec/features/sessions/destroy_spec.rb b/spec/features/sessions/destroy_spec.rb
index fa863545..e1f66294 100644
--- a/spec/features/sessions/destroy_spec.rb
+++ b/spec/features/sessions/destroy_spec.rb
@@ -8,7 +8,7 @@
before do
page.set_rack_session(user_id: user.id)
visit thaalis_all_path(CURR_YR)
- click_link "Log out"
+ click_on "Log out"
end
it { expect(page).to have_current_path login_path }
diff --git a/spec/features/sessions/new_spec.rb b/spec/features/sessions/new_spec.rb
index 5a6c7d1c..aa0ec896 100644
--- a/spec/features/sessions/new_spec.rb
+++ b/spec/features/sessions/new_spec.rb
@@ -23,7 +23,7 @@
context "with valid credentials" do
before do
fill_in "sessions_password", with: user.password
- click_button "Login"
+ click_on "Login"
end
it "redirects to thaalis_all_path after login" do
@@ -38,7 +38,7 @@
context "with invalid credentials" do
before do
fill_in "sessions_password", with: ""
- click_button "Login"
+ click_on "Login"
end
it "displays validation error" do
diff --git a/spec/features/shared_helpers.rb b/spec/features/shared_helpers.rb
index e3f2e56b..7cac180d 100644
--- a/spec/features/shared_helpers.rb
+++ b/spec/features/shared_helpers.rb
@@ -3,8 +3,8 @@
end
shared_examples "hide_edit_delete" do
- it { expect(page).not_to have_link("Edit") }
- it { expect(page).not_to have_button("Delete") }
+ it { expect(page).to have_no_link("Edit") }
+ it { expect(page).to have_no_button("Delete") }
end
shared_examples "show_edit_delete" do
diff --git a/spec/features/thaalis/all_spec.rb b/spec/features/thaalis/all_spec.rb
index c04a6522..5ca565d6 100644
--- a/spec/features/thaalis/all_spec.rb
+++ b/spec/features/thaalis/all_spec.rb
@@ -28,7 +28,7 @@
before { fill_in "q_number_eq", with: thaali_number }
it { within("section#thaalis") { expect(page).to have_content(thaali_number) } }
- it { within("section#thaalis") { expect(page).not_to have_content(Thaali.last.number) } }
+ it { within("section#thaalis") { expect(page).to have_no_content(Thaali.last.number) } }
end
end
end
diff --git a/spec/features/thaalis/destroy_spec.rb b/spec/features/thaalis/destroy_spec.rb
index da34b97c..fdb05960 100644
--- a/spec/features/thaalis/destroy_spec.rb
+++ b/spec/features/thaalis/destroy_spec.rb
@@ -9,7 +9,7 @@
before do
page.set_rack_session(user_id: user.id)
visit thaali_path(thaali)
- click_button "Delete"
+ click_on "Delete"
end
# * Admin or Member
@@ -26,7 +26,7 @@
end
context "when clicking 'delete button'" do
- before { click_button "Yes, delete it!" }
+ before { click_on "Yes, delete it!" }
it { expect(page).to have_current_path sabeel_path(thaali.sabeel) }
it { expect(page).to have_content("Thaali destroyed") }
diff --git a/spec/features/thaalis/edit_spec.rb b/spec/features/thaalis/edit_spec.rb
index 8c987aa2..05761f4f 100644
--- a/spec/features/thaalis/edit_spec.rb
+++ b/spec/features/thaalis/edit_spec.rb
@@ -19,7 +19,7 @@
context "with valid values" do
before do
fill_in "thaali_number", with: Random.rand(1..400)
- click_button "Update Thaali"
+ click_on "Update Thaali"
end
it { expect(page).to have_content("Thaali updated") }
@@ -28,7 +28,7 @@
context "with invalid values" do
before do
fill_in "thaali_number", with: 0
- click_button "Update Thaali"
+ click_on "Update Thaali"
end
it { expect(page).to have_content("Number must be greater than 0") }
diff --git a/spec/features/thaalis/new_spec.rb b/spec/features/thaalis/new_spec.rb
index 773742fe..027642f6 100644
--- a/spec/features/thaalis/new_spec.rb
+++ b/spec/features/thaalis/new_spec.rb
@@ -48,7 +48,7 @@
context "with valid values" do
before do
choose thaali[:size].to_s.titleize
- click_button "Create Thaali"
+ click_on "Create Thaali"
end
it "redirects to newly created thaali" do
@@ -60,7 +60,7 @@
end
context "with invalid values" do
- before { click_button "Create Thaali" }
+ before { click_on "Create Thaali" }
it { expect(page).to have_content("selection is required") }
end
diff --git a/spec/features/thaalis/show_spec.rb b/spec/features/thaalis/show_spec.rb
index 706dedf0..ff42f9e4 100644
--- a/spec/features/thaalis/show_spec.rb
+++ b/spec/features/thaalis/show_spec.rb
@@ -38,13 +38,13 @@
it "balance amount is not shown" do
within("#payment-summary") do
- expect(page).not_to have_content(number_to_human(thaali.balance, precision: 1, round_mode: :down, significant: false, format: "%n%u", units: {thousand: "K", million: "M"}))
+ expect(page).to have_no_content(number_to_human(thaali.balance, precision: 1, round_mode: :down, significant: false, format: "%n%u", units: {thousand: "K", million: "M"}))
end
end
it "paid amount is not shown" do
within("#payment-summary") do
- expect(page).not_to have_content(number_to_human(thaali.paid, precision: 1, round_mode: :down, significant: false, format: "%n%u", units: {thousand: "K", million: "M"}))
+ expect(page).to have_no_content(number_to_human(thaali.paid, precision: 1, round_mode: :down, significant: false, format: "%n%u", units: {thousand: "K", million: "M"}))
end
end
@@ -79,7 +79,7 @@
context "when amount is fully paid" do
let(:thaali) { create(:taking_thaali_dues_cleared) }
- it { expect(page).not_to have_link("New Transaction") }
+ it { expect(page).to have_no_link("New Transaction") }
end
end
end
@@ -91,7 +91,7 @@
describe "action buttons" do
it_behaves_like "hide_edit_delete"
- it { expect(page).not_to have_link("New Transaction") }
+ it { expect(page).to have_no_link("New Transaction") }
end
end
end
diff --git a/spec/features/transactions/all_spec.rb b/spec/features/transactions/all_spec.rb
index 27e94b76..0a754031 100644
--- a/spec/features/transactions/all_spec.rb
+++ b/spec/features/transactions/all_spec.rb
@@ -25,7 +25,7 @@
before { fill_in "q_slug_start", with: receipt }
it { within("section#transactions") { expect(page).to have_content(receipt) } }
- it { within("section#transactions") { expect(page).not_to have_content(transactions.last.receipt_number) } }
+ it { within("section#transactions") { expect(page).to have_no_content(transactions.last.receipt_number) } }
end
end
end
diff --git a/spec/features/transactions/destroy_spec.rb b/spec/features/transactions/destroy_spec.rb
index 673a3189..b66a889a 100644
--- a/spec/features/transactions/destroy_spec.rb
+++ b/spec/features/transactions/destroy_spec.rb
@@ -9,7 +9,7 @@
before do
page.set_rack_session(user_id: user.id)
visit transaction_path(transaction)
- click_button "Delete"
+ click_on "Delete"
end
# * Admin or Member
@@ -26,7 +26,7 @@
end
context "when clicking 'delete button'" do
- before { click_button "Yes, delete it!" }
+ before { click_on "Yes, delete it!" }
it { expect(page).to have_current_path thaali_path(transaction.thaali) }
it { expect(page).to have_content("Transaction destroyed") }
diff --git a/spec/features/transactions/edit_spec.rb b/spec/features/transactions/edit_spec.rb
index 8fea0cb0..3e992733 100644
--- a/spec/features/transactions/edit_spec.rb
+++ b/spec/features/transactions/edit_spec.rb
@@ -27,7 +27,7 @@
context "with valid values" do
before do
fill_in "transaction_amount", with: Faker::Number.number(digits: 4)
- click_button "Update Transaction"
+ click_on "Update Transaction"
end
it "redirects to newly updated transaction" do
@@ -41,7 +41,7 @@
before do
incorrect_amount = total + Random.rand(1..100)
fill_in "transaction_amount", with: incorrect_amount
- click_button "Update Transaction"
+ click_on "Update Transaction"
end
it "shows validation error message for amount field" do
diff --git a/spec/features/transactions/new_spec.rb b/spec/features/transactions/new_spec.rb
index 28d0b1cc..6034a119 100644
--- a/spec/features/transactions/new_spec.rb
+++ b/spec/features/transactions/new_spec.rb
@@ -26,7 +26,7 @@
before do
choose mode
- click_button "Create Transaction"
+ click_on "Create Transaction"
end
it "redirects to newly created transaction" do
@@ -37,7 +37,7 @@
end
context "with invalid values" do
- before { click_button "Create Transaction" }
+ before { click_on "Create Transaction" }
it "shows validation error messsage for mode field" do
expect(page).to have_content("selection is required")
diff --git a/spec/features/users/destroy_spec.rb b/spec/features/users/destroy_spec.rb
index 61480f2a..832ce866 100644
--- a/spec/features/users/destroy_spec.rb
+++ b/spec/features/users/destroy_spec.rb
@@ -12,7 +12,7 @@
before do
visit user_path(user)
- click_button "Delete"
+ click_on "Delete"
end
describe "destroying self" do
@@ -28,7 +28,7 @@
end
describe "destroy" do
- before { click_button "Yes, delete it!" }
+ before { click_on "Yes, delete it!" }
it { expect(page).to have_current_path login_path }
it { expect(page).to have_content("Account deleted") }
@@ -43,7 +43,7 @@
before do
visit user_path(other_user)
- click_button "Delete"
+ click_on "Delete"
end
# * OTHER USERS
@@ -55,7 +55,7 @@
end
describe "destroy" do
- before { click_button "Yes, delete it!" }
+ before { click_on "Yes, delete it!" }
it { expect(page).to have_current_path users_path }
it { expect(page).to have_content("Account deleted") }
diff --git a/spec/features/users/edit_spec.rb b/spec/features/users/edit_spec.rb
index 72464743..9c5e3071 100644
--- a/spec/features/users/edit_spec.rb
+++ b/spec/features/users/edit_spec.rb
@@ -20,13 +20,13 @@
fill_in "user_password", with: new_password
fill_in "user_password_confirmation", with: new_password
- click_button "Update Password"
+ click_on "Update Password"
expect(page).to have_content("User updated")
end
end
context "with invalid values" do
- before { click_button "Update Password" }
+ before { click_on "Update Password" }
it "render validation error messages for 'password' field" do
expect(page).to have_content("Password must be more than 6 characters")
diff --git a/spec/features/users/index_spec.rb b/spec/features/users/index_spec.rb
index f0634ec4..5561f53c 100644
--- a/spec/features/users/index_spec.rb
+++ b/spec/features/users/index_spec.rb
@@ -26,13 +26,13 @@
end
it "button" do
- click_link other_user.name
+ click_on other_user.name
expect(page).to have_current_path user_path(other_user)
end
end
- it "will not show current admin details" do
- expect(page).not_to have_content(user.name)
+ it "does not show current admin details" do
+ expect(page).to have_no_content(user.name)
end
end
diff --git a/spec/features/users/new_spec.rb b/spec/features/users/new_spec.rb
index da10969b..2c8d3778 100644
--- a/spec/features/users/new_spec.rb
+++ b/spec/features/users/new_spec.rb
@@ -29,7 +29,7 @@
it { expect(page).to have_title "New User" }
context "with valid values" do
- before { click_button "Create User" }
+ before { click_on "Create User" }
it "is successfully created" do
expect(page).to have_content("User created")
@@ -39,7 +39,7 @@
context "with invalid values" do
before do
fill_in "user_password", with: ""
- click_button "Create User"
+ click_on "Create User"
end
it "returns a validation error message for password field" do
diff --git a/spec/models/transaction_spec.rb b/spec/models/transaction_spec.rb
index 2fdc97cc..a76f25d4 100644
--- a/spec/models/transaction_spec.rb
+++ b/spec/models/transaction_spec.rb
@@ -79,8 +79,8 @@
end
context "when using scope" do
- describe ".that_occured_on" do
- subject { described_class.that_occured_on(today) }
+ describe ".that_occurred_on" do
+ subject { described_class.that_occurred_on(today) }
let(:today) { Time.zone.now.to_date }
let(:today_transaction) { create(:today_transaction) }
diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb
index 33f696fc..9da9ad11 100644
--- a/spec/rails_helper.rb
+++ b/spec/rails_helper.rb
@@ -38,7 +38,7 @@
include ActionView::Helpers::NumberHelper
include ActionView::Helpers::DateHelper
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
- config.fixture_path = Rails.root.join("spec/fixtures").to_s
+ # config.fixture_path = Rails.root.join("spec/fixtures").to_s
# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false
diff --git a/spec/requests/sabeels/active_spec.rb b/spec/requests/sabeels/active_spec.rb
index af2666a2..fd8d24ce 100644
--- a/spec/requests/sabeels/active_spec.rb
+++ b/spec/requests/sabeels/active_spec.rb
@@ -24,8 +24,19 @@
context "with /html format" do
before { get sabeels_active_path(apartment) }
- it { expect(response).to render_template(:active) }
- it { expect(response).to have_http_status(:ok) }
+ context "with valid apartment" do
+ it { expect(response).to render_template(:active) }
+ it { expect(response).to have_http_status(:ok) }
+ end
+
+ context "with invalid apartment" do
+ let(:apartment) { Faker::Lorem.word }
+
+ it { expect(response).not_to render_template(:active) }
+ it { expect(response).to have_http_status(:found) }
+ it { expect(response).to redirect_to statistics_sabeels_path }
+ it { (expect(flash[:notice]).to eq("Invalid Apartment")) }
+ end
end
context "with /pdf format" do
diff --git a/spec/requests/sabeels/inactive_spec.rb b/spec/requests/sabeels/inactive_spec.rb
index bbac8579..d21dc52b 100644
--- a/spec/requests/sabeels/inactive_spec.rb
+++ b/spec/requests/sabeels/inactive_spec.rb
@@ -22,7 +22,18 @@
get sabeels_inactive_path(apartment)
end
- it { expect(response).to render_template(:inactive) }
- it { expect(response).to have_http_status(:ok) }
+ context "with valid apartment" do
+ it { expect(response).to render_template(:inactive) }
+ it { expect(response).to have_http_status(:ok) }
+ end
+
+ context "with invalid apartment" do
+ let(:apartment) { Faker::Lorem.word }
+
+ it { expect(response).not_to render_template(:inactive) }
+ it { expect(response).to have_http_status(:found) }
+ it { expect(response).to redirect_to statistics_sabeels_path }
+ it { (expect(flash[:notice]).to eq("Invalid Apartment")) }
+ end
end
end