diff --git a/app/assets/stylesheets/metadata_mappings.scss b/app/assets/stylesheets/metadata_mappings.scss new file mode 100644 index 0000000..016a4b0 --- /dev/null +++ b/app/assets/stylesheets/metadata_mappings.scss @@ -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/ diff --git a/app/controllers/metadata_mappings_controller.rb b/app/controllers/metadata_mappings_controller.rb new file mode 100644 index 0000000..bdb88a8 --- /dev/null +++ b/app/controllers/metadata_mappings_controller.rb @@ -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 diff --git a/app/helpers/metadata_mappings_helper.rb b/app/helpers/metadata_mappings_helper.rb new file mode 100644 index 0000000..3c47a77 --- /dev/null +++ b/app/helpers/metadata_mappings_helper.rb @@ -0,0 +1,2 @@ +module MetadataMappingsHelper +end diff --git a/app/models/metadata_mapping.rb b/app/models/metadata_mapping.rb new file mode 100644 index 0000000..e7afd64 --- /dev/null +++ b/app/models/metadata_mapping.rb @@ -0,0 +1,2 @@ +class MetadataMapping < ApplicationRecord +end diff --git a/app/services/email_importer.rb b/app/services/email_importer.rb index 022d3b6..c71ec3e 100644 --- a/app/services/email_importer.rb +++ b/app/services/email_importer.rb @@ -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 diff --git a/app/views/metadata_mappings/_form.html.erb b/app/views/metadata_mappings/_form.html.erb new file mode 100644 index 0000000..e171600 --- /dev/null +++ b/app/views/metadata_mappings/_form.html.erb @@ -0,0 +1,32 @@ +<%= form_with(model: metadata_mapping) do |form| %> + <% if metadata_mapping.errors.any? %> +
+

<%= pluralize(metadata_mapping.errors.count, "error") %> prohibited this metadata_mapping from being saved:

+ + +
+ <% end %> + +
+ <%= form.label :input %> + <%= form.text_field :input %> +
+ +
+ <%= form.label :server %> + <%= form.text_field :server %> +
+ +
+ <%= form.label :entity %> + <%= form.text_field :entity %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/metadata_mappings/_metadata_mapping.json.jbuilder b/app/views/metadata_mappings/_metadata_mapping.json.jbuilder new file mode 100644 index 0000000..7c67393 --- /dev/null +++ b/app/views/metadata_mappings/_metadata_mapping.json.jbuilder @@ -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) diff --git a/app/views/metadata_mappings/edit.html.erb b/app/views/metadata_mappings/edit.html.erb new file mode 100644 index 0000000..4003699 --- /dev/null +++ b/app/views/metadata_mappings/edit.html.erb @@ -0,0 +1,6 @@ +

Editing Metadata Mapping

+ +<%= render 'form', metadata_mapping: @metadata_mapping %> + +<%= link_to 'Show', @metadata_mapping %> | +<%= link_to 'Back', metadata_mappings_path %> diff --git a/app/views/metadata_mappings/index.html.erb b/app/views/metadata_mappings/index.html.erb new file mode 100644 index 0000000..5b62169 --- /dev/null +++ b/app/views/metadata_mappings/index.html.erb @@ -0,0 +1,31 @@ +

<%= notice %>

+ +

Metadata Mappings

+ + + + + + + + + + + + + <% @metadata_mappings.each do |metadata_mapping| %> + + + + + + + + + <% end %> + +
InputServerEntity
<%= metadata_mapping.input %><%= metadata_mapping.server %><%= metadata_mapping.entity %><%= link_to 'Show', metadata_mapping %><%= link_to 'Edit', edit_metadata_mapping_path(metadata_mapping) %><%= link_to 'Destroy', metadata_mapping, method: :delete, data: { confirm: 'Are you sure?' } %>
+ +
+ +<%= link_to 'New Metadata Mapping', new_metadata_mapping_path %> diff --git a/app/views/metadata_mappings/index.json.jbuilder b/app/views/metadata_mappings/index.json.jbuilder new file mode 100644 index 0000000..de8b946 --- /dev/null +++ b/app/views/metadata_mappings/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @metadata_mappings, partial: "metadata_mappings/metadata_mapping", as: :metadata_mapping diff --git a/app/views/metadata_mappings/new.html.erb b/app/views/metadata_mappings/new.html.erb new file mode 100644 index 0000000..c27f3ba --- /dev/null +++ b/app/views/metadata_mappings/new.html.erb @@ -0,0 +1,5 @@ +

New Metadata Mapping

+ +<%= render 'form', metadata_mapping: @metadata_mapping %> + +<%= link_to 'Back', metadata_mappings_path %> diff --git a/app/views/metadata_mappings/show.html.erb b/app/views/metadata_mappings/show.html.erb new file mode 100644 index 0000000..8ff24dc --- /dev/null +++ b/app/views/metadata_mappings/show.html.erb @@ -0,0 +1,19 @@ +

<%= notice %>

+ +

+ Input: + <%= @metadata_mapping.input %> +

+ +

+ Server: + <%= @metadata_mapping.server %> +

+ +

+ Entity: + <%= @metadata_mapping.entity %> +

+ +<%= link_to 'Edit', edit_metadata_mapping_path(@metadata_mapping) %> | +<%= link_to 'Back', metadata_mappings_path %> diff --git a/app/views/metadata_mappings/show.json.jbuilder b/app/views/metadata_mappings/show.json.jbuilder new file mode 100644 index 0000000..70e3bcf --- /dev/null +++ b/app/views/metadata_mappings/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "metadata_mappings/metadata_mapping", metadata_mapping: @metadata_mapping diff --git a/config/routes.rb b/config/routes.rb index d569ccb..cadf44c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -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' diff --git a/db/migrate/20210103174702_create_metadata_mappings.rb b/db/migrate/20210103174702_create_metadata_mappings.rb new file mode 100644 index 0000000..4d9698b --- /dev/null +++ b/db/migrate/20210103174702_create_metadata_mappings.rb @@ -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 diff --git a/db/schema.rb b/db/schema.rb index 63902d1..97ba755 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.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 diff --git a/db/seeds.rb b/db/seeds.rb index 1beea2a..62c400a 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -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"}, +]) diff --git a/test/controllers/metadata_mappings_controller_test.rb b/test/controllers/metadata_mappings_controller_test.rb new file mode 100644 index 0000000..71d967c --- /dev/null +++ b/test/controllers/metadata_mappings_controller_test.rb @@ -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 diff --git a/test/fixtures/metadata_mappings.yml b/test/fixtures/metadata_mappings.yml new file mode 100644 index 0000000..7828d34 --- /dev/null +++ b/test/fixtures/metadata_mappings.yml @@ -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 diff --git a/test/models/metadata_mapping_test.rb b/test/models/metadata_mapping_test.rb new file mode 100644 index 0000000..c9176ec --- /dev/null +++ b/test/models/metadata_mapping_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class MetadataMappingTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/system/metadata_mappings_test.rb b/test/system/metadata_mappings_test.rb new file mode 100644 index 0000000..c87ef88 --- /dev/null +++ b/test/system/metadata_mappings_test.rb @@ -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