Merge branch 'develop' of github.com:martini/zammad into develop
This commit is contained in:
commit
1597278a43
24 changed files with 418 additions and 236 deletions
|
@ -76,6 +76,7 @@ job_integration_twitter:
|
|||
stage: test
|
||||
tags:
|
||||
- core
|
||||
- twitter
|
||||
script:
|
||||
- export RAILS_ENV=test
|
||||
- rake db:drop;
|
||||
|
|
1
Gemfile
1
Gemfile
|
@ -38,6 +38,7 @@ gem 'twitter'
|
|||
gem 'koala'
|
||||
gem 'mail'
|
||||
gem 'email_verifier'
|
||||
gem 'htmlentities'
|
||||
|
||||
gem 'mime-types'
|
||||
|
||||
|
|
|
@ -120,6 +120,7 @@ GEM
|
|||
guard-compat (~> 1.0)
|
||||
multi_json (~> 1.8)
|
||||
hashie (3.4.3)
|
||||
htmlentities (4.3.4)
|
||||
http (1.0.2)
|
||||
addressable (~> 2.3)
|
||||
http-cookie (~> 1.0)
|
||||
|
@ -341,6 +342,7 @@ DEPENDENCIES
|
|||
execjs
|
||||
guard (>= 2.2.2)
|
||||
guard-livereload
|
||||
htmlentities
|
||||
icalendar
|
||||
json
|
||||
koala
|
||||
|
|
|
@ -1,18 +1,22 @@
|
|||
class App.FirstStepsClues extends App.Controller
|
||||
clues: [
|
||||
{
|
||||
container: '.js-dashboardMenuItem'
|
||||
headline: 'Dashboard'
|
||||
text: 'Here you see a quick overview about your and other agents performance.'
|
||||
actions: [
|
||||
'hover'
|
||||
]
|
||||
}
|
||||
{
|
||||
container: '.search-holder'
|
||||
headline: 'Search'
|
||||
text: 'Here you can search for ticket, customers and organizations. To find everything use the <kbd>*</kbd>-Placeholder'
|
||||
#headline: 'Suche'
|
||||
#text: 'Um alles zu finden nutze den <kbd>*</kbd>-Platzhalter'
|
||||
text: 'Here you can search for ticket, customers and organizations. To find everything use the §*§-Placeholder'
|
||||
}
|
||||
{
|
||||
container: '.user-menu'
|
||||
headline: 'Create'
|
||||
text: 'Here you can create new tickets. Also if you have the permissions you can create new customers and organizations.'
|
||||
#headline: 'Erstellen'
|
||||
#text: 'Hier kannst du Tickets, Kunden und Organisationen anlegen.'
|
||||
actions: [
|
||||
'click .add .js-action',
|
||||
'hover .add'
|
||||
|
@ -22,8 +26,6 @@ class App.FirstStepsClues extends App.Controller
|
|||
container: '.user-menu'
|
||||
headline: 'Personal Settings'
|
||||
text: 'Here you can sign out, change the frontend language or see your latest views items.'
|
||||
#headline: 'Persönliches Menü'
|
||||
#text: 'Hier findest du den Logout, den Weg zu deinen Einstellungen und deinen Verlauf.'
|
||||
actions: [
|
||||
'click .user .js-action',
|
||||
'hover .user'
|
||||
|
@ -33,18 +35,6 @@ class App.FirstStepsClues extends App.Controller
|
|||
container: '.js-overviewsMenuItem'
|
||||
headline: 'Overviews'
|
||||
text: 'Here you find your ticket overviews for open, my assigned or escalated tickets.'
|
||||
#headline: 'Übersichten'
|
||||
#text: 'Hier findest du eine Liste aller Tickets.'
|
||||
actions: [
|
||||
'hover'
|
||||
]
|
||||
}
|
||||
{
|
||||
container: '.js-dashboardMenuItem'
|
||||
headline: 'Dashboard'
|
||||
text: 'Here you see a quick overview about your and other agents performance.'
|
||||
#headline: 'Dashboard'
|
||||
#text: 'Hier siehst du auf einem Blick ob sich alle Agenten an die Spielregeln halten.'
|
||||
actions: [
|
||||
'hover'
|
||||
]
|
||||
|
@ -78,8 +68,6 @@ class App.FirstStepsClues extends App.Controller
|
|||
onComplete: a callback for when the user is done
|
||||
|
||||
###
|
||||
|
||||
@options.onComplete = -> null
|
||||
@position = 0
|
||||
@render()
|
||||
|
||||
|
@ -235,7 +223,7 @@ class App.FirstStepsClues extends App.Controller
|
|||
left = maxWidth - modal.width
|
||||
|
||||
if top < 0
|
||||
moveArrow = modal.height/2 + height
|
||||
moveArrow = modal.height/2 + top
|
||||
top = 0
|
||||
else if top + modal.height > maxHeight
|
||||
moveArrow = modal.height/2 + maxHeight - (top + modal.height)
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
class App.Dashboard extends App.Controller
|
||||
clueAccess: true
|
||||
events:
|
||||
'click .tabs .tab': 'toggle'
|
||||
'click .intro': 'clues'
|
||||
|
@ -7,7 +8,7 @@ class App.Dashboard extends App.Controller
|
|||
super
|
||||
|
||||
if @isRole('Customer')
|
||||
@navigate '#', true
|
||||
@clueAccess = false
|
||||
return
|
||||
|
||||
# render page
|
||||
|
@ -18,6 +19,8 @@ class App.Dashboard extends App.Controller
|
|||
return if !@authenticate(true)
|
||||
@render()
|
||||
|
||||
@mayBeClues()
|
||||
|
||||
render: ->
|
||||
|
||||
@html App.view('dashboard')(
|
||||
|
@ -34,14 +37,34 @@ class App.Dashboard extends App.Controller
|
|||
limit: 25
|
||||
)
|
||||
|
||||
mayBeClues: =>
|
||||
return if !@clueAccess
|
||||
return if !@activeState
|
||||
preferences = @Session.get('preferences')
|
||||
@clueAccess = false
|
||||
return if preferences['intro']
|
||||
@clues()
|
||||
|
||||
clues: (e) =>
|
||||
@clueAccess = false
|
||||
if e
|
||||
e.preventDefault()
|
||||
new App.FirstStepsClues(
|
||||
el: @el
|
||||
onComplete: =>
|
||||
@ajax(
|
||||
id: 'preferences'
|
||||
type: 'PUT'
|
||||
url: @apiPath + '/users/preferences'
|
||||
data: JSON.stringify({user:{intro:true}})
|
||||
processData: true
|
||||
)
|
||||
)
|
||||
|
||||
active: (state) =>
|
||||
@activeState = state
|
||||
if state
|
||||
@mayBeClues()
|
||||
|
||||
isActive: =>
|
||||
@activeState
|
||||
|
@ -51,6 +74,10 @@ class App.Dashboard extends App.Controller
|
|||
|
||||
show: (params) =>
|
||||
|
||||
if @isRole('Customer')
|
||||
@navigate '#', true
|
||||
return
|
||||
|
||||
# set title
|
||||
@title 'Dashboard'
|
||||
|
||||
|
|
|
@ -151,7 +151,11 @@ class Index extends App.ControllerContent
|
|||
success: (data, status, xhr) =>
|
||||
|
||||
if data.result is 'import_done'
|
||||
window.location.reload()
|
||||
delay = 0
|
||||
if @Config.get('developer_mode') is true
|
||||
delay = 5000
|
||||
|
||||
@delay(window.location.reload, delay)
|
||||
return
|
||||
|
||||
if data.result is 'error'
|
||||
|
|
|
@ -184,6 +184,12 @@ class _i18nSingleton extends Spine.Module
|
|||
|
||||
translated = App.Utils.htmlEscape(@translate(string, args))
|
||||
|
||||
# apply inline markup
|
||||
translated
|
||||
.replace(/\*(.+?)\*/gm, '<b>$1</b>')
|
||||
.replace(/_(.+?)_/gm, '<u>$1</u>')
|
||||
.replace(/§(.+?)§/gm, '<kbd>$1</kbd>')
|
||||
|
||||
translatePlain: (string, args) =>
|
||||
@translate(string, args)
|
||||
|
||||
|
|
|
@ -367,14 +367,6 @@
|
|||
this.$widget.find('ul').html('')
|
||||
this.log('result', term, result)
|
||||
|
||||
if (!result[0]) {
|
||||
result = [{id:'', name: '-'}]
|
||||
}
|
||||
|
||||
if (!this.active) {
|
||||
this.open()
|
||||
}
|
||||
|
||||
var elements = $()
|
||||
|
||||
for (var i = 0; i < result.length; i++) {
|
||||
|
@ -383,7 +375,7 @@
|
|||
element.attr('data-id', item.id)
|
||||
element.text(App.Utils.htmlEscape(item.name))
|
||||
element.addClass('u-clickable u-textTruncate')
|
||||
if (i == result.length-1 && item.id != '') {
|
||||
if (i == result.length-1) {
|
||||
element.addClass('is-active')
|
||||
}
|
||||
if (item.keywords) {
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<%- @Icon('diagonal-cross') %>
|
||||
</div>
|
||||
<div class="modal-header"><%- @T(@headline) %></div>
|
||||
<div class="modal-body"><%- @text %></div>
|
||||
<div class="modal-body"><%- @T(@text) %></div>
|
||||
<div class="modal-controls">
|
||||
<div class="modal-control">
|
||||
<div class="<% if @position is 0: %>is-disabled <% end %>btn btn--text js-previous"><%- @T( 'Previous' ) %></div>
|
||||
|
|
|
@ -18,7 +18,7 @@ class Observer::Ticket::Notification < ActiveRecord::Observer
|
|||
EventBuffer.reset
|
||||
|
||||
via_web = false
|
||||
if ENV['SERVER_NAME']
|
||||
if ENV['RACK_ENV'] || Rails.configuration.webserver_is_active
|
||||
via_web = true
|
||||
end
|
||||
|
||||
|
|
|
@ -2,3 +2,6 @@
|
|||
|
||||
require ::File.expand_path('../config/environment', __FILE__)
|
||||
run Zammad::Application
|
||||
|
||||
# set config to do no self notification
|
||||
Rails.configuration.webserver_is_active = true
|
||||
|
|
2
config/initializers/web_server.rb
Normal file
2
config/initializers/web_server.rb
Normal file
|
@ -0,0 +1,2 @@
|
|||
|
||||
Rails.configuration.webserver_is_active = false
|
|
@ -149,6 +149,12 @@ class String
|
|||
# replace multiple spaces with one
|
||||
string.gsub!(/ /, ' ')
|
||||
|
||||
# try HTMLEntities, if it fails on invalid signes, use manual way
|
||||
begin
|
||||
coder = HTMLEntities.new
|
||||
string = coder.decode(string)
|
||||
rescue
|
||||
|
||||
# strip all & < > "
|
||||
string.gsub!( '&', '&' )
|
||||
string.gsub!( '<', '<' )
|
||||
|
@ -186,6 +192,7 @@ class String
|
|||
end
|
||||
chr_orig
|
||||
}
|
||||
end
|
||||
|
||||
# remove tailing empty spaces
|
||||
string.gsub!(/\s+\n$/, "\n")
|
||||
|
|
|
@ -148,7 +148,7 @@ module Import::Zendesk
|
|||
initialize_client
|
||||
|
||||
# retrive statistic
|
||||
statistic = {
|
||||
result = {
|
||||
'Tickets' => 0,
|
||||
'TicketFields' => 0,
|
||||
'UserFields' => 0,
|
||||
|
@ -162,20 +162,14 @@ module Import::Zendesk
|
|||
'Automations' => 0,
|
||||
}
|
||||
|
||||
statistic.each { |object, _score|
|
||||
|
||||
counter = 0
|
||||
@client.send( object.underscore.to_sym ).all do |_resource|
|
||||
counter += 1
|
||||
end
|
||||
|
||||
statistic[ object ] = counter
|
||||
result.each { |object, _score|
|
||||
result[ object ] = @client.send( object.underscore.to_sym ).count!
|
||||
}
|
||||
|
||||
if statistic
|
||||
Cache.write('import_zendesk_stats', statistic)
|
||||
if result
|
||||
Cache.write('import_zendesk_stats', result)
|
||||
end
|
||||
statistic
|
||||
result
|
||||
end
|
||||
|
||||
=begin
|
||||
|
@ -317,12 +311,7 @@ module Import::Zendesk
|
|||
|
||||
local_fields = local_object.constantize.column_names
|
||||
|
||||
zendesk_object_fields = []
|
||||
@client.send("#{local_object.downcase}_fields").all { |zendesk_object_field|
|
||||
zendesk_object_fields.push(zendesk_object_field)
|
||||
}
|
||||
|
||||
zendesk_object_fields.each { |zendesk_object_field|
|
||||
@client.send("#{local_object.downcase}_fields").all! { |zendesk_object_field|
|
||||
|
||||
if local_object == 'Ticket'
|
||||
mapped_object_field = method("mapping_#{local_object.downcase}_field").call( zendesk_object_field.type )
|
||||
|
@ -472,13 +461,7 @@ module Import::Zendesk
|
|||
def import_groups
|
||||
|
||||
@zendesk_group_mapping = {}
|
||||
zendesk_groups = []
|
||||
@client.groups.all { |zendesk_group|
|
||||
zendesk_groups.push(zendesk_group)
|
||||
}
|
||||
|
||||
zendesk_groups.each { |zendesk_group|
|
||||
|
||||
@client.groups.all! { |zendesk_group|
|
||||
local_group = Group.create_if_not_exists(
|
||||
name: zendesk_group.name,
|
||||
active: !zendesk_group.deleted,
|
||||
|
@ -526,12 +509,7 @@ module Import::Zendesk
|
|||
role_agent = Role.lookup(name: 'Agent')
|
||||
role_customer = Role.lookup(name: 'Customer')
|
||||
|
||||
zendesk_users = []
|
||||
@client.users.all { |zendesk_user|
|
||||
zendesk_users.push(zendesk_user)
|
||||
}
|
||||
|
||||
zendesk_users.each { |zendesk_user|
|
||||
@client.users.all! { |zendesk_user|
|
||||
|
||||
local_user_fields = {
|
||||
login: zendesk_user.id.to_s, # Zendesk users may have no other identifier than the ID, e.g. twitter users
|
||||
|
@ -602,12 +580,7 @@ module Import::Zendesk
|
|||
|
||||
@zendesk_user_group_mapping = {}
|
||||
|
||||
zendesk_group_memberships = []
|
||||
@client.group_memberships.all { |zendesk_group_membership|
|
||||
zendesk_group_memberships.push(zendesk_group_membership)
|
||||
}
|
||||
|
||||
zendesk_group_memberships.each { |zendesk_group_membership|
|
||||
@client.group_memberships.all! { |zendesk_group_membership|
|
||||
|
||||
@zendesk_user_group_mapping[ zendesk_group_membership.user_id ] ||= []
|
||||
@zendesk_user_group_mapping[ zendesk_group_membership.user_id ].push( zendesk_group_membership.group_id )
|
||||
|
@ -641,12 +614,7 @@ module Import::Zendesk
|
|||
article_type_facebook_feed_post = Ticket::Article::Type.lookup(name: 'facebook feed post')
|
||||
article_type_facebook_feed_comment = Ticket::Article::Type.lookup(name: 'facebook feed comment')
|
||||
|
||||
zendesk_tickets = []
|
||||
@client.tickets.all { |zendesk_ticket|
|
||||
zendesk_tickets.push(zendesk_ticket)
|
||||
}
|
||||
|
||||
zendesk_tickets.each { |zendesk_ticket|
|
||||
@client.tickets.all! { |zendesk_ticket|
|
||||
|
||||
zendesk_ticket_fields = {}
|
||||
zendesk_ticket.custom_fields.each { |zendesk_ticket_field|
|
||||
|
@ -661,6 +629,7 @@ module Import::Zendesk
|
|||
}
|
||||
|
||||
local_ticket_fields = {
|
||||
id: zendesk_ticket.id,
|
||||
title: zendesk_ticket.subject,
|
||||
note: zendesk_ticket.description,
|
||||
group_id: @zendesk_group_mapping[ zendesk_ticket.group_id ] || 1,
|
||||
|
@ -708,7 +677,13 @@ module Import::Zendesk
|
|||
end
|
||||
end
|
||||
|
||||
local_ticket = Ticket.create( local_ticket_fields )
|
||||
local_ticket = Ticket.find_by(id: local_ticket_fields[:id])
|
||||
if local_ticket
|
||||
local_ticket.update_attributes(local_ticket_fields)
|
||||
else
|
||||
local_ticket = Ticket.create(local_ticket_fields)
|
||||
_reset_pk('tickets')
|
||||
end
|
||||
|
||||
zendesk_ticket_tags = []
|
||||
zendesk_ticket.tags.each { |tag|
|
||||
|
@ -735,6 +710,7 @@ module Import::Zendesk
|
|||
ticket_id: local_ticket.id,
|
||||
body: zendesk_article.html_body,
|
||||
internal: !zendesk_article.public,
|
||||
message_id: zendesk_article.id,
|
||||
updated_by_id: @zendesk_user_mapping[ zendesk_article.author_id ] || 1,
|
||||
created_by_id: @zendesk_user_mapping[ zendesk_article.author_id ] || 1,
|
||||
}
|
||||
|
@ -750,20 +726,14 @@ module Import::Zendesk
|
|||
end
|
||||
|
||||
if zendesk_article.via.channel == 'web'
|
||||
local_article_fields[:message_id] = zendesk_article.id
|
||||
local_article_fields[:type_id] = article_type_web.id
|
||||
elsif zendesk_article.via.channel == 'email'
|
||||
local_article_fields[:from] = zendesk_article.via.source.from.address
|
||||
local_article_fields[:to] = zendesk_article.via.source.to.address # Notice zendesk_article.via.from.original_recipients=[\"another@gmail.com\", \"support@example.zendesk.com\"]
|
||||
local_article_fields[:message_id] = zendesk_article.id
|
||||
local_article_fields[:type_id] = article_type_email.id
|
||||
elsif zendesk_article.via.channel == 'sample_ticket'
|
||||
local_article_fields[:message_id] = zendesk_article.id
|
||||
local_article_fields[:type_id] = article_type_note.id
|
||||
elsif zendesk_article.via.channel == 'twitter'
|
||||
local_article_fields[:message_id] = zendesk_article.id
|
||||
|
||||
# TODO
|
||||
local_article_fields[:type_id] = if zendesk_article.via.source.rel == 'mention'
|
||||
article_type_twitter_status.id
|
||||
else
|
||||
|
@ -774,9 +744,7 @@ module Import::Zendesk
|
|||
|
||||
local_article_fields[:from] = zendesk_article.via.source.from.facebook_id
|
||||
local_article_fields[:to] = zendesk_article.via.source.to.facebook_id
|
||||
local_article_fields[:message_id] = zendesk_article.id
|
||||
|
||||
# TODO
|
||||
local_article_fields[:type_id] = if zendesk_article.via.source.rel == 'post'
|
||||
article_type_facebook_feed_post.id
|
||||
else
|
||||
|
@ -785,7 +753,12 @@ module Import::Zendesk
|
|||
end
|
||||
|
||||
# create article
|
||||
local_article = Ticket::Article.find_by(message_id: local_article_fields[:message_id])
|
||||
if local_article
|
||||
local_article.update_attributes(local_article_fields)
|
||||
else
|
||||
local_article = Ticket::Article.create( local_article_fields )
|
||||
end
|
||||
|
||||
zendesk_attachments = zendesk_article.attachments
|
||||
|
||||
|
@ -842,12 +815,7 @@ module Import::Zendesk
|
|||
# https://developer.zendesk.com/rest_api/docs/core/macros
|
||||
def import_macros
|
||||
|
||||
zendesk_macros = []
|
||||
@client.macros.all { |zendesk_macro|
|
||||
zendesk_macros.push(zendesk_macro)
|
||||
}
|
||||
|
||||
zendesk_macros.each { |zendesk_macro|
|
||||
@client.macros.all! { |zendesk_macro|
|
||||
|
||||
# TODO
|
||||
next if !zendesk_macro.active
|
||||
|
@ -899,12 +867,7 @@ module Import::Zendesk
|
|||
# https://developer.zendesk.com/rest_api/docs/core/views
|
||||
def import_views
|
||||
|
||||
zendesk_views = []
|
||||
@client.views.all { |zendesk_view|
|
||||
zendesk_views.push(zendesk_view)
|
||||
}
|
||||
|
||||
zendesk_views.each { |zendesk_view|
|
||||
@client.views.all! { |zendesk_view|
|
||||
|
||||
# "url" => "https://example.zendesk.com/api/v2/views/59511071.json"
|
||||
# "id" => 59511071
|
||||
|
@ -1033,12 +996,7 @@ module Import::Zendesk
|
|||
# https://developer.zendesk.com/rest_api/docs/core/automations
|
||||
def import_automations
|
||||
|
||||
zendesk_automations = []
|
||||
@client.automations.all { |zendesk_automation|
|
||||
zendesk_automations.push(zendesk_automation)
|
||||
}
|
||||
|
||||
zendesk_automations.each { |zendesk_automation|
|
||||
@client.automations.all! { |zendesk_automation|
|
||||
|
||||
# "url" => "https://example.zendesk.com/api/v2/automations/60037892.json"
|
||||
# "id" => 60037892
|
||||
|
@ -1077,4 +1035,10 @@ module Import::Zendesk
|
|||
}
|
||||
end
|
||||
|
||||
# reset primary key sequences
|
||||
def self._reset_pk(table)
|
||||
return if ActiveRecord::Base.connection_config[:adapter] != 'postgresql'
|
||||
ActiveRecord::Base.connection.reset_pk_sequence!(table)
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -274,6 +274,18 @@ test( "i18n", function() {
|
|||
translated = App.i18n.translateContent('%s %s test', 123, 'xxx');
|
||||
equal( translated, '123 xxx test', 'de-de - %s %s' );
|
||||
|
||||
translated = App.i18n.translateContent('*%s* %s test', 123, 'xxx');
|
||||
equal( translated, '<b>123</b> xxx test', 'de-de - *%s* %s' );
|
||||
|
||||
translated = App.i18n.translateContent('_%s_ %s test', 123, 'xxx');
|
||||
equal( translated, '<u>123</u> xxx test', 'de-de - _%s_ %s' );
|
||||
|
||||
translated = App.i18n.translateContent('§%s§ %s test', 123, 'xxx');
|
||||
equal( translated, '<kbd>123</kbd> xxx test', 'de-de - §%s§ %s' );
|
||||
|
||||
translated = App.i18n.translateContent('\'%s\' %s test', 123, 'xxx');
|
||||
equal( translated, ''123' xxx test', 'de-de - \'%s\' %s' );
|
||||
|
||||
translated = App.i18n.translateContent('<test&now>//*äöüß');
|
||||
equal( translated, '<test&now>//*äöüß', 'de - <test&now>//*äöüß' );
|
||||
|
||||
|
@ -299,6 +311,18 @@ test( "i18n", function() {
|
|||
translated = App.i18n.translateContent('%s %s test', 123, 'xxx');
|
||||
equal( translated, '123 xxx test', 'en-us - %s %s' );
|
||||
|
||||
translated = App.i18n.translateContent('*%s* %s test', 123, 'xxx');
|
||||
equal( translated, '<b>123</b> xxx test', 'en-us - *%s* %s' );
|
||||
|
||||
translated = App.i18n.translateContent('_%s_ %s test', 123, 'xxx');
|
||||
equal( translated, '<u>123</u> xxx test', 'en-us - _%s_ %s' );
|
||||
|
||||
translated = App.i18n.translateContent('§%s§ %s test', 123, 'xxx');
|
||||
equal( translated, '<kbd>123</kbd> xxx test', 'en-us - §%s§ %s' );
|
||||
|
||||
translated = App.i18n.translateContent('\'%s\' %s test', 123, 'xxx');
|
||||
equal( translated, ''123' xxx test', 'en-us - \'%s\' %s' );
|
||||
|
||||
translated = App.i18n.translateContent('<test&now>');
|
||||
equal( translated, '<test&now>', 'en-us - <test&now>' );
|
||||
|
||||
|
|
|
@ -156,6 +156,12 @@ class TestCase < Test::Unit::TestCase
|
|||
fail 'auto wizard login failed'
|
||||
end
|
||||
assert(true, 'auto wizard login ok')
|
||||
|
||||
clues_close(
|
||||
browser: instance,
|
||||
optional: true,
|
||||
)
|
||||
|
||||
return
|
||||
end
|
||||
screenshot(browser: instance, comment: 'login_failed')
|
||||
|
@ -182,6 +188,12 @@ class TestCase < Test::Unit::TestCase
|
|||
screenshot(browser: instance, comment: 'login_failed')
|
||||
fail 'login failed'
|
||||
end
|
||||
|
||||
clues_close(
|
||||
browser: instance,
|
||||
optional: true,
|
||||
)
|
||||
|
||||
screenshot(browser: instance, comment: 'login_ok')
|
||||
assert(true, 'login ok')
|
||||
login
|
||||
|
@ -217,6 +229,32 @@ class TestCase < Test::Unit::TestCase
|
|||
fail 'no login box found, seems logout was not successfully!'
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
clues_close(
|
||||
browser: browser1,
|
||||
optional: false,
|
||||
)
|
||||
|
||||
=end
|
||||
|
||||
def clues_close(params = {})
|
||||
switch_window_focus(params)
|
||||
log('clues_close', params)
|
||||
|
||||
instance = params[:browser] || @browser
|
||||
|
||||
clues = instance.find_elements({ css: '.js-modal--clue .js-close' })[0]
|
||||
if !params[:optional] && !clues
|
||||
screenshot(browser: instance, comment: 'no_clues')
|
||||
fail 'Unable to closes clues, no clues found!'
|
||||
end
|
||||
return if !clues
|
||||
instance.execute_script("$('.js-modal--clue .js-close').click()")
|
||||
assert(true, 'clues closed')
|
||||
sleep 4
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
location(
|
||||
|
|
70
test/fixtures/mail36.box
vendored
Normal file
70
test/fixtures/mail36.box
vendored
Normal file
|
@ -0,0 +1,70 @@
|
|||
Return-Path: <m.Smith@example.com>
|
||||
X-Original-To: me@example.com
|
||||
Delivered-To: martin@arber.example.com
|
||||
Received-SPF: softfail (example.com: Sender is not authorized by default to use 'm.Smith@example.com' in 'mfrom' identity, however domain is not currently prepared for false failures (mechanism '~all' matched)) receiver=arber.example.com; identity=mailfrom; envelope-from="m.Smith@example.com"; helo=mout.web.de; client-ip=212.227.15.14
|
||||
Received: from mout.web.de (mout.web.de [2.2.1.1])
|
||||
by arber.example.com (Postfix) with ESMTPS id CC5CF61391
|
||||
for <me@example.com>; Wed, 3 Feb 2016 13:23:33 +0100 (CET)
|
||||
Received: from [79.228.218.253] by 3capp-webde-bs15.server.lan (via HTTP);
|
||||
Wed, 3 Feb 2016 13:23:33 +0100
|
||||
MIME-Version: 1.0
|
||||
Message-ID: <trinity-147fd84a-1e14-4765-bbc0-8c1387385e8f-1454502213303@3capp-webde-bs15>
|
||||
From: "Martin Smith" <m.Smith@example.com>
|
||||
To: "Martin Edenhofer" <me@example.com>
|
||||
Subject: Fw: Zugangsdaten
|
||||
Content-Type: text/html; charset=UTF-8
|
||||
Date: Wed, 3 Feb 2016 13:23:33 +0100
|
||||
Importance: normal
|
||||
Sensitivity: Normal
|
||||
References: <70E61C7E-7508-45D9-918E-D890862641E1@example.com>,
|
||||
<trinity-0f474eb0-4274-4af8-b928-83c21e7881eb-1454499808226@3capp-webde-bs15>
|
||||
X-UI-Message-Type: mail
|
||||
X-Priority: 3
|
||||
X-Provags-ID: V03:K0:/WfykMPf5Mwa0ZvXBNkPO5anKRmg15X0kEGEx6sir6T
|
||||
Iu1DfMCe1Rqe3ptJJPM6rUy7U0VBf9/N8eAXiGMlekWzR4A1KD
|
||||
t2D3jKxbBmHQTLoPNpOLpQkO86WZPkGEIRvi4GzGt6y7+AF6Wr
|
||||
YKe4AHIigSb7TubsOEGhV8vRzB7oObrecn+X9vfQD1vgQextTn
|
||||
aZrl8Uz4Iq8Qgc9HaDcg2+IG7ZBMKeTgKGlqNqOEpj76pRy3il
|
||||
HfkGfFxxgbnKg/RK0X0oC1rwgMubWuAxwA97c6AeTLFnPJxtPt ZQu4v0=
|
||||
X-UI-Out-Filterresults: notjunk:1;V01:K0:Z3b52B2Tvas=:1Ly2mLCISrNqxwJZwsSJvd
|
||||
ggRZBL9pBdcfKBkFAX6sMmwK+lPYbULi0XgW1MYCDo1JffR9/0dMVKxNGebwN6cBYp9BOZ4PL
|
||||
c12fINf2qyNQpOUhI5OGSsdltK9XZqPk1MVBK2VoGF2HUo+lBhtzt9ilmD8zdMgXTla9YzQfu
|
||||
mEm90UGBuITr3Cqln3YOV8nH24PTYE0nvkqLFRENEpR3cUGFxTYWiImuDjr8x+GaUcdqoa7EP
|
||||
jxQQgSn011n3PozpFcDaw/09WrmkwJ4BlfXbu5jKdQR1X1hzSUrXxniCy1DY2QtX5OqPu+CnA
|
||||
LrrHBQM4+Arxzd438ajIFoUlswodEY5HGOERMC4SxORgirHKkQz117HjPuPCHoLHqf+zmXgS5
|
||||
k68l59J5dk2qb1UvcidOMMMYyLEE0Le0K88qs8doKy5RnQZz+butudnLd2NsNZtyWPFbxZu3S
|
||||
Vb8PRK9Gng==
|
||||
|
||||
<html><head></head><body><div style="font-family: Verdana;font-size: 12.0px;"><div><br/>
|
||||
</div>
|
||||
|
||||
<div class="signature">-- <br/>
|
||||
don't cry - work! (Rainald Goetz)</div>
|
||||
|
||||
<div>
|
||||
<div>
|
||||
<div name="quote" style="margin:10px 5px 5px 10px; padding: 10px 0 10px 10px; border-left:2px solid #C3D9E5; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">
|
||||
<div style="margin:0 0 10px 0;"><b>Gesendet:</b> Mittwoch, 03. Februar 2016 um 12:43 Uhr<br/>
|
||||
<b>Von:</b> "Martin Smith" <m.Smith@example.com><br/>
|
||||
<b>An:</b> linuxhotel@zammad.com<br/>
|
||||
<b>Betreff:</b> Fw: Zugangsdaten</div>
|
||||
|
||||
<div name="quoted-content">
|
||||
<div style="font-family: Verdana;font-size: 12.0px;">
|
||||
<div><br/>
|
||||
</div>
|
||||
|
||||
<div class="signature">-- <br/>
|
||||
don't cry - work! (Rainald Goetz)</div>
|
||||
|
||||
<div>
|
||||
<div>
|
||||
<div style="margin: 10.0px 5.0px 5.0px 10.0px;padding: 10.0px 0 10.0px 10.0px;border-left: 2.0px solid rgb(195,217,229);">
|
||||
<div style="margin: 0 0 10.0px 0;"><b>Gesendet:</b> Freitag, 22. Januar 2016 um 11:52 Uhr<br/>
|
||||
<b>Von:</b> "Martin Edenhofer" <me@example.com><br/>
|
||||
<b>An:</b> m.Smith@example.com<br/>
|
||||
<b>Betreff:</b> Zugangsdaten</div>
|
||||
|
||||
<div>Um noch vertrauter zu werden, kannst Du mit einen externen E-Mail Account (z. B. <a href="http://web.de" target="_blank">web.de</a>) mal ein wenig selber “spielen”. :)</div>
|
||||
|
||||
</body></html>
|
|
@ -29,6 +29,8 @@ class AutoWizardTest < TestCase
|
|||
timeout: 20,
|
||||
)
|
||||
|
||||
clues_close
|
||||
|
||||
organization_open_by_search(
|
||||
value: 'Demo Organization',
|
||||
)
|
||||
|
|
|
@ -79,17 +79,32 @@ class ZendeskImportBrowserTest < TestCase
|
|||
click(css: '.js-migration-start')
|
||||
|
||||
watch_for(
|
||||
css: 'body',
|
||||
value: 'login',
|
||||
css: '.js-group .js-done',
|
||||
value: '2',
|
||||
timeout: 60,
|
||||
)
|
||||
|
||||
watch_for(
|
||||
css: '.js-organization .js-done',
|
||||
value: '1',
|
||||
timeout: 60,
|
||||
)
|
||||
|
||||
watch_for(
|
||||
css: '.js-user .js-done',
|
||||
value: '141',
|
||||
timeout: 60,
|
||||
)
|
||||
|
||||
watch_for(
|
||||
css: '.js-ticket .js-done',
|
||||
value: '143',
|
||||
timeout: 300,
|
||||
)
|
||||
|
||||
assert_equal( 143, User.count, 'users' )
|
||||
assert_equal( 3, Group.count, 'groups' )
|
||||
assert_equal( 5, Role.count, 'roles' )
|
||||
assert_equal( 2, Organization.count, 'organizations' )
|
||||
assert_equal( 144, Ticket.count, 'tickets' )
|
||||
assert_equal( 151, Ticket::Article.count, 'ticket articles' )
|
||||
assert_equal( 2, Store.count, 'ticket article attachments' )
|
||||
watch_for(
|
||||
css: 'body',
|
||||
value: 'login',
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -48,7 +48,7 @@ class ZendeskImportTest < ActiveSupport::TestCase
|
|||
assert_equal( 3, Group.count, 'groups' )
|
||||
assert_equal( 5, Role.count, 'roles' )
|
||||
assert_equal( 2, Organization.count, 'organizations' )
|
||||
assert_equal( 144, Ticket.count, 'tickets' )
|
||||
assert_equal( 143, Ticket.count, 'tickets' )
|
||||
assert_equal( 151, Ticket::Article.count, 'ticket articles' )
|
||||
assert_equal( 2, Store.count, 'ticket article attachments' )
|
||||
|
||||
|
@ -275,10 +275,10 @@ class ZendeskImportTest < ActiveSupport::TestCase
|
|||
|
||||
checks = [
|
||||
{
|
||||
id: 3,
|
||||
id: 2,
|
||||
data: {
|
||||
title: 'test',
|
||||
note: 'test email',
|
||||
note: 'This is the first comment. Feel free to delete this sample ticket.',
|
||||
create_article_type_id: 1,
|
||||
create_article_sender_id: 2,
|
||||
article_count: 2,
|
||||
|
@ -290,6 +290,38 @@ class ZendeskImportTest < ActiveSupport::TestCase
|
|||
organization_id: 2,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
data: {
|
||||
title: 'Bob Smith, here is the test ticket you requested',
|
||||
note: 'test email',
|
||||
create_article_type_id: 10,
|
||||
create_article_sender_id: 2,
|
||||
article_count: 4,
|
||||
state_id: 3,
|
||||
group_id: 3,
|
||||
priority_id: 1,
|
||||
owner_id: 1,
|
||||
customer_id: 7,
|
||||
organization_id: nil,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 5,
|
||||
data: {
|
||||
title: 'Twitter',
|
||||
note: '@DesafioCaracol sh q acaso sto se vale ver el jueg...',
|
||||
create_article_type_id: 6,
|
||||
create_article_sender_id: 2,
|
||||
article_count: 1,
|
||||
state_id: 1,
|
||||
group_id: 3,
|
||||
priority_id: 2,
|
||||
owner_id: 1,
|
||||
customer_id: 91,
|
||||
organization_id: nil,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 143,
|
||||
data: {
|
||||
|
@ -306,38 +338,6 @@ class ZendeskImportTest < ActiveSupport::TestCase
|
|||
organization_id: nil,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 5,
|
||||
data: {
|
||||
title: 'Twitter',
|
||||
note: '@DesafioCaracol sh q acaso sto se vale ver el jueg...',
|
||||
create_article_type_id: 6,
|
||||
create_article_sender_id: 2,
|
||||
article_count: 1,
|
||||
state_id: 1,
|
||||
group_id: 3,
|
||||
priority_id: 2,
|
||||
owner_id: 1,
|
||||
customer_id: 90,
|
||||
organization_id: nil,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
data: {
|
||||
title: 'This is a sample ticket requested and submitted by you',
|
||||
note: 'This is the first comment. Feel free to delete this sample ticket.',
|
||||
create_article_type_id: 10,
|
||||
create_article_sender_id: 1,
|
||||
article_count: 4,
|
||||
state_id: 3,
|
||||
group_id: 3,
|
||||
priority_id: 3,
|
||||
owner_id: 1,
|
||||
customer_id: 4,
|
||||
organization_id: 2,
|
||||
},
|
||||
},
|
||||
# {
|
||||
# id: ,
|
||||
# data: {
|
||||
|
@ -359,16 +359,16 @@ class ZendeskImportTest < ActiveSupport::TestCase
|
|||
checks.each { |check|
|
||||
ticket = Ticket.find( check[:id] )
|
||||
|
||||
assert_equal( check[:data][:title], ticket.title, 'title' )
|
||||
assert_equal( check[:data][:create_article_type_id], ticket.create_article_type_id, 'created_article_type_id' )
|
||||
assert_equal( check[:data][:create_article_sender_id], ticket.create_article_sender_id, 'created_article_sender_id' )
|
||||
assert_equal( check[:data][:article_count], ticket.article_count, 'article_count' )
|
||||
assert_equal( check[:data][:state_id], ticket.state.id, 'state_id' )
|
||||
assert_equal( check[:data][:group_id], ticket.group.id, 'group_id' )
|
||||
assert_equal( check[:data][:priority_id], ticket.priority.id, 'priority_id' )
|
||||
assert_equal( check[:data][:owner_id], ticket.owner.id, 'owner_id' )
|
||||
assert_equal( check[:data][:customer_id], ticket.customer.id, 'customer_id' )
|
||||
assert_equal( check[:data][:organization_id], ticket.organization.try(:id), 'organization_id' )
|
||||
assert_equal( check[:data][:title], ticket.title, "title of Ticket.find(#{check[:id]})" )
|
||||
assert_equal( check[:data][:create_article_type_id], ticket.create_article_type_id, "created_article_type_id of Ticket.find(#{check[:id]})" )
|
||||
assert_equal( check[:data][:create_article_sender_id], ticket.create_article_sender_id, "created_article_sender_id of Ticket.find(#{check[:id]})" )
|
||||
assert_equal( check[:data][:article_count], ticket.article_count, "article_count of Ticket.find(#{check[:id]})" )
|
||||
assert_equal( check[:data][:state_id], ticket.state.id, "state_id of Ticket.find(#{check[:id]})" )
|
||||
assert_equal( check[:data][:group_id], ticket.group.id, "group_id of Ticket.find(#{check[:id]})" )
|
||||
assert_equal( check[:data][:priority_id], ticket.priority.id, "priority_id of Ticket.find(#{check[:id]})" )
|
||||
assert_equal( check[:data][:owner_id], ticket.owner.id, "owner_id of Ticket.find(#{check[:id]})" )
|
||||
assert_equal( check[:data][:customer_id], ticket.customer.id, "customer_id of Ticket.find(#{check[:id]})" )
|
||||
assert_equal( check[:data][:organization_id], ticket.organization.try(:id), "organization_id of Ticket.find(#{check[:id]})" )
|
||||
}
|
||||
end
|
||||
|
||||
|
|
|
@ -132,7 +132,7 @@ class AaaStringTest < ActiveSupport::TestCase
|
|||
html = ' line 1<br>
|
||||
you<br/>
|
||||
-----&'
|
||||
should = 'line 1
|
||||
should = 'line 1
|
||||
you
|
||||
-----&'
|
||||
assert_equal( should, html.html2text)
|
||||
|
|
|
@ -86,7 +86,7 @@ Liebe Grüße!
|
|||
},
|
||||
{
|
||||
data: IO.read('test/fixtures/mail6.box'),
|
||||
body_md5: '6229bcc5fc1396445d781daf3c12a285',
|
||||
body_md5: '683ac042e94e99a8bb5e8ced7893b1d7',
|
||||
params: {
|
||||
from: '"Hans BÄKOSchönland" <me@bogen.net>',
|
||||
from_email: 'me@bogen.net',
|
||||
|
@ -97,9 +97,9 @@ Liebe Grüße!
|
|||
___
|
||||
[1] Compare Cable, DSL or Satellite plans: As low as $2.95.
|
||||
|
||||
Test1:8
|
||||
Test1:–
|
||||
Test2:&
|
||||
Test3:∋
|
||||
Test3:∋
|
||||
Test4:&
|
||||
Test5:=
|
||||
|
||||
|
@ -328,7 +328,7 @@ Hof
|
|||
# spam email
|
||||
{
|
||||
data: IO.read('test/fixtures/mail16.box'),
|
||||
body_md5: '5e96cc53e78c0e44523502ee50647808',
|
||||
body_md5: '91e698a1ba3679dff398ba3587b3f3d9',
|
||||
params: {
|
||||
from: nil,
|
||||
from_email: 'vipyimin@126.com',
|
||||
|
@ -373,7 +373,7 @@ Hof
|
|||
},
|
||||
{
|
||||
data: IO.read('test/fixtures/mail20.box'),
|
||||
body_md5: '646e803f30cddf06db90f426df3672c1',
|
||||
body_md5: 'ddcbbb850491ae9a174c4f1e42309f84',
|
||||
params: {
|
||||
from: 'Health and Care-Mall <drugs-cheapest8@sicor.com>',
|
||||
from_email: 'drugs-cheapest8@sicor.com',
|
||||
|
@ -382,28 +382,28 @@ Hof
|
|||
to: 'info2@znuny.com',
|
||||
body: "________________________________________________________________________Yeah but even when they. Beth liî ed her neck as well
|
||||
|
||||
ó25aHw511IΨ11xG⌊o8KHCmς9-2½23QgñV6UAD12AX←t1Lf7⊕1Ir²r1TLA5pYJhjV gPnãM36V1E89RUDΤÅ12I92s2CΘYEϒAfg∗bT11∫rIoiš¦O5oUIN1Is2S21Pp Ÿ2q1FΧ⇑eGOz⌈F1R98y§ 74”lTr8r1H2æu2E2P2q VmkfB∫SKNElst4S∃182T2G1í lY92Pu×8>RÒ¬⊕ΜIÙzÙCC412QEΡºS2!XgŒs.
|
||||
2γ⇓B[1] cwspC L8I C K88H E1R?E2e31 !Calm dylan for school today.
|
||||
óû5aHw5³½IΨµÁxG⌊o8KHCmς9-Ö½23QgñV6UAD¿ùAX←t¨Lf7⊕®Ir²r½TLA5pYJhjV gPnãM36V®E89RUDΤÅ©ÈI9æsàCΘYEϒAfg∗bT¡1∫rIoiš¦O5oUIN±IsæSعPp Ÿÿq1FΧ⇑eGOz⌈F³R98y§ 74”lTr8r§HÐæuØEÛPËq VmkfB∫SKNElst4S∃Á8üTðG°í lY9åPu×8>RÒ¬⊕ΜIÙzÙCC4³ÌQEΡºSè!XgŒs.
|
||||
çγ⇓B[1] cwspC L I C K H E R Eëe3¸ !Calm dylan for school today.
|
||||
Closing the nursery with you down. Here and made the mess. Maybe the oï from under his mother. Song of course beth touched his pants.
|
||||
When someone who gave up from here. Feel of god knows what.
|
||||
TBϖ∃M5T5ΕEf2û–N¶1vΖ'1⇓∝5S2225 Χ0jΔHbAgþE—2i6A2lD⇑LGj2nTOy11H2τ9’:Their mother and tugged it seemed like
|
||||
d3RsV¶H2Θi¯B∂gax1bîgdH23r2Jÿ1aIK1² n1jfaTk1Vs3952 C˜lBl‘mxGo0√2XwT8Ya 28ksa∫f1ℵs”62Q 2Ad7$p32d1e∏2e.0”261a2Κ63αSM2 Nf52CdL∪1i↔xcaa52R3l6Lc3i2z16só9èU zDE1aE21gs25Ë2 hE1cl⊃¢11o21µBw1zF1 q2kõaXUius1r0⊆ d•∈2$1Z2F1218l.07d56PÚl25JAO6
|
||||
45loV2iv1i2ãΥ⌊a2⊃d2gÃΥ3™r22u¸aWjO8 n40–Soyè2u1∅23p1JΜNeÌ22jrá2rΚ 1229A2rAkc8nuEtl22ai‡OB8vSbéσeιõq1+65cw 2s8Uaò4PrsE1y8 ⟨fMElhϒ⋅Jo8pmzwjˆN1 wv39aW1WtsvuU3 1aœ1$2ΝnR2O2⌉B.∀2c→5Ê9χw5p1⁄N fHGFVfE³2iσjGpa51kgg12cWrUq52akx2h 0F24P¸2L2rn22Ïo2Ý2HfoRb2eUαw6s2N‾ws¶13Βi2X1¸ofgtHnR⊥32ase92lF1H5 26B1a⊃2iϒsô12i ÅkMyl2J1ÄoQ–0ℑwvmù2 2ˆμ\"aQ7jVse62f 1h2p$L2r£3i1t2.323h5qP8g0♥÷R2
|
||||
·iƒPV1Β∋øiF1R1a4v32gL9¢wr1722a2û0η þ12ßStu21u7á¡lp2ocEe1SLlrV2Xj ⊥Uµ1F¬48ðov71Arm242c2Vw2e1§⊇N 1242aLþZ2ski×5 c€pBlû26∂ol1fÚwKß32 4i2la4C12sRE21 ãeI2$2z8t442fG.¸1≤12F’Ã152in⊄ Tl1ëC2v7Ci71X8a225NlþU⟩ιicO∑«s·iKN UuϒjS1j52u2Jü§pn5°1e¥Û3℘r1W‡2 J‹S7A1j0sc&1pkt1qq2iZ561vn81∗e22Q3+723Š ∑RkLaKX2as2s22 ï111lD2z8o278wwU–ÀC T6U2aϒ938s20Gÿ Ox2∈$98‘R21H25.ÒL6b9θrδ292f9j
|
||||
TBϖ∃M5T5ΕEf2û–N¶ÁvΖ'®⇓∝5SÐçË5 Χ0jΔHbAgþE—2i6A2lD⇑LGjÓnTOy»¦Hëτ9’:Their mother and tugged it seemed like
|
||||
d3RsV¶HÓΘi¯B∂gax1bîgdHä3rýJÿ1aIKDz n1jfaTk³Vs395ß C˜lBl‘mxGo0√úXwT8Ya õ8ksa∫f·ℵs”6ÑQ ÍAd7$p32d1e∏æe.0”×61aîΚ63αSMû Nf5ÉCdL∪1i↔xcaa5êR3l6Lc3iãz16só9èU zDE²aEȨgs25ËÞ hE§cl⊃¢¢ÂoÒµBw²zF© qÏkõaXUius1r0⊆ d•∈ø$¢Z2F128l.07d56PÚl25JAO6
|
||||
45loVóiv1i2ãΥ⌊að⊃d2gÃΥ3™rÎÍu¸aWjO8 n40–Soyè2u¡∅Î3p¢JΜNeÌé×jráÒrΚ 1ÌÓ9AúrAkc8nuEtl22ai‡OB8vSbéσeιõq1+65cw Òs8Uaò4PrsE1y8 〈fMElhϒ⋅Jo8pmzwjˆN¥ wv39aW¡WtsvuU3 1aœ³$éΝnR2OÏ⌉B.∀þc→5Ê9χw5pÃ⁄N fHGFVfE³ãiσjGpa5¶kgg¡ìcWrUq5æakx2h 0Fè4P¸ÕLñrn22ÏoþÝÐHfoRb2eUαw6sñN‾ws¶§3ΒiòX¶¸ofgtHnR⊥3âase9álF¿H5 à6BÁa⊃2iϒsô¡ói ÅkMylÚJ¾ÄoQ–0ℑwvmùþ ˈμ\"aQ7jVse6Ðf «hÜp$Lâr£3i1tÚ.323h5qP8g0♥÷R÷
|
||||
·iƒPV1Β∋øiF¤RÃa4v3âgL9¢wr¨7ø×aÏû0η þ1àßStuÞ³u7á¡lpÑocEe·SLlrVàXj ⊥Uµ¢F¬48ðov7¨Arm×4ÍcùVwÞe1§⊇N ÂÛ4äaLþZ2ski×5 c€pBlûù6∂olÃfÚwKß3Ñ 4iíla4C³êsREÕ1 ãeIó$âz8t442fG.¸1≤¸2F’Ã152in⊄ Tl©ëC2v7Ci7·X8a×ú5NlþU〉ιicO∑«s·iKN UuϒjSÃj5Ýu÷Jü§pn5°§e¥Û3℘rÆW‡ò J‹S7A1j0sc&ºpkt·qqøiZ56½vn8¨∗eîØQ3+7Î3Š ∑RkLaKXËasÐsÌ2 ïǶlDäz8oã78wwU–ÀC T6Uûaϒ938sÌ0Gÿ Oxó∈$98‘R2ÂHï5.ÒL6b9θrδÜ92f9j
|
||||
Please matt on his neck. Okay matt huï ed into your mind Since her head to check dylan. Where dylan matt got up there
|
||||
1ȱΑAYQ1dN12ϒXT00ÀvI∨ío8-1b®8AΕ1V4LgÕ↑7LKtgcEiw1yR5Y22GRA1°I10C2C2Tiü/2wc0Ax211SÜÂ2ŒTÁ22òHpNâùM6È10A5Tb1:Simmons and now you really is what. Matt picked up this moment later that.
|
||||
251yV922Yeg1↑DnJ3l4t22b1os∏jll÷iS2iwBÎ4n021Ö 1f÷2a11l2suÚ82 2LCblgvN½o1oP3wn♠90 FZora&M™xsΚbb1 251ξ$12·22iG2∇1⊇Ξ¬3.0P0κ53V1203ÝYz 2X¢BAZ4Kwddu2vvuB↑Βa1’THi0—93rZεj0 1rΜ1a2111s71Ιf 8⇓2olW„62o6yH¥wKZ∧6 21h2aKJ“ℜs48IÌ 21¬1$ZΣ122ñ26B42YMZ.21V19f10å54⌈R8
|
||||
2w\"9N2gBÀa2Sê1s≅gGÔo0Dn4n↵γ7⊗eS7e2xf3Jd q÷CMa221isNMZp zz0˜lΚLw8o229ww1§Qu 1D⌈ía2212sJ811 3où2$¦1Nℜ1>R2t7WPM1.181D92k5D9∗8≈R l131Sj1Ψ8pΣ2Kùi6rr2rbÛu¬i2V∗∏v5ª10a27B1 Ú♦Ξsa9j3χsa1iΟ Oi℘ml6óf2owbz∀wA6ù→ 22b2ai1wbs♦βGs 281i$iÀˆ12⊃2wC82n8o.13NJ9S11Θ0P1Sd
|
||||
1ȱΑAYQªdN¬ÚϒXT00ÀvI∨ío8-½b®8AΕºV4LgÕ↑7LKtgcEiwyR5YýæGRA1°I¿0CïCàTiü/þwc0Ax211SÜÂùŒTÁ2êòHpNâùM6Ⱦ0A5Tb»:Simmons and now you really is what. Matt picked up this moment later that.
|
||||
25¯yV9ÙßYeg·↑DnJ3l4tÝæb1os∏jll÷iSÐiwBÎ4n0ú1Ö ªf÷Ña§1løsuÚ8ê 2LCblgvN½o¼oP3wn♠90 FZora&M™xsΚbb ç5Ãξ$Âô·×2iGæ∇1⊇Ξ¬3.0P0κ53VÁö03ÝYz øX¢BAZ4KwdduÜvvuB↑ΒaÄ’THi0—93rZεj0 §rΜÅa2·§s7¸Ιf 8⇓þolW„6Ýo6yH¥wKZ∧6 21hÒaKJ“ℜs48IÌ ÔÀ¬$ZΣ¹ü2ñÙ6B42YMZ.Ô¹V¼9f·0å54⌈R8
|
||||
÷w\"9N2gBÀaðSê¢s≅gGÔo0Dn4n↵γ7⊗eS7eýxf3Jd q÷CMaÍä³isNMZp zz0˜lΚLw8oë29ww¤§Qu ¥D⌈íaýË¢ésJ8Á¬ 3oùÙ$¦1Nℜ1>Rét7WPM¨.¶8¹D92k5D9∗8≈R l©3ªSj·Ψ8pΣïKùi6rrÔrbÛu¬i2V∗∏v5ª10a27BÁ Ú♦Ξsa9j3χsa¯iΟ Oi℘ml6óféowbz∀wA6ù→ ñ×bàai´wbs♦βGs Ù81i$iÀˆ12⊃2wC82n8o.µ3NJ9S1©Θ0P1Sd
|
||||
What made no one in each time. Mommy was thinking of course beth. Everything you need the same thing
|
||||
P2EVG29srEx⇐9oN3U1yE2i2OR5kÇÿAΤηνULP¿∧q R5¿FHt7J6E»1C∅A2∃aVLu∗¢tT⟨21šHq9Né:
|
||||
⊥Þ21T11BrrC712adš6lmzb16ai07tdBo×KopíΡ1lj4Hy 2aÓ1aÖí∉Ós1a2’ 4D1kleow2o3–12wjR≤Π 1Rh2af27≅s26u2 8NLV$∪⇓1↓1Y¶21.v2È232S7202n11 m5VKZy3K2iñ21DtÚ2HrhGaMvr5ïR1o11namΜw22anFu8x7⌈sU E4cva11ε™s7ΑGO dA35ldñÌèoAξI1wXK2n f1x¾a∏7ffs†222 5msC$72t10z„n2.it1T7O8vt5182· Jï12PkáO1rn2rAo8s5∅z—4Rha11t˜cq5YΧ ΤQ2ra2⌋4¹sÜ51§ 2VBιluw2ioL32Bw1111 5∈22a1I22sšÛ21 G17ρ$kJM80∼∠ℵl.J1Km3212⊃52鼧 p121A1NU0c¥x2fo⟨22cm14QGpHEj7lnDPVieV21aΠ2H7 1j26azBSesë1c9 ´2Ù¬l0n21o22RVw1X1Ï αV21a≅σ1Zs§jJå 3pFN$1Kf821YΟ7.32Y95JΑqŸ0v91Q
|
||||
ñ↑yjPΤ1u6rFwhNeCOϖ2d5Γêcne¼a0iTF15sxUS0o88ℵ1laÅT℘oOB11n2111e∧Kpf υ98ξabp†3sj82& 9©Bol2AWSo7wNgw21mM tteQat0ϖ2s4≡NÇ ÕÆ1Θ$2R2q0117ª.mt111—uwF57H♣f æ∪HYSjψ3Byš1g1ndX15t1126hZ⇒y2r82mdowy2diψ8YΗd0ršŠ N029a13I¦sQaý2 20Y7lZ118o∫50Çw1\"1Ζ n6Ü≥a∇lßnsF›J9 1DΟK$142L0S7z2.Ta2X31R9953911
|
||||
PïEVGÿ9srEx⇐9oN3U®yEÎi2OR5kÇÿAΤηνULP¿∧q R5¿FHt7J6E»¯C∅Aå∃aVLu∗¢tT〈2ÚHq9Né:
|
||||
⊥ÞÞ¨T¦ªBrrC7³2adš6lmzb¨6ai07tdBo×KopíΡÄlj4Hy ÝaÓ1aÖí∉Ós1aá’ 4DkleowËo3–1ÍwjR≤Π £RhÈafà7≅sù6u2 8NLV$∪⇓»↓1Y¶2µ.vßÈ23ÖS7û0Ün¬Ä m5VKZy3KÎiñë¹DtÚ2HrhGaMvr5ïR«oÂ1namΜwÐãanFu8x7⌈sU E4cva£Âε™s7ΑGO dA35ldñÌèoAξI1wXKïn f¼x¾a∏7ffs†ìÖð 5msC$7Ët¦0z„n÷.it¡T7O8vt5¼8å· Jï1ÏPkáO¶rnùrAo8s5∅z—4Rha1®t˜cq5YΧ ΤQÍraÑ⌋4¹sÜ5²§ ûVBιluwóioL3ëBw£±1¶ 5∈àáa1IÊ2sšÛÛ G´7ρ$kJM80∼∠ℵl.J1Km32µÚ⊃5ã鼧 p°ÿA¹NU0c¥xçfo〈Øácm14QGpHEj7lnDPVieV2¶aΠ2H7 ²j26azBSesë1c9 ´2Ù¬l0nò¤oõâRVw¦X´Ï αVõa≅σ¼Zs§jJå 3pFN$¾Kf821YΟ7.3ÍY95JΑqŸ0v9ÄQ
|
||||
ñ↑yjPΤ1u6rFwhNeCOϖúd5Γêcne¼a0iTF¹5sxUS0o88ℵªlaÅT℘oOBÀ¹në·1e∧Kpf υ98ξabp†3sj8â& 9©BolÎAWSo7wNgwø¦mM tteQat0ϖ2s4≡NÇ ÕƦΘ$ùRÓq0·Ã7ª.mt¾³1—uwF57H♣f æ∪HYSjψ3Byš²g¤ndXÀ5tµ¯ò6hZ⇒yÿr8ÿmdowyðdiψ8YΗd0ršŠ N0Ý9aÃ3I¦sQaýê Õ0Y7lZ¯18o∫50Çwµ\"©Ζ n6Ü≥a∇lßnsF›J9 ºDΟK$Á4ÉL0S7zÖ.Ta2X3²R995391¡
|
||||
Turning to mess up with. Well that to give her face Another for what she found it then. Since the best to hear
|
||||
GX1♦Ca2isA18¡bN2î81A22zΘD∇tNXIfWi–Ap2WYNYF1b ≠7yφDpj6©R04E1U1ñn7G1o2jS111∋TC⊥πËO1∗21RtS2wE6621 ν222ASi21DP“8λV∧W⋅OA2g6qNtNp1T269XA7¥11GGI6SEwU22S3Χ12!Okay let matt climbed in front door. Well then dropped the best she kissed
|
||||
122C>Φ221 flQkWMŠtvo2dV1rT1ZtlN6R9dZ12LwuD19i3B5FdcÆl2eSwJd K1tDDfoX±evrýwlK7P÷i1e13v2zèCe¬Μ♣ΝrGhs2y172Y!gZpá R6O4O112∋r92Z1dB6i1e2σ∼ÓrCZ1s 122I31e2¤+⌉CêU 1k6wG1c‚1o60AJoR72sd3i11s22pt Ø277a2∀f5np¤n2duE8⇒ 21SHGJVAtew∇Lëtς2D2 6k28FgQQ⊂R81L2EI2∉iEHÍÉ3 H2r5Af1qximςρ‡r6©2jmWv92aW21giAC21lM⌋1k 2V2¸S2ùθ2h15BΙi∗ttEp8¢EPpSzWJi32U2n5ìIhgx8n⌉!j∏e5
|
||||
x1qJ>mC7f 512y1GA420lCQe09s9u%uksã ψ2X5A4g3nu←Τyst72pMhšg12e⟩pÚ1n1YƒŠtÉ2LGizqQ↓c3tÙI œïbXMKÛRSertj2d\"Ot2ss581!oo2i FÂW2EW2DDx7hI2pΦS2Bi2drUr⇔J<2a1Αzwt01p2i28R2oH21Än172r 1122DYvO7ak21ht204Πe∂λ11 12dUoο1X3fc631 e&∪GOxT3CvXcO1e3K2νr31y2 262z31∞I1 Pì∃zYt6F4e6è⇓va5229rkΘ32sKP5R!ιµmz
|
||||
3212>22′L 2óB⊥S∩OQMeý∉2Φc229Tu2a∫dr25ûMeLk92 121OOø9oKnÿψÀWl7H2∅i9ρÈ2ni2•2eXPxí 1251SUqtBh72a5otSZ9p222Dpf1Ý2i2ωbjn11Ÿ2gs2h− bå2swx2oSiq8hvt2262h⌈b²S 26þSVBEFCi2Uàds9Ñ1Εa11ξ2,1„wv jw7AMK2↔la2G91s23«etuB2keDã2ìr1¨IeC¾EaÄao÷″∧r>6e1d9D21,mtS2 I∗44A1Rˆ2M98zME≅QŸÐX¹4j6 20n3a1'22nxpl6d832J 06Ð9E22ý2-2829c42r2h72¥med½♠kc23sPk12•r!⟩QCa
|
||||
Še21>1σ12 bpøNERN8eaD61ns7Abhy±12∩ D7sVR8'1Ee22DVfc˜32u72Æqnc23qd2∼4∇sρmi5 6212a21∝TnQb9sd1Mùℑ ∑gM22bN2¶4cä½⊆/4X1κ71f1z ϖ12ECzf•1uMbycs1•9¾ts0T2o3h2DmSs31e7B2Ér2⋅22 φ81″SSXð1uúI15p58uHp2c2±o∂T1Rrd6sMt∪1µξ!24Xb
|
||||
GX°♦Ca2isA¾8¡bNÉî8ÂAöÜzΘD∇tNXIfWi–Ap2WYNYF®b ≠7yφDpj6©R04EÂU´ñn7GÆoÌjS³Á∋TC⊥πËO1∗÷©RtS2wE66è νÑêéASi21DP“8λV∧W⋅OAÖg6qNtNp1T269XA7¥À²GGI6SEwU2íS3Χ1â!Okay let matt climbed in front door. Well then dropped the best she kissed
|
||||
¤ÊüC>ΦÉí© flQkWMŠtvoÐdV¯rT´ZtlN6R9dZ¾ïLwuD¢9i3B5FdcÆlÝeSwJd KªtDDfoX±evrýwlK7P÷i§e³3vÎzèCe¬Μ♣ΝrGhsáy°72Y!gZpá R6O4O»£ð∋r9ÊZÀdB6iÀeîσ∼ÓrCZ1s ²ú÷I3ÁeÒ¤+⌉CêU »k6wG´c‚¾o60AJoR7Ösd3i¿Ásððpt Øè77añ∀f5np¤nþduE8⇒ ȹSHGJVAtew∇LëtςëDæ 6kÌ8FgQQ⊂R8ÇL2EI2∉iEHÍÉ3 Hÿr5Af1qximςρ‡r6©2jmWv9ÛaWð¸giACÜ¢lM⌋¿k ÊVÚ¸SÓùθçhµ5BΙi∗ttEp8¢EPpSzWJi32UÎn5ìIhgx8n⌉!j∏e5
|
||||
x¯qJ>mC7f 5ºñy1GA4Ý0lCQe09s9u%uksã ψìX5A4g3nu←Τyst7ÍpMhšgÀÖe〉pÚ£n¼YƒŠtÉÚLGizqQ↓c3tÙI œïbXMKÛRSertj×d\"OtÊss58®!oo2i FÂWáEWøDDx7hIÕpΦSôBiÒdrUr⇔J<Õa1Αzwt0°p×ià8RÌoHÛ1Än¥7ÿr ¯¥õàDYvO7aká»htì04Πe∂λÇ1 1ÈdUoο°X3fc63¶ e&∪GOxT3CvXcO·e3KËνr3¸y2 26Ëz3Ã∞I± Pì∃zYt6F4e6è⇓va5÷þ9rkΘ3äsKP5R!ιµmz
|
||||
3í1ë>ð2′L 2óB⊥S∩OQMeý∉ÑΦcöè9Tuãa∫drâ5ûMeLk9Ô £æ1OOø9oKnÿψÀWl7HÏ∅i9ρÈÊniâ•ÛeXPxí ´Í5¡SUqtBh7æa5otSZ9pØËÛDpf®ÝÊiÛωbjn¯½Ÿ2gsçh− båÌswxðoSiq8hvtèé6Òh⌈b²S ×6þSVBEFCiøUàds9ѤΕaƧξÜ,1„wv jw7AMKÈ↔laæG9¦së3«etuB2keDãæìr°¨IeC¾EaÄao÷″∧r>6e¸d9DùÇ,mtSö I∗44A¹RˆêM98zME≅QŸÐX¹4j6 î0n3a1'Êânxpl6d83þJ 06Ð9Eïãýã-28Ú9c4ßrØh7è¥med½♠kcñ3sPk¶2•r!〉QCa
|
||||
ŠeÏÀ>Ãσ½å bpøNERN8eaD6Åns7Abhy±Æü∩ D7sVR8'ºEeÿáDVfc˜3ëu7ÏÆqncË3qdÊ∼4∇sρmi5 6æ¾Êaä°∝TnQb9sdÀMùℑ ∑gMÿ2bNð¶4cä½⊆/4X1κ7¥f1z ϖ1úECzf•1uMbycs1•9¾ts0Tào3hêDmSs3Áe7BíÉrô⋅ãÔ φ8Ä″SSXð¤uúI¸5p58uHp2cß±o∂T©Rrd6sMt∪µµξ!é4Xb
|
||||
|
||||
Both hands through the fear in front.
|
||||
Wade to give it seemed like this. Yeah but one for any longer. Everything you going inside the kids.
|
||||
|
@ -414,7 +414,7 @@ Wade to give it seemed like this. Yeah but one for any longer. Everything you go
|
|||
},
|
||||
{
|
||||
data: IO.read('test/fixtures/mail21.box'),
|
||||
body_md5: '617017ee0b2d1842f410fceaac696230',
|
||||
body_md5: 'c9fb828072385643e528ab3a9ce7f10c',
|
||||
params: {
|
||||
from: 'Viagra Super Force Online <pharmacy_affordable1@ertelecom.ru>',
|
||||
from_email: 'pharmacy_affordable1@ertelecom.ru',
|
||||
|
@ -684,6 +684,42 @@ Weil wir die Echtheit oder Vollständigkeit der in dieser Nachricht enthaltenen
|
|||
body: 'some html text',
|
||||
},
|
||||
},
|
||||
{
|
||||
data: IO.read('test/fixtures/mail36.box'),
|
||||
body_md5: '428327fb533b387b3efca181ae0c25d0',
|
||||
params: {
|
||||
from: 'Martin Smith <m.Smith@example.com>',
|
||||
from_email: 'm.Smith@example.com',
|
||||
from_display_name: 'Martin Smith',
|
||||
subject: 'Fw: Zugangsdaten',
|
||||
to: 'Martin Edenhofer <me@example.com>',
|
||||
body: '
|
||||
--
|
||||
don\'t cry - work! (Rainald Goetz)
|
||||
|
||||
|
||||
|
||||
Gesendet: Mittwoch, 03. Februar 2016 um 12:43 Uhr
|
||||
Von: "Martin Smith" <m.Smith@example.com>
|
||||
An: linuxhotel@zammad.com
|
||||
Betreff: Fw: Zugangsdaten
|
||||
|
||||
|
||||
--
|
||||
don\'t cry - work! (Rainald Goetz)
|
||||
|
||||
|
||||
|
||||
Gesendet: Freitag, 22. Januar 2016 um 11:52 Uhr
|
||||
Von: "Martin Edenhofer" <me@example.com>
|
||||
An: m.Smith@example.com
|
||||
Betreff: Zugangsdaten
|
||||
Um noch vertrauter zu werden, kannst Du mit einen externen E-Mail Account (z. B. [1] web.de) mal ein wenig selber “spielen”. :)
|
||||
|
||||
|
||||
[1] http://web.de',
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
count = 0
|
||||
|
|
|
@ -141,28 +141,28 @@ Some Text",
|
|||
1 => {
|
||||
body: "_________________________________________________________________________________Please beth saw his head
|
||||
|
||||
92hH3ÿoI221G1¿iH16u-2◊NQ422U1awAq¹JLZμ2IicgT1ζ2Y7⊆t 63‘M236E2Ý→DA2†I048CvJ9A↑3iTc4ÉIΥvXO502N1FJSð1r 154F1HPO11CRxZp tLîT9öXH1b3Es1W mN2Bg3õEbPŒS2fτTóY4 sU2P2ζΔRFkcI21™CÓZ3EΛRq!Cass is good to ask what that
|
||||
86Ë[1] 2u2C L I C1K H E R E28MLuke had been thinking about that.
|
||||
9õhH3ÿoIÚõ´GÿiH±6u-û◊NQ4ùäU¹awAq¹JLZμÒIicgT1ζ2Y7⊆t 63‘Mñ36EßÝ→DAå†I048CvJ9A↑3iTc4ÉIΥvXO50ñNÁFJSðr 154F1HPOÀ£CRxZp tLîT9öXH1b3Es±W mNàBg3õEbPŒSúfτTóY4 sUÖPÒζΔRFkcIÕ1™CÓZ3EΛRq!Cass is good to ask what that
|
||||
86Ë[1] ÏuÕC L I C K H E R E28MLuke had been thinking about that.
|
||||
Shannon said nothing in fact they. Matt placed the sofa with amy smiled. Since the past him with more. Maybe he checked the phone. Neither did her name only. Ryan then went inside matt.
|
||||
Maybe we can have anything you sure.
|
||||
á•XMY2ÅEE12N°kP'dÄ1S4⌉d √p¨HΣ>jE4y4AC22L2“vT∧4tHX1X:
|
||||
x5VV\"1ti21aaΦ3fg¦z2r1°haeJw n1Va879sÆ3j f1ïl29lo5F1wν11 κψ›a9f4sLsL 2Vo$v3x1¸nz.u2¦1H4s3527 yoQC1FMiMzda1ZεlÝHNi1c2s2–ϖ DYhaã7Ns421 n3dl1X1o11¶wpN↑ YQ7a239s1q2 QyL$fc21ΝS5.5Wy621d5Ä1H
|
||||
17<V401i421aθ1Tg21Gr9E2aΡBw →2ÖSRSLu72lpL6Ve191r1HL FEpA229cP¬ltÒcDib2XvTtFel3®+bVM 252aXWas4º2 μ2Kl∏7mo√23wSg1 ι£Ca11Xso18 1L2$…412Jo↑.0Λa53iè55W2 23IV4◊9iF2Va2Õóg8³9r℘buaf12 fc7Pg3⊆rzç8o2−⋅fÿ≥ZeaPÑs5⇐TsiΨ∋i92uoU8RnΨ⌉•aw1flf22 TQNaU›ésvDu B1Il6Θlo∠HfwNX8 36Xa∼α1sT1d ŠHG$2õ13QW1.‰›Y52g80¦ao
|
||||
LKNV0ÄwiM4xafsJgFJ2r27”a⇐M2 ∠O5SQ2Mut21p2ÅÃe¨2HrZ41 1UΛF¨Tso2wXr24Icky2e1qY 074a2l⌊s2H1 42pl24Xob0aw4FÔ 28∴a70lsA30 ßWF$Z¸v4AEG.2612t9p5¶1Q M91Cε92i0qPa1A2lW5Pi5Vusi8ë 2O0SE2Eu2∈2p2Y3eTs6r622 l12Ay2jcQpet13õiiqXvPVOe81V+1“G 126a1Π7sJ2g 1J2l♥Š1o2olwBV2 →Amaη2¯sa22 H22$2Ef2∈n5.Œ8H95119⊃ƒ2
|
||||
á•XMYÍÅEE£ÓN°kP'dÄÅS4⌉d √p¨HΣ>jE4y4ACüûLì“vT∧4tHXÆX:
|
||||
x5VV\"¹tiçÂaaΦ3fg¦zèr«°haeJw n§Va879sÆ3j f¶ïlÞ9lo5F¾wν¶1 κψ›a9f4sLsL ùVo$v3x1¸nz.uȦ1H4s35Ô7 yoQCÄFMiMzda¯ZεlÝHNi¬cÚsù–ϖ DYhaã7Ns4Ö· n3dl1XÆo¯µ¶wpN↑ YQ7aé39s1qÓ QyL$fcÕ1ΝS5.5Wy62d5ĶH
|
||||
³7<V401i4æÂaθÀTg÷ÄGr9EûaΡBw →ÌÖSRSLu72lpL6Veº9Ær¾HL FEpAÕø9cP¬ltÒcDibäXvTtFel3®+bVM ø5ôaXWas4ºä μÕKl∏7mo√þ3wSg1 ι£Ca´´Xso18 ÅL2$…4¾2Jo↑.0Λa53iè55WÕ î3IV4◊9iFÊVaßÕóg8³9r℘buaf®2 fc7Pg3⊆rzç8oÜ−⋅fÿ≥ZeaPÑs5⇐TsiΨ∋i9ÌuoU8RnΨ⌉•aw1flfùë TQNaU›ésvDu BÇIl6Θlo∠HfwNX8 36Xa∼α»sT½d ŠHG$Îõ¬3QWÀ.‰›Y5Ôg80¦ao
|
||||
LKNV0ÄwiM4xafsJgFJär27”a⇐MÔ ∠O5SQØMuté«p÷ÅÃe¨ûHrZ4Ä 1UΛF¨TsoûwXrú4Ickyçe½qY 074aÙl⌊sÐH1 4Ùplø4Xob0aw4FÔ 28∴a70lsA30 ßWF$Z¸v4AEG.Î6¨2t9p5¶¼Q M9¯Cε92i0qPa¹AölW5Pi5Vusi8ë ðO0SE2Euù∈èpòY3eTs6r6ý2 lªÌAyîjcQpet½3õiiqXvPVOe8V+«“G ¤ó6a®Π7sJÕg ¡JÈl♥Š¾oÐolwBVà →AmaηÒ¯saÑÚ Häð$2Ef2∈n5.Œ8H95¨19⊃ƒõ
|
||||
Up dylan in love and found herself. Sorry for beth smiled at some time Whatever you on one who looked. Except for another man and ready.
|
||||
Ú2eAC2øNË1UT3L♠ICë9-BŒfAoÓCL5Β2LHοNE5∂7RScdGX11IpΣuCCw∨/D16A1v2S0d⊂T1'BHf2ΔM227A63B:
|
||||
2U2V51Ue212nRm2t22Ooγ12ly¼Wi6pxnÀZ1 c2Sa8ï1sG2⊂ ΜJll1£„onb2w⌉ö1 vY8aΘmgs024 å¥G$1592KkU11b0.½Âℜ54Èh0º1h Zf1A0j¸dc1ξv™Xpagl2ib8YrSf0 1Wia141s1×7 TAwll1dom1Gw2¿z Β21aˆy2sN8η 3oo$D012Λp14c2z.PA∅9ϒ7354ú9
|
||||
R2íNn¨2aYRøs≅←ÍoPÀynCΧ1ef2ox2∪h E18aN22siÿ5 f47l147oF1jwG2É 108a1edsjÛS ¿e1$KèR1LD272oè.41O99Ý192ϖn 12↵Sι3”pÝ2‾iEuerΓy0iY30vΤA6a2\"Y 465a1m6sg1s C∀ilΑ2Πor6yw712 1KΩa232s∇Δ1 9Χ9$MWN2P02822β.2∩S93220RQ’
|
||||
ÚúeACíøN˵UT3L♠ICë9-BŒfAoÓCL5ΒÉLHοNE5∂7RScdGXªIpΣuCCw∨/D¤6A´vâS0d⊂TÇ'BHfóΔMåß7A63B:
|
||||
2UýV5¦Ueý¿×nRm2tæÓOoγ1øly¼Wi6pxnÀZ« câSa8ï¤sGï⊂ ΜJll1£„onbéw⌉ö1 vY8aΘmgs0Ú4 å¥G$·592KkU1®b0.½Âℜ54Èh0º´h ZfA0j¸dc1ξv™Xpagl×ib8YrSf0 ¨WiaÀ4»sÁ×7 TAwll¨dom1Gw2¿z ΒÿÀaˆyÎsN8η 3oo$D012Λp³4cìz.PA∅9ϒ7354ú9
|
||||
RãíNn¨2aYRøs≅←ÍoPÀynCΧ»efõoxÕ∪h E18aNÿÜsiÿ5 f47lÃ47oFÂjwGÎÉ ·08aºedsjÛS ¿e®$KèR1LDÍ7üoè.4·O99Ý£9íϖn ¶ú↵Sι3”pÝó‾iEuerΓy0iY30vΤA6a2\"Y 465a1m6sgÁs C∀ilΑÒΠor6yw7¿ð 1KΩaÐ32s∇Δ¤ 9Χ9$MWN2P0É8óËβ.Ö∩S93íñ0RQ’
|
||||
Have anything but matty is taking care. Voice sounded in name only the others Mouth shut and while he returned with. Herself with one who is your life
|
||||
2²2Gu8NEZ3FNFs2E1RnRÇC9AK4xL151 25bH97CE«20A2q¢L1k→TªJkHe3š:Taking care about matt li? ed ryan. Knowing he should be there.
|
||||
Ks£T2bIr74Ea2DZmœH1a17od1∪vo2ozlP3S 23‹azy∝sÚ1Q 42¹ll21ovh7w2D2 1Qwa⇑cΒs¨wH Iµe$⇐J517T2.t5f361B062Ψ 5z℘Z4nGi289t←f4hvn2rbŸTo1s9m12qand1xxO6 I2∪ak½0s21M 2Η¡l22¾orztw170 —♣≅ar6qsvDv 76T$3×D0erÍ.d107WoI51K2 ϒa9P'1¯rP74o2ψ2zχf2aÃ2ñc3qY →®7aaRgsN1k 1‰Σl2p1o7R⊂wÆ2e 3Iha♣d˜s3g7 23M$≡⋅10AY4.Uq√321k5SUΜ Zr2A8Ö6cZŸdoΡeumpq1pAoUl2I2ieY2aK>∂ 3n6ax1Qs20b °Häl91ÑoÏ6aw≡d2 ΗÅ2a1Óvs⊃17 C⊆1$2Bz2sl2.∫Pb5ØMx0oQd
|
||||
ZΙμPCqmrµp0eAΦ♥dô‾Ωn∠2si4y2s28«o6∀ClDeÌoPbqnd1Jelè2 2ˆ5aWl⟨sbP2 2²2l8¢OoH¸ew’90 Υ66a21dsh6K r61$7Ey0Wc2.£—012C857Aþ i1σS€53yxµ2n80ntΡΠmhç≡hrB1doµS1ih2rdOKK 712a←2Is2⌉V Cssl1´RoT1QwyÉΔ •∏∞a2YGs18E 1πx$04ò0gMF.bTQ3Íx6582ς
|
||||
ÿ²íGu8NEZ3FNFsôEÆRnRÇC9AK4xLÀ5Ç Ì5bH97CE«Ì0AÎq¢Lµk→TªJkHe3š:Taking care about matt li? ed ryan. Knowing he should be there.
|
||||
Ks£TäbIr74EaãDZmœH¡a³7odÅ∪voÒozlP3S 23‹azy∝sÚ°Q 4â¹ll21ovh7w2D2 ©Qwa⇑cΒs¨wH Iµe$⇐J517Tñ.t5f36ÅB06ãΨ 5z℘Z4nGiý89t←f4hvnàrbŸTo1s9m¥Ëqand·xxO6 Iÿ∪ak½0sÙ£M ûΗ¡løȾorztw170 —♣≅ar6qsvDv 76T$3×D0erÍ.d¼07WoI5ÀKú ϒa9P'¶¯rP74o2ψÈzχfþaÃàñc3qY →®7aaRgsN©k ¯‰ΣlÍpÃo7R⊂wÆðe 3Iha♣d˜s3g7 È3M$≡⋅ª0AY4.Uq√3Û±k5SUΜ Zr2A8Ö6cZŸdoΡeumpq¼pAoUlèI2ieYÒaK>∂ 3n6ax1Qs20b °Häl9¶ÑoÏ6aw≡dä ΗÅ2a¢Óvs⊃Á7 C⊆Ä$2Bz2sló.∫Pb5ØMx0oQd
|
||||
ZΙμPCqmrµp0eAΦ♥dô‾Ωn∠2si4y2s÷8«o6∀ClDeÌoPbqnd¡Jelè× ÿˆ5aWl〈sbPÔ ï²çl8¢OoH¸ew’90 Υ66aÕÆdsh6K r6Ç$7Ey0WcÎ.£—012C857Aþ i·σS€53yxµèn80ntΡΠmhç≡hrB²doµS¥ih÷rdOKK 7½öa←ãIs2⌉V Cssl±´RoT1QwyÉΔ •∏∞aïYGsÂ8E 1πx$04ò0gMF.bTQ3Íx658ùς
|
||||
Maybe even though she followed. Does this mean you talking about. Whatever else to sit on them back
|
||||
←4BC32hAGAWNr2jAGυ»D1f4I2m√AHM9N⟩12 ‚1HD19ÜR23∨U90IG199S1∪”T123O2°cR0E⇑E211 42aA″XΝD14ℑVAK8A1d9Nr1DT112A5khGA3mE98ÔS9KC!5TU
|
||||
AMm>EjL w∗LWυIaoKd1rΘ22l2IΚdê5PwO4Hi2y6dÖH⌊eÃìg j14Dr15e700lH12iJ12vY…2e1mhr114yrÆ2!∑η2 21υOΔfδrKZwd4KVeB12rℜ01 PΖ2341o+A7Y 126GM17oGOºos7∑d272s18P ο♦QaRn–n5b2d02w 2rϒGI2ℑem0∀t1b2 20rF4O7R221E12⊆ESΥ4 KF0A212i5ïcrt⊆€mRJ7aNΛ2in26l5bQ 1ϒtSZbwh3¶3ig♠9p2″2p×12iK11nsWsgdXW!tBO
|
||||
m0W>Y2 b1u1xΔd03¯¬0vHK%21ó 674Aj32uQ←ÏtÈH1houqey1Yn221t⌋BZi1V2c1Tn >ZΓM222e311d2s5s22›!102 2¡2Em21x2V2p1∨6i2dârB9ra72mtSzIiMlVo0NLngΒû 22LD7⇑maNx3tUζ∪etc2 902o123fv49 w≅1O0giv12YeX2NryfT 3fP3xZ2 F2ÃY8q1eE1ÜaâyfrΜpls92Â!qκ2
|
||||
î5A>∀pƒ ZµÍSδ32em2sc⊕7vu41JrÒ1we2yh qaρO2p¼nΣxZlrN1i♠2cnl4jeN1Q y2≅Sb63h17⟩of1ypÅA1pþh0iÔcbnec4gI21 h2Uw23‹i92ktS12h6V1 g1sVŒ2uipV1se2⋅a42V,T6D 228MΡY1a⊃ºΕs5ù2t9IDeFDℑrXpOCe“μan1Mr11Kd122,e27 DfmA21NM92hEU2∨XσψG 4j0a181nhTAdmT2 192Eνμr-U4fc121h8ª¸eoycc9xjk⁄ko!29K
|
||||
12…>J6Á 1⟩8EÖ22a141s117y3â8 1f2R6olewtzfw¹suýoQn⇓³³d24Gs¢7« AlDa1H1n9Ejdtg› 12θ2ε1⊇41″A/42v72z→ 231C622u56Xs9⁄1t∑ΙioxÉjm2R2e1W2rH25 o¥2S≥gmuX2gp3yip·12oD13rc3μtks∪!sWK
|
||||
←4BC3éhAGAWNrÛjAGυ»D¬f4Iðm√AHM9N〉1è ‚¬HDÁ9ÜRâ3∨U90IG¾99S¶∪”T¥ì3OË°cR0E⇑E2°1 4ÖaA″XΝDµ4ℑVAK8Aµd9NrÅDT¦12A5khGA3mE98ÔS9KC!5TU
|
||||
AMm>EjL w∗LWυIaoKd¹rΘ22l2IΚdê5PwO4Hiây6dÖH⌊eÃìg j14Dr5e700lH·ÐiJ±ùvY…öe¦mhr¸«4yrÆÔ!∑η2 ÷¬υOΔfδrKZwd4KVeB¶órℜ0Ç PΖ×341o+A7Y ¬æ6GM17oGOºos7∑d×7ûs¤8P ο♦QaRn–n5b2d0ìw ËrϒGIÑℑem0∀t³bæ 20rF4O7Rä2°EÇò⊆ESΥ4 KF0AÒÂßi5ïcrt⊆€mRJ7aNΛÿinÕ6l5bQ ¸ϒtSZbwh3¶3ig♠9p2″Ìp×¢êiK»´nsWsgdXW!tBO
|
||||
m0W>YÙ b¬u1xΔd03¯¬0vHK%Þ¹ó 674Aj3öuQ←ÏtÈH¨houqeyªYnÑ21t⌋BZi¦V2c¬Tn >ZΓMöÜÊe3Å1dís5s2ø›!³0û 2¡ÌEmè1xéV2p1∨6iâdârB9ra72mtSzIiMlVo0NLngΒû ú2LD7⇑maNx3tUζ∪etcù 90ìo¶Ù3fv49 w≅»O0givÅýYeXïNryfT 3fP3xZÕ FñÃY8q¯eEÂÜaâyfrΜpls9âÂ!qκÊ
|
||||
î5A>∀pƒ ZµÍSδ3éem2sc⊕7vu41JrÒ°weÊyh qaρOÏp¼nΣxZlrN¡i♠Êcnl4jeN¶Q y2≅Sb63h17〉ofµypÅAÆpþh0iÔcbnec4gIù1 h2Uw23‹i9çktSÅÏh6Vº g±sVŒóuipV¯seÈ⋅a4üV,T6D 2ý8MΡY©a⊃ºΕs5ùýt9IDeFDℑrXpOCe“μan·Mr¾1Kd¥ëð,eø7 DfmAæ¤NM9ïhEUË∨XσψG 4j0a°81nhTAdmTü «9öEνμr-U4fc¨Þ1h8ª¸eoycc9xjk⁄ko!ë9K
|
||||
¬Û…>J6Á ¢〉8EÖ22a³41s¬17y3â8 °f2R6olewtzfw¹suýoQn⇓³³d×4Gs¢7« AlDa°H¶n9Ejdtg› ¯ôθ2ε¥⊇4¯″A/4Øv72z→ Ü3¥C6ú2u56Xs9⁄1t∑ΙioxÉjmØRùe1WÔrH25 o¥ßS≥gmuX2gp3yip·³2oD£3rc3μtks∪!sWK
|
||||
|
||||
When she were there you here. Lott to need for amy said.
|
||||
Once more than ever since matt. Lott said turning o? ered. Tell you so matt kept going.
|
||||
|
|
|
@ -86,7 +86,7 @@ class TicketNotificationTest < ActiveSupport::TestCase
|
|||
assert(ticket1)
|
||||
|
||||
# execute ticket events
|
||||
ENV['SERVER_NAME'] = nil
|
||||
Rails.configuration.webserver_is_active = nil
|
||||
Observer::Ticket::Notification.transaction
|
||||
#puts Delayed::Job.all.inspect
|
||||
Delayed::Worker.new.work_off
|
||||
|
@ -121,7 +121,7 @@ class TicketNotificationTest < ActiveSupport::TestCase
|
|||
assert(ticket1)
|
||||
|
||||
# execute ticket events
|
||||
ENV['SERVER_NAME'] = 'some_host'
|
||||
Rails.configuration.webserver_is_active = true
|
||||
Observer::Ticket::Notification.transaction
|
||||
#puts Delayed::Job.all.inspect
|
||||
Delayed::Worker.new.work_off
|
||||
|
@ -159,7 +159,7 @@ class TicketNotificationTest < ActiveSupport::TestCase
|
|||
assert( ticket1, 'ticket created - ticket notification simple' )
|
||||
|
||||
# execute ticket events
|
||||
ENV['SERVER_NAME'] = 'some_host'
|
||||
Rails.configuration.webserver_is_active = true
|
||||
Observer::Ticket::Notification.transaction
|
||||
#puts Delayed::Job.all.inspect
|
||||
Delayed::Worker.new.work_off
|
||||
|
|
Loading…
Reference in a new issue