Ajout de MetadataMapping

Base d'éléments de comparaison pour extraire des données à utiliser dans 
les Email (nom de serveur, nom de client…).
This commit is contained in:
Jérémy Lecour 2021-01-04 22:03:24 +01:00 committed by Jérémy Lecour
parent 8b59ee3b91
commit e4585b92e3
21 changed files with 514 additions and 32 deletions

View file

@ -0,0 +1,3 @@
// Place all the styles related to the metadata_mappings controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: https://sass-lang.com/

View file

@ -0,0 +1,74 @@
class MetadataMappingsController < ApplicationController
before_action :set_metadata_mapping, only: [:show, :edit, :update, :destroy]
# GET /metadata_mappings
# GET /metadata_mappings.json
def index
@metadata_mappings = MetadataMapping.all.order(entity: :asc, server: :asc, input: :asc)
end
# GET /metadata_mappings/1
# GET /metadata_mappings/1.json
def show
end
# GET /metadata_mappings/new
def new
@metadata_mapping = MetadataMapping.new
end
# GET /metadata_mappings/1/edit
def edit
end
# POST /metadata_mappings
# POST /metadata_mappings.json
def create
@metadata_mapping = MetadataMapping.new(metadata_mapping_params)
respond_to do |format|
if @metadata_mapping.save
format.html { redirect_to @metadata_mapping, notice: 'Metadata mapping was successfully created.' }
format.json { render :show, status: :created, location: @metadata_mapping }
else
format.html { render :new }
format.json { render json: @metadata_mapping.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /metadata_mappings/1
# PATCH/PUT /metadata_mappings/1.json
def update
respond_to do |format|
if @metadata_mapping.update(metadata_mapping_params)
format.html { redirect_to @metadata_mapping, notice: 'Metadata mapping was successfully updated.' }
format.json { render :show, status: :ok, location: @metadata_mapping }
else
format.html { render :edit }
format.json { render json: @metadata_mapping.errors, status: :unprocessable_entity }
end
end
end
# DELETE /metadata_mappings/1
# DELETE /metadata_mappings/1.json
def destroy
@metadata_mapping.destroy
respond_to do |format|
format.html { redirect_to metadata_mappings_url, notice: 'Metadata mapping was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_metadata_mapping
@metadata_mapping = MetadataMapping.find(params[:id])
end
# Only allow a list of trusted parameters through.
def metadata_mapping_params
params.require(:metadata_mapping).permit(:input, :server, :entity)
end
end

View file

@ -0,0 +1,2 @@
module MetadataMappingsHelper
end

View file

@ -0,0 +1,2 @@
class MetadataMapping < ApplicationRecord
end

View file

@ -1,12 +1,17 @@
class EmailImporter
attr_accessor :klass
attr_accessor :email_class
attr_accessor :metadata_mapping_class
def initialize(klass = Email)
@klass = klass
def initialize(
email_class: Email,
metadata_mapping_class: MetadataMapping,
@email_class = email_class
@metadata_mapping_class = metadata_mapping_class
end
def import(mail)
email = klass.new(
email = email_class.new(
message_id: mail.message_id,
subject: mail.subject,
date: mail.date,
@ -65,52 +70,72 @@ class EmailImporter
(mail.subject.present? && mail.subject.match?(/cron/i)) \
|| mail.header["X-Cron-Env"].present?
end
def mailing_list?(mail)
mail.header["List-Unsubscribe"].present?
end
def clients(mail)
header = mail.header["X-Client-Id"]
if header.respond_to?(:map)
header.map(&:value)
elsif header.respond_to?(:value)
header.value
end
metadata(mail).filter_map(&:entity).uniq
end
def servers(mail)
["To", "Delivered-To", "From", "Subject"].filter_map() { |header|
mail.header[header]
}.flatten.map(&:value).select { |text|
if address_match_evolix_net?(text)
extract_server_name_from_address(text)
end
}
metadata(mail).filter_map(&:server).uniq
end
def tickets(mail)
header = mail.header["X-Ticket-Id"]
values_from_header(header: mail.header["X-Ticket-Id"])
end
def values_from_header(header:, default: [])
if header.respond_to?(:map)
header.map(&:value)
elsif header.respond_to?(:value)
header.value
Array(header.value)
elsif block_given?
yield(header)
else
default
end
end
def address_match_evolix_net?(address)
address.match?(/@(.+)\.evolix\.net/i)
end
def extract_server_name_from_address(address)
address.match(/@(.+)\.evolix\.net/i)[1]
def metadata(mail)
@metadata ||= metadata_mapping_class.where(input: metadata_inputs(mail)).all
end
def values_for_header(header)
if header.present?
if header.respond_to?(:map)
header.map(&:value)
def metadata_inputs(mail)
inputs = []
# add mail addresses and hostnames from headers
inputs << ["To", "Delivered-To", "X-Original-To", "From", "Subject"].filter_map { |header_name|
mail.header[header_name]
}.flatten.map(&:value).filter_map() { |header_value|
keep_email_and_hostnames(header_value)
}.flatten.filter_map() { |value|
clean_subdomains(value)
}.flatten
# add other values from headers
inputs << mail.header["X-Client-Id"]
inputs.uniq
end
def keep_email_and_hostnames(string)
pattern = /\b((?:([-a-zA-Z0-9\._]+)@)?((?:[-a-zA-Z0-9\._]*)(?:\.[a-z]{2,})))\b/
results = string.scan(pattern)
if results.present?
results.map(&:first)
end
end
def clean_subdomains(value)
[
[/[-a-zA-Z0-9\._]+@([-a-zA-Z0-9]+).evolix.net/, '@\1']
].filter_map { |item|
if value.match?(item[0])
value.gsub!(item[0], item[1])
else
header.value
value
end
end
}
end
end

View file

@ -0,0 +1,32 @@
<%= form_with(model: metadata_mapping) do |form| %>
<% if metadata_mapping.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(metadata_mapping.errors.count, "error") %> prohibited this metadata_mapping from being saved:</h2>
<ul>
<% metadata_mapping.errors.each do |error| %>
<li><%= error.full_message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= form.label :input %>
<%= form.text_field :input %>
</div>
<div class="field">
<%= form.label :server %>
<%= form.text_field :server %>
</div>
<div class="field">
<%= form.label :entity %>
<%= form.text_field :entity %>
</div>
<div class="actions">
<%= form.submit %>
</div>
<% end %>

View file

@ -0,0 +1,2 @@
json.extract! metadata_mapping, :id, :input, :server, :entity, :created_at, :updated_at
json.url metadata_mapping_url(metadata_mapping, format: :json)

View file

@ -0,0 +1,6 @@
<h1>Editing Metadata Mapping</h1>
<%= render 'form', metadata_mapping: @metadata_mapping %>
<%= link_to 'Show', @metadata_mapping %> |
<%= link_to 'Back', metadata_mappings_path %>

View file

@ -0,0 +1,31 @@
<p id="notice"><%= notice %></p>
<h1>Metadata Mappings</h1>
<table>
<thead>
<tr>
<th>Input</th>
<th>Server</th>
<th>Entity</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @metadata_mappings.each do |metadata_mapping| %>
<tr>
<td><%= metadata_mapping.input %></td>
<td><%= metadata_mapping.server %></td>
<td><%= metadata_mapping.entity %></td>
<td><%= link_to 'Show', metadata_mapping %></td>
<td><%= link_to 'Edit', edit_metadata_mapping_path(metadata_mapping) %></td>
<td><%= link_to 'Destroy', metadata_mapping, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New Metadata Mapping', new_metadata_mapping_path %>

View file

@ -0,0 +1 @@
json.array! @metadata_mappings, partial: "metadata_mappings/metadata_mapping", as: :metadata_mapping

View file

@ -0,0 +1,5 @@
<h1>New Metadata Mapping</h1>
<%= render 'form', metadata_mapping: @metadata_mapping %>
<%= link_to 'Back', metadata_mappings_path %>

View file

@ -0,0 +1,19 @@
<p id="notice"><%= notice %></p>
<p>
<strong>Input:</strong>
<%= @metadata_mapping.input %>
</p>
<p>
<strong>Server:</strong>
<%= @metadata_mapping.server %>
</p>
<p>
<strong>Entity:</strong>
<%= @metadata_mapping.entity %>
</p>
<%= link_to 'Edit', edit_metadata_mapping_path(@metadata_mapping) %> |
<%= link_to 'Back', metadata_mappings_path %>

View file

@ -0,0 +1 @@
json.partial! "metadata_mappings/metadata_mapping", metadata_mapping: @metadata_mapping

View file

@ -1,6 +1,7 @@
require 'sidekiq/web'
Rails.application.routes.draw do
resources :metadata_mappings
resources :emails
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
mount Sidekiq::Web => '/sidekiq'

View file

@ -0,0 +1,12 @@
class CreateMetadataMappings < ActiveRecord::Migration[6.1]
def change
create_table :metadata_mappings do |t|
t.string :input
t.string :server
t.string :entity
t.timestamps
end
add_index :metadata_mappings, :input
end
end

View file

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2020_12_27_094508) do
ActiveRecord::Schema.define(version: 2021_01_03_174702) do
create_table "action_mailbox_inbound_emails", force: :cascade do |t|
t.integer "status", default: 0, null: false
@ -44,7 +44,7 @@ ActiveRecord::Schema.define(version: 2020_12_27_094508) do
end
create_table "active_storage_variant_records", force: :cascade do |t|
t.bigint "blob_id", null: false
t.integer "blob_id", null: false
t.string "variation_digest", null: false
t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
end
@ -67,6 +67,15 @@ ActiveRecord::Schema.define(version: 2020_12_27_094508) do
t.datetime "updated_at", precision: 6, null: false
end
create_table "metadata_mappings", force: :cascade do |t|
t.string "input"
t.string "server"
t.string "entity"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["input"], name: "index_metadata_mappings_on_input"
end
add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
end

View file

@ -5,3 +5,147 @@
#
# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }])
# Character.create(name: 'Luke', movie: movies.first)
MetadataMapping.create([
{input: "@aixbackup01", server: "aixbackup01", entity: "evolix"},
{input: "@apparaitre", server: "apparaitre", entity: "apparaitre"},
{input: "@avancie-monitoring00", server: "avancie-monitoring00", entity: "avancie"},
{input: "@azoth-www00", server: "azoth-www00", entity: "azothsystems"},
{input: "@bebeto2", server: "bebeto2", entity: "evolix"},
{input: "@casoni", server: "casoni", entity: "evolix"},
{input: "@cleo-files1", server: "cleo-files1", entity: "cleo"},
{input: "@cloud0-source0", server: "capitaldata-cloud0-source0", entity: "capitaldata"},
{input: "@cogepart-www01", server: "cogepart-www01", entity: "cogepart"},
{input: "@componize-recovery-eu3", server: "componize-recovery-eu3", entity: "componize"},
{input: "@cybercartes-www24", server: "cybercartes-www24", entity: "cybercartes"},
{input: "@ebizproduction-confplus", server: "ebizproduction-confplus", entity: "ebizproduction"},
{input: "@edumedia", server: "edumedia", entity: "edumedia"},
{input: "@evolix.fr", server: nil, entity: "evolix"},
{input: "@exotismes-sql6", server: "exotismes-sql6", entity: "exotismes"},
{input: "@golfup", server: "golfup", entity: "golfup"},
{input: "@hbv5", server: "hbv5", entity: ""},
{input: "@hbv7", server: "hbv7", entity: ""},
{input: "@hbv8", server: "hbv8", entity: ""},
{input: "@hexacoffre", server: "hexacoffre", entity: "hexacoffre"},
{input: "@highco-prixing-www00", server: "highco-prixing-www00", entity: ""},
{input: "@highco-rmw-sas01", server: "highco-rmw-sas01", entity: ""},
{input: "@hosting05", server: "hosting05", entity: "evolix"},
{input: "@itupkeep-sql00", server: "itupkeep-sql00", entity: "itupkeep"},
{input: "@itupkeep-www10", server: "itupkeep-www10", entity: "itupkeep"},
{input: "@jobinlive-intra", server: "jobinlive-intra", entity: "jobinlive"},
{input: "@kampn-dev01", server: "kampn-dev01", entity: "kampn"},
{input: "@kampn-kvm00", server: "kampn-kvm00", entity: "kampn"},
{input: "@kampn-search-docker01", server: "kampn-search-docker01", entity: "kampn"},
{input: "@lepape-sql02", server: "lepape-sql02", entity: "lepape"},
{input: "@lepape-sql03", server: "lepape-sql03", entity: "lepape"},
{input: "@mediaaccess4", server: "mediaaccess4", entity: "mediaaccess"},
{input: "@mediaaccess-dev00", server: "mediaaccess-dev00", entity: "mediaaccess"},
{input: "@nouveauxterritoires-preprod-fcnz", server: "nouveauxterritoires-preprod-fcnz", entity: "nouveauxterritoires"},
{input: "@overcome-web2", server: "overcome-web2", entity: "overcome"},
{input: "@overcome-web3", server: "overcome-web3", entity: "overcome"},
{input: "@preprod-elk", server: "nouveauxterritoires-preprod-elk", entity: "nouveauxterritoires"},
{input: "@preprod-fcnz", server: "preprod-fcnz", entity: "nouveauxterritoiresnouveauxterritoires"},
{input: "@prodlxsas01", server: "prodlxsas01", entity: ""},
{input: "@quai13-backup3", server: "quai13-backup3", entity: "quai13"},
{input: "@quai13-www11", server: "quai13-www11", entity: "quai13"},
{input: "@quai13-www21", server: "quai13-www21", entity: "quai13"},
{input: "@sjvidil", server: "sjvidil", entity: "externmarket"},
{input: "@smsmode-sql01", server: "smsmode-sql01", entity: "smsmode"},
{input: "@socgen00", server: "socgen00", entity: "socgen"},
{input: "@spinon-www01", server: "spinon-www01", entity: "spinon"},
{input: "@stratis-www01", server: "stratis-www01", entity: "stratis"},
{input: "@stratis-www02", server: "stratis-www02", entity: "stratis"},
{input: "@tourismit-iter", server: "tourismit-iter", entity: "tourismit"},
{input: "@tyredating-yepgarage-paris-web02", server: "tyredating-yepgarage-paris-web02", entity: "tyredating"},
{input: "@tyredating-yepgarage-singapore-adm01", server: "tyredating-yepgarage-singapore-adm01", entity: "tyredating"},
{input: "@viaxoft-mrs2-sql08", server: "viaxoft-mrs2-sql08", entity: "viaxoft"},
{input: "@viaxoft-mrs2-sql08", server: nil, entity: "viaxoft"},
{input: "@viaxoft-mrs2-tomcat11", server: "viaxoft-mrs2-tomcat11", entity: "viaxoft"},
{input: "@viaxoft-mrs-tomcat05", server: "viaxoft-mrs-tomcat05", entity: ""},
{input: "@viaxoft-mrs-tomcat05", server: "viaxoft-mrs-tomcat05", entity: "viaxoft"},
{input: "@webcom-adm02", server: "webcom-adm02", entity: "webcom"},
{input: "@webcom-www05", server: "webcom-www05", entity: "webcom"},
{input: "@winnie2", server: "winnie2", entity: "evolix"},
{input: "@winnie", server: "winnie", entity: "evolix"},
{input: "@www10.quai13.net", server: "quai13-www10", entity: "quai13"},
{input: "@www11.quai13.net", server: "quai13-www11", entity: "quai13"},
{input: "@www20.quai13.net", server: "quai13-www20", entity: "quai13"},
{input: "@www21.quai13.net", server: "quai13-www21", entity: "quai13"},
{input: "Customer.Services@interxion.com", server: nil, entity: "interxion"},
{input: "alexis.chevalier@celeste.fr", server: nil, entity: "icademie"},
{input: "aubagne-glastint.com@glastint.com", server: nil, entity: "glastint"},
{input: "azothsystems@evolix.net", server: nil, entity: "azothsystems"},
{input: "@quai13-backup3", server: "quai13-backup3", entity: "quai13"},
{input: "bleucom@evolix.net", server: nil, entity: "bleucom"},
{input: "capitaldata@evolix.net", server: nil, entity: "capitaldata"},
{input: "cbathelet@si-cloud.fr", server: nil, entity: "progexia"},
{input: "cleo@evolix.net", server: nil, entity: "cleo"},
{input: "contact@coffre-fort.be", server: nil, entity: "hexacoffre"},
{input: "courriel@fub.fr", server: nil, entity: "fub"},
{input: "customer.services@interxion.com", server: nil, entity: "interxion"},
{input: "cybercartes-compta@evolix.net", server: nil, entity: "cybercartes"},
{input: "cybercartes@evolix.net", server: nil, entity: "cybercartes"},
{input: "ebizproduction@evolix.net", server: nil, entity: "ebizproduction"},
{input: "equipe@evolix.net", server: nil, entity: "evolix"},
{input: "expiry@letsencrypt.org", server: nil, entity: ""},
{input: "f.manneville@purjus.fr", server: nil, entity: "purjus"},
{input: "florajet@evolix.net", server: nil, entity: "florajet"},
{input: "fluotonic@evolix.net", server: nil, entity: "fluotonic"},
{input: "fub@evolix.net", server: nil, entity: "fub"},
{input: "guillaume.schachtele@opnsecure.com", server: nil, entity: "bazile"},
{input: "hexacoffre@evolix.net", server: nil, entity: "hexacoffre"},
{input: "icademie@evolix.net", server: nil, entity: "icademie"},
{input: "informatique@bazile.fr", server: nil, entity: "bazile"},
{input: "investprev@dpvatonline.com.br", server: nil, entity: ""},
{input: "j.ponchel@icademie.com", server: nil, entity: "icademie"},
{input: "jjobard@bazile.fr", server: nil, entity: "bazile"},
{input: "jobinlive@evolix.net", server: nil, entity: "jobinlive"},
{input: "jobintree@evolix.net", server: nil, entity: "jobintree"},
{input: "kampn-dev01.evolix.net", server: nil, entity: "kampn"},
{input: "kampn@evolix.net", server: nil, entity: "kampn"},
{input: "keyline@evolix.net", server: nil, entity: "preferendum"},
{input: "kopel@evolix.ca", server: nil, entity: "kopel"},
{input: "l2-support@franceix.net", server: nil, entity: "franceix"},
{input: "lcdr@evolix.net", server: nil, entity: "lcdr"},
{input: "lepape@evolix.net", server: nil, entity: "lepape"},
{input: "maintenance-jaguar@bazile.fr", server: nil, entity: "bazile"},
{input: "marketing-appa@apparaitre", server: "apparaitre", entity: "apparaitre"},
{input: "mediaaccess@evolix.net", server: nil, entity: "mediaaccess"},
{input: "mexico@iter", server: "tourismit-iter", entity: "tourismit"},
{input: "n.ayed@progexia.fr", server: nil, entity: "progexia"},
{input: "nicematin@evolix.net", server: nil, entity: "nicematin"},
{input: "nicolas.durut@free.fr", server: nil, entity: "cybercartes"},
{input: "no-reply@sever-admin.pw", server: nil, entity: ""},
{input: "noreply@bluewin.ch", server: nil, entity: ""},
{input: "noreply@mattermost-nouveauxterritoires.evolix.org", server: nil, entity: "nouveauxterritoires"},
{input: "nouveauxterritoires@evolix.net", server: nil, entity: "nouveauxterritoires"},
{input: "paris-bounces@members.franceix.net", server: nil, entity: "franceix"},
{input: "paris@members.franceix.net", server: nil, entity: "franceix"},
{input: "pascal.poirson@groupe-dtcf.com", server: nil, entity: "croissanceformation"},
{input: "progexia@evolix.net", server: nil, entity: "progexia"},
{input: "quai13@evolix.net", server: nil, entity: "quai13"},
{input: "redmine@evolix.net", server: nil, entity: "evolix"},
{input: "root@beauregard2.fluotonic.net", server: nil, entity: "fluotonic"},
{input: "root@cloud0-source0.kdata.fr", server: "capitaldata-cloud0-source0", entity: "capitaldata"},
{input: "root@glastint.com", server: "glastint", entity: "quai13"},
{input: "root@hbv5.hb.univ-amu.fr", server: nil, entity: ""},
{input: "root@hbv7.hb.univ-amu.fr", server: nil, entity: ""},
{input: "root@hbv8.hb.univ-amu.fr", server: nil, entity: ""},
{input: "root@kvmail0.cybercartes.com", server: "cybercartes-kvmail0", entity: "cybercartes"},
{input: "root@preprod-elk.nouveauxterritoires.net", server: "nouveauxterritoires-preprod-elk", entity: "nouveauxterritoires"},
{input: "smsmode@evolix.net", server: nil, entity: "smsmode"},
{input: "spaquin@kopel.ca", server: nil, entity: "kopel"},
{input: "stratis@evolix.net", server: nil, entity: "stratis"},
{input: "support@glastint.com", server: nil, entity: "quai13"},
{input: "support@jaguar-network.com", server: nil, entity: "jaguar"},
{input: "tech@evolix.net", server: nil, entity: "evolix"},
{input: "techlog@viaxoft.com", server: nil, entity: "viaxoft"},
{input: "tetesaclics@gmail.com", server: nil, entity: ""},
{input: "tourismit@evolix.net", server: nil, entity: "tourismit"},
{input: "tyredating-c2s@evolix.net", server: nil, entity: "tyredating"},
{input: "viaxoft-backup2.evolix.net", server: "viaxoft-backup2", entity: "viaxoft"},
{input: "viaxoft-mrs-backup2.evolix.net", server: "viaxoft-mrs-backup2", entity: "viaxoft"},
{input: "viaxoft-sys@evolix.net", server: nil, entity: "viaxoft"},
{input: "viaxoft@evolix.net", server: nil, entity: "viaxoft"},
{input: "webcom@evolix.net", server: nil, entity: "webcom"},
])

View file

@ -0,0 +1,48 @@
require "test_helper"
class MetadataMappingsControllerTest < ActionDispatch::IntegrationTest
setup do
@metadata_mapping = metadata_mappings(:one)
end
test "should get index" do
get metadata_mappings_url
assert_response :success
end
test "should get new" do
get new_metadata_mapping_url
assert_response :success
end
test "should create metadata_mapping" do
assert_difference('MetadataMapping.count') do
post metadata_mappings_url, params: { metadata_mapping: { entity: @metadata_mapping.entity, input: @metadata_mapping.input, server: @metadata_mapping.server } }
end
assert_redirected_to metadata_mapping_url(MetadataMapping.last)
end
test "should show metadata_mapping" do
get metadata_mapping_url(@metadata_mapping)
assert_response :success
end
test "should get edit" do
get edit_metadata_mapping_url(@metadata_mapping)
assert_response :success
end
test "should update metadata_mapping" do
patch metadata_mapping_url(@metadata_mapping), params: { metadata_mapping: { entity: @metadata_mapping.entity, input: @metadata_mapping.input, server: @metadata_mapping.server } }
assert_redirected_to metadata_mapping_url(@metadata_mapping)
end
test "should destroy metadata_mapping" do
assert_difference('MetadataMapping.count', -1) do
delete metadata_mapping_url(@metadata_mapping)
end
assert_redirected_to metadata_mappings_url
end
end

11
test/fixtures/metadata_mappings.yml vendored Normal file
View file

@ -0,0 +1,11 @@
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
one:
input: MyString
server: MyString
entity: MyString
two:
input: MyString
server: MyString
entity: MyString

View file

@ -0,0 +1,7 @@
require "test_helper"
class MetadataMappingTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
end

View file

@ -0,0 +1,47 @@
require "application_system_test_case"
class MetadataMappingsTest < ApplicationSystemTestCase
setup do
@metadata_mapping = metadata_mappings(:one)
end
test "visiting the index" do
visit metadata_mappings_url
assert_selector "h1", text: "Metadata Mappings"
end
test "creating a Metadata mapping" do
visit metadata_mappings_url
click_on "New Metadata Mapping"
fill_in "Entity", with: @metadata_mapping.entity
fill_in "Input", with: @metadata_mapping.input
fill_in "Server", with: @metadata_mapping.server
click_on "Create Metadata mapping"
assert_text "Metadata mapping was successfully created"
click_on "Back"
end
test "updating a Metadata mapping" do
visit metadata_mappings_url
click_on "Edit", match: :first
fill_in "Entity", with: @metadata_mapping.entity
fill_in "Input", with: @metadata_mapping.input
fill_in "Server", with: @metadata_mapping.server
click_on "Update Metadata mapping"
assert_text "Metadata mapping was successfully updated"
click_on "Back"
end
test "destroying a Metadata mapping" do
visit metadata_mappings_url
page.accept_confirm do
click_on "Destroy", match: :first
end
assert_text "Metadata mapping was successfully destroyed"
end
end