Skip to content

Instantly share code, notes, and snippets.

@c80609a
Last active April 17, 2019 19:13
Show Gist options
  • Save c80609a/08d56a14272ab7dab526cb26f071d44a to your computer and use it in GitHub Desktop.
Save c80609a/08d56a14272ab7dab526cb26f071d44a to your computer and use it in GitHub Desktop.
JSON Schema 7.0 + casting + rules (f#ck ActiveModel::Validations, f#ck Virtus validations)
module Schemas
module Admin
#
# spec/schemas/admin/charter_save_schema_spec.rb
#
class CharterSaveSchema < ::Schemas::Base
# для текста обычных полей
FORMATS = {
::Dicts::Locale::RU.index.to_sym => /\A[0-9а-яА-Яa-zA-Z\d\- ,.!?—$]+\z/,
::Dicts::Locale::EN.index.to_sym => /\A[0-9a-zA-Z\d\- ,.!?—$]+\z/
}
FORMAT_SLUG = /\A[0-9a-z\d\-_]+\z/
def schema
{
required: %i[charter_category_id slug price price_currency_id stopped_at started_at ru en],
properties: {
charter_category_id: {
type: :number,
enum: Dicts::CharterCategory::ALL.collect(&:id),
cast: ->(value) { normalize_integer(value) }
},
slug: {
type: :string,
cast: ->(value) { strip_string(value) },
rule: ->(parents) { slug_rule(parents) }
},
price: {
type: :number,
cast: ->(value) { normalize_integer(value) },
rule: ->(parents) { price_rule(parents) }
},
price_currency_id: {
type: :number,
enum: Dicts::Currency::ALL2.collect(&:id),
cast: ->(value) { normalize_integer(value) }
},
stopped_at: {
cast: ->(value) { to_date(value) }
},
started_at: {
cast: ->(value) { to_date(value) }
},
::Dicts::Locale::RU.index.to_sym => schema_loc,
::Dicts::Locale::EN.index.to_sym => schema_loc
}
}
end
def schema_loc
{
type: :hash,
required: %i[description meta_description meta_title name short_description],
properties: {
description: {
type: %i[null string],
cast: ->(value) { strip_string(value) },
rule: ->(parents) { description_rule(parents) }
},
meta_description: {
type: %i[null string],
cast: ->(value) { clear_html(strip_string(value)) },
rule: ->(parents) { meta_description_rule(parents) }
},
meta_title: {
type: %i[null string],
cast: ->(value) { clear_html(strip_string(value)) },
rule: ->(parents) { meta_title_rule(parents) }
},
name: {
type: %i[null string],
cast: ->(value) { clear_html(strip_string(value)) },
rule: ->(parents) { name_rule(parents) }
},
short_description: {
type: %i[null string],
cast: ->(value) { clear_html(strip_string(value)) },
rule: ->(parents) { short_description_rule(parents) }
},
}
}
end
def price_rule(parents)
messages = {
present: I18n.t('errors.messages.invalid'),
lt: I18n.t('errors.messages.too_much', max: 500_000),
gt: I18n.t('errors.messages.too_low', min: 100)
}
rule(:price, parents, messages) { present? & lt?(500_000) & gt?(100) }
end
def slug_rule(parents)
messages = {
present: I18n.t('errors.messages.invalid'),
format: I18n.t('errors.slug.invalid'),
length_between: I18n.t('errors.messages.length_invalid', min: 2, max: 255)
}
rule(:slug, parents, messages) { present? & format?(FORMAT_SLUG) & length_between?(2..255) }
end
def description_rule(parents)
messages = {
present: I18n.t('errors.messages.invalid'),
length_between: I18n.t('errors.messages.length_invalid', min: 600, max: 65535)
}
rule(:description, parents, messages) { present? & length_between?(600..65535) }
end
def name_rule(parents)
messages = {
present: I18n.t('errors.messages.invalid'),
format: I18n.t('errors.messages.invalid_symbols', lcl: parents.first.to_s.upcase),
length_between: I18n.t('errors.messages.length_invalid', min: 2, max: 255)
}
rule(:name, parents, messages) { present? & format?(FORMATS[parents.first]) & length_between?(2..255) }
end
def meta_title_rule(parents)
messages = {
present: I18n.t('errors.messages.invalid'),
format: I18n.t('errors.messages.invalid_symbols', lcl: parents.first.to_s.upcase),
length_between: I18n.t('errors.messages.length_invalid', min: 2, max: 255)
}
rule(:meta_title, parents, messages) { present? & format?(FORMATS[parents.first]) & length_between?(2..255) }
end
def short_description_rule(parents)
messages = {
present: I18n.t('errors.messages.invalid'),
format: I18n.t('errors.messages.invalid_symbols', lcl: parents.first.to_s.upcase),
length_between: I18n.t('errors.messages.length_invalid', min: 2, max: 166)
}
rule(:short_description, parents, messages) { present? & format?(FORMATS[parents.first]) & length_between?(2..200) }
end
def meta_description_rule(parents)
messages = {
present: I18n.t('errors.messages.invalid'),
format: I18n.t('errors.messages.invalid_symbols', lcl: parents.first.to_s.upcase),
length_between: I18n.t('errors.messages.length_invalid', min: 2, max: 300)
}
rule(:meta_description, parents, messages) { present? & format?(FORMATS[parents.first]) & length_between?(2..300) }
end
end
end
end
require 'rails_helper'
class UpdatingCharter
def self.params
{
"charter_category_id": "2",
"slug": "the-bahamas",
"price": "2656",
"price_currency_id": "2",
"stopped_at": "31/08/2019",
"started_at": "18/04/2019",
"ru": {
"name": "Багамские острова",
"description": "\u003cp style=\"text-align: justify;\"\u003e\u003cspan style=\"color:#000000;\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003e\u0026nbsp; \u0026nbsp; Багамские острова расположены в Атлантическом океане между Малыми Антильскими островами и побережьем штата Флорида. Архипелаг состоит из 700 обитаемых островов и 2000 коралловых рифов. Багамы, известные в мире роскошными курортами, стали популярным направлением для отдыха на яхте.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align: justify;\"\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align: justify;\"\u003e\u003cspan style=\"color:#000000;\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;На Багамах тепло круглый год, но лучше всего бронировать яхту в период с ноября по май. В это время столбики термометра не поднимаются выше +25\u0026deg;C и нет сезона дождей. Если вы путешествуете с семьей или с друзьями, рекомендуем арендовать яхту на Багамах с экипажем. Так вы не будете отвлекаться на управление судном и полностью погрузитесь в атмосферу отдыха. У тех, кто хочет взять в аренду лодку без капитана, должна быть лицензия на управление морским судном.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align: justify;\"\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align: justify;\"\u003e\u003cspan style=\"color:#000000;\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; \u0026nbsp;На островах нередко устраивают регаты и яхтенные выставки, проводят множество фестивалей, которые интересно посетить особенно в рождественские праздники.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align: justify;\"\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align: justify;\"\u003e\u003cspan style=\"color:#000000;\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; На арендованной лодке можно пришвартоваться буквально у каждого острова: даже в небольших уютных гаванях, на первый взгляд необитаемых, есть причалы. Абако, Нью-Провиденс, Большой Багама и многие другие большие острова известны прекрасно оборудованными маринами и портами.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align: justify;\"\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align:center\"\u003e\u003cimg alt=\"\" height=\"400\" src=\"/ckeditor_assets/pictures/853/content_bagams.jpg\" width=\"600\" /\u003e\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align: justify;\"\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align: justify;\"\u003e\u003cspan style=\"color:#000000;\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;Многие острова принадлежат звездам шоу-бизнеса и другим публичным личностям. Отдых на Багамах принято относить к элитному, поэтому сервис предоставляется на высшем уровне. Планируя заказать яхт-тур на Багамах, внесите в список для обязательного посещения следующие места:\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;1. Острова Бимини находятся недалеко от Майами, еще одной яхтенной столицы Карибского бассейна. \u0026nbsp;Выбор, как провести время, за вами: можно заняться рыбалкой, дайвингом или позагорать на белоснежных пляжах. На Бимини жил Эрнест Хемингуэй. Говорят, в гостинице \u0026laquo;У Большого Джона\u0026raquo; сохранились личные вещи писателя.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;2. На Большом Багаме много развлекательных заведений: казино, ресторанов, кабаре и многих других. Если путешествуете с детьми, посетите Мемориальный природный центр Ранд с тропическими садами и искусственным коралловым рифом.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;3. Любителям яхтенного спорта следует отправиться на архипелаг Абако. Здесь почти не бывает штормов, а в защищенных рифами водах даже новички могут чувствовать себя в безопасности. Для туризма на побережье подойдет центральный город Марш-Харбор. На рифе Треш-Кей есть отличное поле для гольфа, а Валк-Кей славится спортивной рыбалкой. Поужинать опытные путешественники рекомендуют в ресторанах на рифе Грейт-Гуана.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;4. Для шоппинга лучше всего отправиться в Нассау, столицу Багамских островов, и в Нью-Провиденс.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;5. В коралловых рифах архипелага Эксума сосредоточены самые интересные сайты с цветными коралловыми рифами и тропическими рыбками, затонувшими кораблями и подводными пещерами.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;Чартер яхт и катеров на Багамах сделает ваш отдых незабываемым: устраивайте ночные вечеринки на берегу или же наслаждайтесь покоем среди необитаемых островов и коралловых рифов. Если вы хотите заняться дайвингом или прокатиться на гидроциклах, рекомендуем указать о всех пожеланиях перед бронированием яхты. Мы учтем их, и вы отправитесь в круиз с подготовленным оборудованием для занятия водными видами спорта. \u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;Выберите свою яхту, а о вашем отдыхе позаботится GetBoat.com.\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align: justify;\"\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align:center\"\u003e\u003cimg alt=\"\" height=\"400\" src=\"/ckeditor_assets/pictures/858/content_bogami.jpg\" width=\"600\" /\u003e\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align: justify;\"\u003e\u0026nbsp;\u003c/p\u003e\r\n",
"short_description": "Багамы — известные в мире роскошными курортами, стали популярным направлением для отдыха на яхте.",
"meta_title": "Аренда Яхт, Катеров и Лодок на Багамах по лучшей Цене",
"meta_description": "Лучшие предложения по аренде яхт на Багамах с капитаном и без. Возьмите в прокат катер или яхту и отправляйтесь в увлекательный яхт-тур по Багамам."
},
"en": {
"name": "The Bahamas",
"description": "\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;The Bahamas is an archipelagic country in the Atlantic ocean between the Lesser Antilles and the coast of Florida. It consists of 700 islands and 2,000 coral reefs. The Bahamas is famous for its luxury resorts thus being a popular destination for yacht vacations.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;It is always warm on the Bahamas, but yachting is especially great between November and May. The temperature does not rise above +25\u0026deg;C, and there is no rain. If you are traveling with family or friends, rent a yacht with a crew so that you could enjoy your holiday without thinking about navigation. If you want to navigate the yacht by yourself, remember that a captain\u0026rsquo;s license is required.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;The Bahamas often host regattas, yacht exhibitions, and various festivals \u0026mdash; spending Christmas while attending them can be quite fun.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;A rented yacht means you can visit practically any island, even with the smallest harbors \u0026mdash; those which seem uninhabited do have small berths. There are many ports and marinas on Abaco Island, New Providence, and Grand Bahama \u0026mdash; yacht infrastructure is well-developed here. Some of the islands belong to celebrities, and, as the Bahamas is considered a luxury destination, the service is usually exquisite.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align:center\"\u003e\u003cimg alt=\"\" height=\"400\" src=\"/ckeditor_assets/pictures/853/content_bagams.jpg\" width=\"600\" /\u003e\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;If you are planning a yacht tour at the Bahamas, don\u0026rsquo;t forget to visit the following places:\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;1. Bimini Island is close to Miami, another Caribbean yacht center. Guests may go fishing or diving or simply enjoy the sun on the lovely beaches of this island where, by the way, Ernest Hemingway once lived. They say that some of his personal belongings are still kept in the Big John\u0026rsquo;s Hotel.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;2. Grand Bahama is quite entertaining: there are casinos, restaurants, and cabarets. If you are traveling with kids, though, then a trip to Rand Nature Center with its tropical gardens and a man-made reef could be quite edifying.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;3. The Abaco Islands were made for the fans of yachting. Almost no storms, so it is completely safe to travel independently even without proper experience. Marsh Harbor is great for enjoying a beach vacation; those who want may go fishing or play golf. Several great restaurants are located on the Great Guana Cay in the center of the Abaco Islands.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;4. Nassau, the capital of the Bahamas, and New Providence are perfect for shopping.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;5. Exuma is a great destination for diving as there are numerous coral reefs, colorful fish, sunken ships, and underwater caves. Jet skiing is quite popular here, too.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;Renting a yacht while in Bahamas will make your holiday unforgettable. Host parties on the seashore, enjoy the islands and coral reefs, go diving or jet skiing\u0026mdash;we can provide everything you need \u0026mdash; just give us the details upon submitting your order.\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp;Choose a yacht, and GetBoat.com will take care of the rest!\u003c/p\u003e\r\n\r\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align: justify;\"\u003e\u0026nbsp;\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align:center\"\u003e\u003cimg alt=\"\" height=\"400\" src=\"/ckeditor_assets/pictures/858/content_bogami.jpg\" width=\"600\" /\u003e\u003c/p\u003e\r\n\r\n\u003cp style=\"text-align: justify;\"\u003e\u0026nbsp;\u003c/p\u003e\r\n",
"short_description": "The Bahamas — is famous for its luxury resorts thus being a popular destination for yacht vacations.",
"meta_title": "Rent of Yachts, Boats and Boats in the Bahamas at the best Price",
"meta_description": "Best yacht rental deals in the Bahamas with or without captain. Rent a boat or yacht and go on an exciting yacht tour of the Bahamas."
}
}
end
end
describe 'schema', focus: 'check_charter_schema' do
describe 'Все данные в порядке:' do
it 'works' do
schema = ::Schemas::Admin::CharterSaveSchema.new UpdatingCharter.params
result = schema.valid?
expect(result).to eq true
end
%i[name meta_title short_description meta_description].each do |field|
it ('В русском "%s" английские символы - это норм' % field) do
params = UpdatingCharter.params
params[:ru][field] = 'Жили были starik so staruhoi'
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq true
end
end
end
describe 'Данные не в порядке:' do
describe 'Нехватает атрибутов:' do
describe '#schema' do
it 'Если отсутствует один из атрибутов - JSON::Schema::ValidationError should be thrown' do
%i[charter_category_id slug price price_currency_id stopped_at started_at ru en].each do |attr|
params = UpdatingCharter.params
params.delete attr
expect { ::Schemas::Admin::CharterSaveSchema.new params }.to raise_exception JSON::Schema::ValidationError
end
end
end
describe '#schema_loc' do
it 'Если отсутствует один из атрибутов - JSON::Schema::ValidationError should be thrown' do
%i[name description short_description meta_description meta_title].each do |attr|
params = UpdatingCharter.params
params[:en].delete attr
expect { ::Schemas::Admin::CharterSaveSchema.new params }.to raise_exception JSON::Schema::ValidationError
end
end
end
end
describe 'Неправильные атрибуты:' do
describe '#schema:' do
it 'Если slug too short - невалидная схема + релевантное сообщение об ошибке' do
params = UpdatingCharter.params
params[:slug] = '1'
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq false
expect(schema.errors.messages[:slug].length).to eq 1
end
it 'Если slug too long - невалидная схема + релевантное сообщение об ошибке' do
params = UpdatingCharter.params
params[:slug] = '1' * 256
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq false
expect(schema.errors.messages[:slug].length).to eq 1
end
it 'Если price too low - невалидная схема + релевантное сообщение об ошибке' do
params = UpdatingCharter.params
params[:price] = 99
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq false
expect(schema.errors.messages[:price].length).to eq 1
end
it 'Если price too high - невалидная схема + релевантное сообщение об ошибке' do
params = UpdatingCharter.params
params[:price] = 999_999
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq false
expect(schema.errors.messages[:price].length).to eq 1
end
it 'В slug неподходящие символы - схема невалидна, релевантное сообщение об ошибке' do
params = UpdatingCharter.params
params[:slug] = 'wrong slug'
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq false
expect(schema.errors.messages[:slug].length).to eq 1
end
end
describe '#schema_loc:' do
it 'Если name too short - невалидная схема + релевантное сообщение об ошибке' do
params = UpdatingCharter.params
params[:en][:name] = '1'
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq false
expect(schema.errors.messages[:en][:name].length).to eq 1
end
it 'Если name too long - невалидная схема + релевантное сообщение об ошибке' do
params = UpdatingCharter.params
params[:en][:name] = '1'*256
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq false
expect(schema.errors.messages[:en][:name].length).to eq 1
end
#
it 'Если short description too short - невалидная схема + релевантное сообщение об ошибке' do
params = UpdatingCharter.params
params[:en][:short_description] = '1'
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq false
expect(schema.errors.messages[:en][:short_description].length).to eq 1
end
it 'Если short description too long - невалидная схема + релевантное сообщение об ошибке' do
params = UpdatingCharter.params
params[:en][:short_description] = '1'*201
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq false
expect(schema.errors.messages[:en][:short_description].length).to eq 1
end
#
it 'Если meta description too short - невалидная схема + релевантное сообщение об ошибке' do
params = UpdatingCharter.params
params[:en][:meta_description] = '1'
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq false
expect(schema.errors.messages[:en][:meta_description].length).to eq 1
end
it 'Если meta description too long - невалидная схема + релевантное сообщение об ошибке' do
params = UpdatingCharter.params
params[:en][:meta_description] = '1'*301
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq false
expect(schema.errors.messages[:en][:meta_description].length).to eq 1
end
#
it 'Если description too short - невалидная схема + релевантное сообщение об ошибке' do
params = UpdatingCharter.params
params[:en][:description] = '1'*555
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq false
expect(schema.errors.messages[:en][:description].length).to eq 1
end
it 'Если description too long - невалидная схема + релевантное сообщение об ошибке' do
params = UpdatingCharter.params
params[:en][:description] = '1'*70009
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq false
expect(schema.errors.messages[:en][:description].length).to eq 1
end
end
end
describe 'Неподходящие символы в локализованных полях:' do
%i[name meta_title short_description meta_description].each do |field|
it ('В английском "%s" русские символы - схема невалидна, релевантное сообщение об ошибке' % field) do
params = UpdatingCharter.params
params[:en][field] = 'Жили были starik so staruhoi'
schema = ::Schemas::Admin::CharterSaveSchema.new params
#
expect(schema.valid?).to eq false
expect(schema.errors.messages[:en][field].length).to eq 1
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment