From f602ff50e23fdebb31ee8bfea0e54eaf1b00b99c Mon Sep 17 00:00:00 2001 From: Mathias Kresin Date: Sat, 17 Jan 2015 23:15:47 +0100 Subject: [PATCH 1/7] adjust alert css classes to the message severity Use panel classes for styling and leave error class for errors. --- assets/css/app.css | 8 ++++---- templates/about.php | 6 +++--- templates/api.php | 4 ++-- templates/bookmarks.php | 2 +- templates/config.php | 2 +- templates/confirm_auto_update.php | 2 +- templates/database.php | 2 +- templates/edit_feed.php | 7 ++----- templates/feed_items.php | 4 ++-- templates/feeds.php | 2 +- templates/history.php | 2 +- templates/keyboard_shortcuts.php | 2 +- templates/show_item.php | 2 +- 13 files changed, 21 insertions(+), 24 deletions(-) diff --git a/assets/css/app.css b/assets/css/app.css index 59900b9..356ad92 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -237,7 +237,7 @@ textarea.form-error { } /* alerts */ -.alert { +.alert, .panel { padding: 8px 35px 8px 14px; margin-bottom: 20px; color: #c09853; @@ -253,7 +253,7 @@ textarea.form-error { border-color: #d6e9c6; } -.alert-error { +.alert-error, .panel-danger { color: #b94a48; background-color: #f2dede; border-color: #eed3d7; @@ -265,13 +265,13 @@ textarea.form-error { border-color: #bce8f1; } -.alert-normal { +.alert-normal, .panel-default { color: #333; background-color: #f0f0f0; border-color: #ddd; } -.alert-error a { +.alert-error a, .panel-danger a { color: #b94a48; } diff --git a/templates/about.php b/templates/about.php index e951ba3..f68688e 100644 --- a/templates/about.php +++ b/templates/about.php @@ -12,7 +12,7 @@
-
+

  • @@ -20,12 +20,12 @@
-
+

()
-
+

  • diff --git a/templates/api.php b/templates/api.php index 3c90608..e5dd7d6 100644 --- a/templates/api.php +++ b/templates/api.php @@ -12,7 +12,7 @@
-
+

  • @@ -20,7 +20,7 @@
-
+

  • diff --git a/templates/bookmarks.php b/templates/bookmarks.php index a9a862a..dbf58d1 100644 --- a/templates/bookmarks.php +++ b/templates/bookmarks.php @@ -7,7 +7,7 @@
-

+

diff --git a/templates/config.php b/templates/config.php index 9902f9d..fb59d7b 100644 --- a/templates/config.php +++ b/templates/config.php @@ -75,7 +75,7 @@

-
+
  • (, , , )
  • diff --git a/templates/confirm_auto_update.php b/templates/confirm_auto_update.php index c524370..7051125 100644 --- a/templates/confirm_auto_update.php +++ b/templates/confirm_auto_update.php @@ -2,7 +2,7 @@

-

+

diff --git a/templates/database.php b/templates/database.php index 0d927e9..449ecad 100644 --- a/templates/database.php +++ b/templates/database.php @@ -12,7 +12,7 @@
-
+
  • diff --git a/templates/edit_feed.php b/templates/edit_feed.php index 75fc39a..4ec4bb8 100644 --- a/templates/edit_feed.php +++ b/templates/edit_feed.php @@ -32,9 +32,6 @@
-
-
-
    -
  • -
+
+
diff --git a/templates/feed_items.php b/templates/feed_items.php index 1181c00..d34fd8a 100644 --- a/templates/feed_items.php +++ b/templates/feed_items.php @@ -1,5 +1,5 @@ -

+

go back to unread items') ?>

@@ -20,7 +20,7 @@
-

+

','') ?>

diff --git a/templates/feeds.php b/templates/feeds.php index bc7ea27..29ebb41 100644 --- a/templates/feeds.php +++ b/templates/feeds.php @@ -20,7 +20,7 @@ 0): ?>

', '') ?>

-

update your subscriptions?') ?>

+

update your subscriptions?') ?>

diff --git a/templates/history.php b/templates/history.php index 51713b7..85e687a 100644 --- a/templates/history.php +++ b/templates/history.php @@ -10,7 +10,7 @@
-

+

diff --git a/templates/keyboard_shortcuts.php b/templates/keyboard_shortcuts.php index 37982e9..87e4293 100644 --- a/templates/keyboard_shortcuts.php +++ b/templates/keyboard_shortcuts.php @@ -1,4 +1,4 @@ -
+

  • = gu
  • diff --git a/templates/show_item.php b/templates/show_item.php index 3be4e2d..b1bcf72 100644 --- a/templates/show_item.php +++ b/templates/show_item.php @@ -1,5 +1,5 @@ -

    +

    Date: Thu, 15 Jan 2015 02:00:17 +0100 Subject: [PATCH 2/7] re-enable help shortcut for Firefox, fix javascript errors --- assets/js/all.min.js | 38 +++++++++++++++++++------------------- assets/js/event.js | 28 ++++++++++++++-------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/assets/js/all.min.js b/assets/js/all.min.js index 07564f2..fe52903 100644 --- a/assets/js/all.min.js +++ b/assets/js/all.min.js @@ -1,21 +1,21 @@ var Miniflux={};Miniflux.App=function(){return{Run:function(){Miniflux.Event.ListenKeyboardEvents();Miniflux.Event.ListenMouseEvents()}}}(); -Miniflux.Feed=function(){var f=[];return{Update:function(e,a){var b=e.querySelector("span.items-count");if(b){var c=e.getAttribute("data-feed-id"),f=e.querySelector("h2:first-of-type");f.className="loading-icon";var h=new XMLHttpRequest;h.onload=function(){f.className="";e.removeAttribute("data-feed-error");var c=e.querySelector(".feed-last-checked");c&&(c.innerHTML=c.getAttribute("data-after-update"));c=JSON.parse(this.responseText);c.result?b.innerHTML=c.items_count.items_unread+"/"+c.items_count.items_total: -e.setAttribute("data-feed-error","1");a&&a(c)};h.open("POST","?action=refresh-feed&feed_id="+c,!0);h.send()}},UpdateAll:function(){var e=Array.prototype.slice.call(document.querySelectorAll("article:not([data-feed-disabled])")),a=setInterval(function(){for(;0f.length;){var b=e.shift();f.push(parseInt(b.getAttribute("data-feed-id")));Miniflux.Feed.Update(b,function(b){b=f.indexOf(b.feed_id);0<=b&&f.splice(b,1);0===e.length&&0===f.length&&(clearInterval(a),window.location.href="?action=unread")})}}, +Miniflux.Feed=function(){var e=[];return{Update:function(d,a){var b=d.querySelector("span.items-count");if(b){var c=d.getAttribute("data-feed-id"),e=d.querySelector("h2:first-of-type");e.className="loading-icon";var h=new XMLHttpRequest;h.onload=function(){e.className="";d.removeAttribute("data-feed-error");var c=d.querySelector(".feed-last-checked");c&&(c.innerHTML=c.getAttribute("data-after-update"));c=JSON.parse(this.responseText);c.result?b.innerHTML=c.items_count.items_unread+"/"+c.items_count.items_total: +d.setAttribute("data-feed-error","1");a&&a(c)};h.open("POST","?action=refresh-feed&feed_id="+c,!0);h.send()}},UpdateAll:function(){var d=Array.prototype.slice.call(document.querySelectorAll("article:not([data-feed-disabled])")),a=setInterval(function(){for(;0e.length;){var b=d.shift();e.push(parseInt(b.getAttribute("data-feed-id")));Miniflux.Feed.Update(b,function(b){b=e.indexOf(b.feed_id);0<=b&&e.splice(b,1);0===d.length&&0===e.length&&(clearInterval(a),window.location.href="?action=unread")})}}, 100)}}}(); -Miniflux.Item=function(){function f(a){return item_id=a.getAttribute("data-item-id")}function e(a){if(a&&a.hasAttribute("data-reverse-label")){var b=a.innerHTML;a.innerHTML=a.getAttribute("data-reverse-label");a.setAttribute("data-reverse-label",b)}}function a(a){"mouse"!==Miniflux.Event.lastEventType&&Miniflux.Nav.SelectNextItem();a.parentNode.removeChild(a);k--}function b(){0===k&&window.location.reload();var a=document.getElementById("page-counter");a.textContent=k||"";document.getElementById("nav-counter").textContent=h|| -"";switch(document.querySelector("section.page").getAttribute("data-item-page")){case "unread":document.title="Miniflux ("+h+")";break;case "feed-items":document.title="("+k+") "+a.parentNode.firstChild.nodeValue;break;default:document.title=a.parentNode.firstChild.nodeValue+" ("+k+")"}}function c(g){var d=f(g),c=new XMLHttpRequest;c.onload=function(){if(Miniflux.Nav.IsListing()){if(g.getAttribute("data-hide"))a(g);else{g.setAttribute("data-item-status","read");var d=g.querySelector("a.mark");e(d); -(d=g.querySelector("a.mark"))&&d.setAttribute("data-action","mark-unread")}h--;b()}};c.open("POST","?action=mark-item-read&id="+d,!0);c.send()}function m(g){var d=f(g),c=new XMLHttpRequest;c.onload=function(){if(Miniflux.Nav.IsListing()){if(g.getAttribute("data-hide"))a(g);else{g.setAttribute("data-item-status","unread");var d=g.querySelector("a.mark");e(d);(d=g.querySelector("a.mark"))&&d.setAttribute("data-action","mark-read")}h++;b()}};c.open("POST","?action=mark-item-unread&id="+d,!0);c.send()} -var h=function(){var a=document.getElementById("nav-counter");if(a)return counter=parseInt(a.textContent,10)||0}(),k=function(){var a=document.getElementById("page-counter");if(a)return counter=parseInt(a.textContent,10)||0}();return{MarkAsRead:c,MarkAsUnread:m,MarkAsRemoved:function(g){var d=f(g),c=new XMLHttpRequest;c.onload=function(){Miniflux.Nav.IsListing()&&(a(g),"unread"===g.getAttribute("data-item-status")&&h--,b())};c.open("POST","?action=mark-item-removed&id="+d,!0);c.send()},SwitchBookmark:function(g){var d= -f(g),c="1"===g.getAttribute("data-item-bookmark")?"0":"1",l=new XMLHttpRequest;l.onload=function(){var d=document.querySelector("section.page");if(Miniflux.Nav.IsListing()&&"bookmarks"===d.getAttribute("data-item-page"))a(g),b();else if(g.setAttribute("data-item-bookmark",c),Miniflux.Nav.IsListing())d=g.querySelector("a.bookmark"),e(d);else if((d=g.querySelector("a.bookmark-icon"))&&d.hasAttribute("data-reverse-title")){var f=d.getAttribute("title");d.setAttribute("title",d.getAttribute("data-reverse-title")); -d.setAttribute("data-reverse-title",f)}};l.open("POST","?action=bookmark&id="+d+"&value="+c,!0);l.send()},SwitchStatus:function(a){var d=a.getAttribute("data-item-status");"read"===d?m(a):"unread"===d&&c(a)},Show:function(a){(a=a.querySelector("a.show"))&&a.click()},OpenOriginal:function(a){var d=a.querySelector("a.original");d&&("unread"===a.getAttribute("data-item-status")&&c(a),d.removeAttribute("data-action"),"mouse"!==Miniflux.Event.lastEventType&&d.click())},DownloadContent:function(a){var d= -document.getElementById("download-item");if(d){d.innerHTML=" "+d.getAttribute("data-before-message");d.className="loading-icon";var b=new XMLHttpRequest;b.onload=function(){var a=JSON.parse(b.responseText);d.className="";if(a.result){var c=document.getElementById("item-content");c&&(c.innerHTML=a.content);d.innerHTML=d.getAttribute("data-after-message")}else d.innerHTML=d.getAttribute("data-failure-message")};a=f(a);b.open("POST","?action=download-item&id="+a,!0);b.send()}},MarkListingAsRead:function(a){for(var b= -document.getElementsByTagName("article"),c=[],e=0,h=b.length;eb-(a.offsetTop+a.offsetHeight)||b-a.offsetTop>document.documentElement.clientHeight)&&window.scrollTo(0,a.offsetTop-10)}function e(){return document.getElementById("listing")?!0:!1}return{OpenNextPage:function(){var a=document.getElementById("next-page");a&&a.click()},OpenPreviousPage:function(){var a=document.getElementById("previous-page");a&&a.click()},SelectNextItem:function(){var a=document.getElementById("next-item"); -if(a)a.click();else if(e())if(a=document.getElementsByTagName("article"),document.getElementById("current-item"))for(var b=0,c=a.length;bb-(a.offsetTop+a.offsetHeight)||b-a.offsetTop>document.documentElement.clientHeight)&&window.scrollTo(0,a.offsetTop-10)}function d(){return document.getElementById("listing")?!0:!1}return{OpenNextPage:function(){var a=document.getElementById("next-page");a&&a.click()},OpenPreviousPage:function(){var a=document.getElementById("previous-page");a&&a.click()},SelectNextItem:function(){var a=document.getElementById("next-item"); +if(a)a.click();else if(d())if(a=document.getElementsByTagName("article"),document.getElementById("current-item"))for(var b=0,c=a.length;b Date: Sun, 18 Jan 2015 01:53:54 +0100 Subject: [PATCH 3/7] use radio buttons to select the login database allows one click logins to not default databases using passwordmanagers like keefox. --- controllers/common.php | 13 +++++++++---- lib/helpers.php | 4 ++-- models/database.php | 2 +- templates/login.php | 14 +++----------- 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/controllers/common.php b/controllers/common.php index dcefa2a..e622a84 100644 --- a/controllers/common.php +++ b/controllers/common.php @@ -11,9 +11,14 @@ Router\before(function($action) { Session\open(BASE_URL_DIRECTORY, SESSION_SAVE_PATH, 0); - // Select the requested database. If it fails, logout to destroy session and + // Select the requested database either from post param database or from the + // session variable. If it fails, logout to destroy session and // 'remember me' cookie - if (! empty($_SESSION['database'])) { + if (! empty(Request\value('database')) && ! Model\Database\select(Request\value('database'))) { + Model\User\logout(); + Response\redirect('?action=login'); + } + elseif (! empty($_SESSION['database'])) { if (! Model\Database\select($_SESSION['database'])) { Model\User\logout(); Response\redirect('?action=login'); @@ -29,13 +34,13 @@ Router\before(function($action) { Response\redirect('?action=login'); } } - else if (Model\RememberMe\has_cookie()) { + elseif (Model\RememberMe\has_cookie()) { Model\RememberMe\refresh(); } // Load translations $language = Model\Config\get('language') ?: 'en_US'; - + if ($language !== 'en_US') { Translator\load($language); } diff --git a/lib/helpers.php b/lib/helpers.php index bbb1c64..604da2d 100644 --- a/lib/helpers.php +++ b/lib/helpers.php @@ -229,9 +229,9 @@ function form_radios($name, array $options, array $values = array()) return $html; } -function form_radio($name, $label, $value, $selected = false, $class = '') +function form_radio($name, $label, $value, $checked = false, $class = '') { - return ''; + return ''; } function form_checkbox($name, $label, $value, $checked = false, $class = '') diff --git a/models/database.php b/models/database.php index c345aeb..f681af3 100644 --- a/models/database.php +++ b/models/database.php @@ -41,7 +41,7 @@ function select($filename = '') // function gets called with a filename at least once the database // connection is established - if ($filename !== '') { + if (! empty($filename)) { if (ENABLE_MULTIPLE_DB && in_array($filename, get_all())) { $current_filename = $filename; diff --git a/templates/login.php b/templates/login.php index f129b0e..7f5312f 100644 --- a/templates/login.php +++ b/templates/login.php @@ -34,17 +34,9 @@ 1): ?>

    -
      - $dbname): ?> -
    • - - - - - -
    • - -
    + $dbname): ?> + +
    From 1c68dd47276a8a6cb0cadcf6ecae98155f5f83ce Mon Sep 17 00:00:00 2001 From: Mathias Kresin Date: Sun, 18 Jan 2015 14:33:19 +0100 Subject: [PATCH 4/7] remove html tags from translations --- locales/cs_CZ/translations.php | 8 ++++---- locales/de_DE/translations.php | 8 ++++---- locales/es_ES/translations.php | 8 ++++---- locales/fr_FR/translations.php | 8 ++++---- locales/it_IT/translations.php | 8 ++++---- locales/pt_BR/translations.php | 8 ++++---- locales/zh_CN/translations.php | 8 ++++---- templates/feed_items.php | 4 ++-- templates/feeds.php | 2 +- templates/layout.php | 2 +- templates/unread_items.php | 2 +- 11 files changed, 33 insertions(+), 33 deletions(-) diff --git a/locales/cs_CZ/translations.php b/locales/cs_CZ/translations.php index 94f4911..16c4704 100644 --- a/locales/cs_CZ/translations.php +++ b/locales/cs_CZ/translations.php @@ -23,8 +23,8 @@ return array( // 'Older items first' => '', // 'Most recent first' => '', // 'Default sorting order for items' => '', - // 'This subscription is empty, go back to unread items' => '', - // 'sort by date (%s)' => '', + // 'This subscription is empty, %sgo back to unread items%s' => '', + // 'sort by date %s(%s)%s' => '', // 'most recent first' => '', // 'older first' => '', // 'Show only this subscription' => '', @@ -143,7 +143,7 @@ return array( 'Passwords don\'t match' => 'Hesla se neshodují', 'Do you really want to remove these items from your history?' => 'Opravdu chcete odstranit tyto články z historie?', 'Do you really want to remove this subscription: "%s"?' => 'Opravdu chcete odstranit tento odběr: "%s"?', - 'Nothing to read, do you want to update your subscriptions?' => 'Nic ke čtení, chete aktualizovat vaše odběry?', + 'Nothing to read, do you want to %supdate your subscriptions%s?' => 'Nic ke čtení, chete %saktualizovat vaše odběry%s?', 'Show help' => 'Zobrazit nápovědu', 'Close help' => 'Zavřít nápovědu', // '%d second ago' => '', @@ -184,7 +184,7 @@ return array( // 'Activated' => '', // 'Remove this feed' => '', // 'Miniflux' => '', - // 'miniflux' => '', + // 'mini%sflux%s' => '', // 'All' => '', // 'Advanced' => '', // 'Documentation' => '', diff --git a/locales/de_DE/translations.php b/locales/de_DE/translations.php index a8a1098..18dba30 100644 --- a/locales/de_DE/translations.php +++ b/locales/de_DE/translations.php @@ -23,8 +23,8 @@ return array( 'Older items first' => 'Ältere Einträge zuerst', 'Most recent first' => 'Neueste Einträge zuerst', 'Default sorting order for items' => 'Standardsortierung der Einträge', - 'This subscription is empty, go back to unread items' => 'Dieses Abonnement ist leer, zurück zu den ungelesenen Artikeln gehen', - 'sort by date (%s)' => 'nach Datum sortieren (%s)', + 'This subscription is empty, %sgo back to unread items%s' => 'Dieses Abonnement ist leer, %szurück zu den ungelesenen Artikeln gehen%s', + 'sort by date %s(%s)%s' => 'nach Datum sortieren %s(%s)%s', 'most recent first' => 'neueste zuerst', 'older first' => 'ältere zuerst', 'Show only this subscription' => 'Nur dieses Abonnement anzeigen', @@ -143,7 +143,7 @@ return array( 'Passwords don\'t match' => 'Passwörter stimmen nicht überein', 'Do you really want to remove these items from your history?' => 'Möchtest du wirklich diese Einträge aus deinem Verlauf entfernen?', 'Do you really want to remove this subscription: "%s"?' => 'Möchtest du wirklich dieses Abonnement entfernen: "%s"?', - 'Nothing to read, do you want to update your subscriptions?' => 'Nichts zu lesen, möchtest du alle Abonnements aktualisieren?', + 'Nothing to read, do you want to %supdate your subscriptions%s?' => 'Nichts zu lesen, möchtest du %sdeine Abonnements aktualisieren%s?', 'Show help' => 'Hilfe zeigen', 'Close help' => 'Hilfe schließen', '%d second ago' => 'Vor %d Sekunde', @@ -184,7 +184,7 @@ return array( 'Activated' => 'Aktiviert', 'Remove this feed' => 'Dieses Abonnement entfernen', 'Miniflux' => 'Miniflux', - 'miniflux' => 'miniflux', + 'mini%sflux%s' => 'mini%sflux%s', 'All' => 'Alle', 'Advanced' => 'Erweitert', 'Documentation' => 'Dokumentation', diff --git a/locales/es_ES/translations.php b/locales/es_ES/translations.php index 7e865a2..8a56b53 100644 --- a/locales/es_ES/translations.php +++ b/locales/es_ES/translations.php @@ -23,8 +23,8 @@ return array( 'Older items first' => 'Ítems más antiguos primero', 'Most recent first' => 'Más recientes primero', 'Default sorting order for items' => 'Orden de clasificación predeterminado para los ítems', - 'This subscription is empty, go back to unread items' => 'Esta suscripción está vacía, volver a los ítems no leídos', - 'sort by date (%s)' => 'ordenar por fecha (%s)', + 'This subscription is empty, %sgo back to unread items%s' => 'Esta suscripción está vacía, %svolver a los ítems no leídos%s', + 'sort by date %s(%s)%s' => 'ordenar por fecha %s(%s)%s', 'most recent first' => 'más reciente primero', 'older first' => 'más antiguo primero', 'Show only this subscription' => 'Mostrar sólo esta suscripción', @@ -143,7 +143,7 @@ return array( 'Passwords don\'t match' => 'Las contraseñas no coinciden', 'Do you really want to remove these items from your history?' => '¿De verdad quiere borrar estos ítems del historial?', 'Do you really want to remove this subscription: "%s"?' => '¿De verdad quiere borrar esta suscripción: "%s"?', - 'Nothing to read, do you want to update your subscriptions?' => 'No hay nada que leer, ¿quiere actualizar las suscripciones?', + 'Nothing to read, do you want to %supdate your subscriptions%s?' => 'No hay nada que leer, ¿quiere %sactualizar las suscripciones%s?', 'Show help' => 'Mostrar la ayuda', 'Close help' => 'Cerrar la ayuda', // '%d second ago' => '', @@ -184,7 +184,7 @@ return array( // 'Activated' => '', // 'Remove this feed' => '', // 'Miniflux' => '', - // 'miniflux' => '', + // 'mini%sflux%s' => '', // 'All' => '', // 'Advanced' => '', // 'Documentation' => '', diff --git a/locales/fr_FR/translations.php b/locales/fr_FR/translations.php index 335b9cf..64414d3 100644 --- a/locales/fr_FR/translations.php +++ b/locales/fr_FR/translations.php @@ -23,8 +23,8 @@ return array( 'Older items first' => 'Plus anciens en premier', 'Most recent first' => 'Plus récents en premier', 'Default sorting order for items' => 'Ordre des éléments par défaut', - 'This subscription is empty, go back to unread items' => 'Cet abonnement est vide, retourner à la liste des éléments non lus', - 'sort by date (%s)' => 'trier par date (%s)', + 'This subscription is empty, %sgo back to unread items%s' => 'Cet abonnement est vide, %sretourner à la liste des éléments non lus%s', + 'sort by date %s(%s)%s' => 'trier par date %s(%s)%s', 'most recent first' => 'plus récents d\'abord', 'older first' => 'anciens d\'abord', 'Show only this subscription' => 'Montrer seulement cet abonnement', @@ -143,7 +143,7 @@ return array( 'Passwords don\'t match' => 'Les mots de passe ne sont pas identiques', 'Do you really want to remove these items from your history?' => 'Voulez-vous vraiment supprimer les éléments de votre historique ?', 'Do you really want to remove this subscription: "%s"?' => 'Voulez-vous vraiment supprimer cet abonnement : « %s » ?', - 'Nothing to read, do you want to update your subscriptions?' => 'Il n\'y a rien à lire, voulez-vous mettre à jour vos abonnements ?', + 'Nothing to read, do you want to %supdate your subscriptions%s?' => 'Il n\'y a rien à lire, voulez-vous %smettre à jour vos abonnements%s ?', 'Show help' => 'Afficher l\'aide', 'Close help' => 'Fermer l\'aide', '%d second ago' => 'Il y a %d seconde', @@ -184,7 +184,7 @@ return array( 'Activated' => 'Activé', 'Remove this feed' => 'Supprimer cet abonnement', 'Miniflux' => 'Miniflux', - 'miniflux' => 'miniflux', + 'mini%sflux%s' => 'mini%sflux%s', 'All' => 'Tout', 'Advanced' => 'Avancé', 'Documentation' => 'Documentation', diff --git a/locales/it_IT/translations.php b/locales/it_IT/translations.php index cc02c98..93baf71 100644 --- a/locales/it_IT/translations.php +++ b/locales/it_IT/translations.php @@ -23,8 +23,8 @@ return array( // 'Older items first' => '', // 'Most recent first' => '', // 'Default sorting order for items' => '', - // 'This subscription is empty, go back to unread items' => '', - // 'sort by date (%s)' => '', + // 'This subscription is empty, %sgo back to unread items%s' => '', + // 'sort by date %s(%s)%s' => '', // 'most recent first' => '', // 'older first' => '', // 'Show only this subscription' => '', @@ -143,7 +143,7 @@ return array( 'Passwords don\'t match' => 'Le password non coincidono', 'Do you really want to remove these items from your history?' => 'Vuoi veramente cancellare questi articoli dalla cronologia?', 'Do you really want to remove this subscription: "%s"?' => 'Vuoi veramente cancellare la sottoscrizione a: "%s" ?', - 'Nothing to read, do you want to update your subscriptions?' => 'Niente da leggere, vuoi aggiornare tutte le sottoscrizioni?', + 'Nothing to read, do you want to %supdate your subscriptions%s?' => 'Niente da leggere, vuoi %saggiornare tutte le sottoscrizioni%s?', 'Show help' => 'Mostra guida', 'Close help' => 'Chiudi guida', // '%d second ago' => '', @@ -184,7 +184,7 @@ return array( // 'Activated' => '', // 'Remove this feed' => '', // 'Miniflux' => '', - // 'miniflux' => '', + // 'mini%sflux%s' => '', // 'All' => '', // 'Advanced' => '', // 'Documentation' => '', diff --git a/locales/pt_BR/translations.php b/locales/pt_BR/translations.php index d72b79d..df17330 100644 --- a/locales/pt_BR/translations.php +++ b/locales/pt_BR/translations.php @@ -23,8 +23,8 @@ return array( 'Older items first' => 'Itens mais antigos primeiro', 'Most recent first' => 'Mais recentes primeiro', 'Default sorting order for items' => 'Ordenação padrão dos itens', - 'This subscription is empty, go back to unread items' => 'Esta assinatura está vazia, voltar para os tens não lidos', - 'sort by date (%s)' => 'ordenar por data (%s)', + 'This subscription is empty, %sgo back to unread items%s' => 'Esta assinatura está vazia, %svoltar para os tens não lidos%s', + 'sort by date %s(%s)%s' => 'ordenar por data %s(%s)%s', 'most recent first' => 'mais recentes primeiro', 'older first' => 'antigos primeiro', 'Show only this subscription' => 'Mostrar apenas esta assinatura', @@ -143,7 +143,7 @@ return array( 'Passwords don\'t match' => 'Senha não corresponde.', 'Do you really want to remove these items from your history?' => 'Você realmente deseja remover esses itens de sua histórico?', 'Do you really want to remove this subscription: "%s"?' => 'Você realmente deseja remover essa assinatura: "%s" ?', - 'Nothing to read, do you want to update your subscriptions?' => 'Nada para ler, você quer atualizar suas assinaturas?', + 'Nothing to read, do you want to %supdate your subscriptions%s?' => 'Nada para ler, você quer %satualizar suas assinaturas%s?', 'Show help' => 'Abrir ajuda', 'Close help' => 'Fechar ajuda', '%d second ago' => '%d segundo atrás', @@ -184,7 +184,7 @@ return array( 'Activated' => 'Ativado', 'Remove this feed' => 'Remover este feed', 'Miniflux' => 'Miniflux', - 'miniflux' => 'miniflux', + 'mini%sflux%s' => 'mini%sflux%s', 'All' => 'Todos', 'Advanced' => 'Avançado', 'Documentation' => 'Documentação', diff --git a/locales/zh_CN/translations.php b/locales/zh_CN/translations.php index 8a6b82e..69d15a1 100644 --- a/locales/zh_CN/translations.php +++ b/locales/zh_CN/translations.php @@ -23,8 +23,8 @@ return array( // 'Older items first' => '', // 'Most recent first' => '', // 'Default sorting order for items' => '', - // 'This subscription is empty, go back to unread items' => '', - // 'sort by date (%s)' => '', + // 'This subscription is empty, %sgo back to unread items%s' => '', + // 'sort by date %s(%s)%s' => '', // 'most recent first' => '', // 'older first' => '', // 'Show only this subscription' => '', @@ -143,7 +143,7 @@ return array( 'Passwords don\'t match' => '两次输入密码不一致', 'Do you really want to remove these items from your history?' => '你确认要移除这些历史记录吗?', 'Do you really want to remove this subscription: "%s"?' => '你确定要移除这个订阅源: "%s" ?', - 'Nothing to read, do you want to update your subscriptions?' => '空空如也,你想要更新订阅源嘛?', + 'Nothing to read, do you want to %supdate your subscriptions%s?' => '空空如也,你想要%s更新订阅源%s嘛?', 'Show help' => '显示帮助', 'Close help' => '关闭帮助', // '%d second ago' => '', @@ -184,7 +184,7 @@ return array( // 'Activated' => '', // 'Remove this feed' => '', // 'Miniflux' => '', - // 'miniflux' => '', + // 'mini%sflux%s' => '', // 'All' => '', // 'Advanced' => '', // 'Documentation' => '', diff --git a/templates/feed_items.php b/templates/feed_items.php index d34fd8a..23412c1 100644 --- a/templates/feed_items.php +++ b/templates/feed_items.php @@ -1,6 +1,6 @@

    - go back to unread items') ?> + ','') ?>

    @@ -11,7 +11,7 @@
  • - (%s)', $direction == 'desc' ? t('older first') : t('most recent first')) ?> + ', $direction == 'desc' ? t('older first') : t('most recent first'), '') ?>
  • diff --git a/templates/feeds.php b/templates/feeds.php index 29ebb41..0f1d693 100644 --- a/templates/feeds.php +++ b/templates/feeds.php @@ -20,7 +20,7 @@ 0): ?>

    ', '') ?>

    -

    update your subscriptions?') ?>

    +

    ','') ?>

    diff --git a/templates/layout.php b/templates/layout.php index ca1aabf..44422fe 100644 --- a/templates/layout.php +++ b/templates/layout.php @@ -20,7 +20,7 @@
- + @@ -186,19 +186,19 @@ Accueil Accueil - - - - - - - - + + + + + + + + > Articles - - - - + + + +
@@ -206,7 +206,7 @@
- @@ -216,7 +216,7 @@ relais et santé: des scientifiques répondent à l'ASEF

-->
- +
Imprimer @@ -224,13 +224,13 @@ relais et santé: des scientifiques répondent à l'ASEF

-->
-
+

Un bilan des plantes génétiquement modifiées aux USA

Résumé d’un rapport américain

- +
Nous publions ici, à titre d’information, un résumé du rapport du Service des études économiques (Economic Research Service) du ministère américain de l’agriculture (United States Department of Agriculture). Résumé rédigé par Louis-Marie Houdebine.

La culture des plantes génétiquement modifiées (PGM) a commencé aux USA en 1996. Et ce pays compte aujourd’hui, à lui seul, la moitié des PGM cultivées dans le monde. Un bilan économique de cette nouvelle technique de sélection génétique a été publié en février 2014. Il nous a semblé intéressant de porter à la connaissance ce document, afin d’aider nos lecteurs à se faire leur propre opinion sur un sujet controversé. En effet, si les OGM sont interdits à la culture en France (et dans plusieurs pays de l’Union Européenne), ils sont largement utilisés outre-Atlantique, et depuis près de deux décennies, ce qui permet une analyse a posteriori.

@@ -273,59 +273,59 @@ relais et santé: des scientifiques répondent à l'ASEF

-->

Une troisième génération de PGM est déjà une réalité et elle devrait prendre progressivement de l’importance. Ces PGM ne sont pas destinées à l’alimentation. Elles sont et seront productrices de biocarburants, de molécules d’intérêt pharmaceutique, d’huiles industrielles, de fibres, de plastiques etc.

- - + +
- +
Mis en ligne le 8 avril 2014
1116 visites
- - - - + + + + - - - + + + -
+
@@ -334,117 +334,117 @@ relais et santé: des scientifiques répondent à l'ASEF

--> - + - +

@@ -473,7 +473,7 @@ relais et santé: des scientifiques répondent à l'ASEF

--> _gaq.push(['_setAccount', 'UA-1826589-10']); _gaq.push(['_trackPageview']); - (function() { + (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); diff --git a/vendor/fguillot/picofeed/tests/fixtures/la-grange.xml b/vendor/fguillot/picofeed/tests/fixtures/la-grange.xml deleted file mode 100644 index 8edfd23..0000000 --- a/vendor/fguillot/picofeed/tests/fixtures/la-grange.xml +++ /dev/null @@ -1,1139 +0,0 @@ - -Carnets de La Grange -Chroniques d'un poète urbain -tag:la-grange.net,2000-04-12:karl - 2014-10-04T06:55:00Z - - - -http://www.la-grange.net/favicon.png - - Karl Dubost - http://www.la-grange.net/karl/ - - - - tag:la-grange.net,2014-08-06:2014/08/06/eau - - Un barrage contre le porche - 2014-08-06T23:59:00+02:00 - 2014-10-04T06:55:00Z - -
-
- Flaque de pluie -
La Saussaye, France, 6 août 2014
-
- - -
-
-

Spring had truly arrived. Countless streams suddenly materialized all over the roads, fields, grasslands, and thickets; flowing as if the melting snow's waters were spilling over.

-
-

Takiji Kobayashi, Yasuko.

-
- -

La pluie abonde. La forêt humide resplendit. L'eau monte, l'eau déborde. Il reste pourtant notre humanité. Toute entière, resplendissante.

- -
-
-
- -
- - - tag:la-grange.net,2014-08-05:2014/08/05/foret - - Le sens de la forêt - 2014-08-05T23:59:00+02:00 - 2014-10-04T06:42:00Z - -
-
- Feuillage d'arbre et cheveux -
La Saussaye, France, 5 août 2014
-
- - -
-
-

Well, let's do it again, one more time!

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

L'arbre appelle le refuge. La forêt ouvre la pensée.

- -
-
-
- - -
- - tag:la-grange.net,2014-08-04:2014/08/04/grenier - - Le lieu du temps transposé - 2014-08-04T23:59:00+02:00 - 2014-10-04T05:56:00Z - -
-
- Pile de magazines de cinéma -
La Saussaye, France, 4 août 2014
-
- - -
-
-

Next they showed one foreign and one japanese movie, but the celluloid was so badly scratched that everything seemed streaked with rain. What was worse, the film seemed to have broken in places and been spliced together, imparting jerky movements to the actors. Yet no one cared about that. Everyone was completely engrossed in the film.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

Le grenier est le lieu du temps transposé, une longue respiration. Ce n'est pas toujours là que l'on y trouve le souvenir, tant les choses peuvent être lointaines et étranges. Mais c'est certainement l'émerveillement du trésor que l'on découvre sans l'avoir même cherché. Aujourd'hui sur une étagère, entassés, quelques magazines de cinéma révèlent une actualité d'un autre moment et donnent l'envie de l'exploration. Un article donne les clés de l'érotisme au cinéma japonais à travers un film de Tetsuji Takechi.

- -
- Article de magazine sur l'érotique japonaise -
La Saussaye, France, 4 août 2014
-
- -
-
-
- -
- - tag:la-grange.net,2014-08-03:2014/08/03/rythme - - Le rythme du monde - 2014-08-03T23:59:00+02:00 - 2014-09-29T13:09:00Z - -
-
- Noisettes dans un bol -
La Saussaye, France, 3 août 2014
-
- - -
-
-

Far off to the right the light of the Shukutsu lighthouse, flashing each time it revolved, penetrated the gray expanse of sea-like fog. Its long and distant silvery beam swept mystically for miles around as it pivoted.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

Sur la table, un bol de noisettes encore vertes, le parfum de la chlorophylle, l'involucre moelleux sous les ongles et le craquement de l'écale donnent l'essence du plaisir.

- -
- Brioches chaudes sorties du four -
Saint-Germain de Pasquier, France, 3 août 2014
-
- -

Dans le four à pain, des brioches encore chaudes, le beurre sous les narines, la mie du moment sous les dents et le chuchottement du jour donnent l'envie de la suspension.

- -
- Tas de bois -
La Saussaye, France, 3 août 2014
-
- -

Dans la forêt, des branches de bois mort, grisé par le champignon et l'humus, les insectes sous l'écorce et le poids sur les épaules vous tirent vers la cime des arbres.

- -

Le rythme du monde s'étale lentement entre les larges secondes d'une respiration.

-
-
-
- -
- - tag:la-grange.net,2014-08-02:2014/08/02/petales - - Une fois de plus, un pétale - 2014-08-02T23:59:00+02:00 - 2014-09-29T12:11:00Z - -
-
- Boutons de rose et pétales sur le sol -
La Saussaye, France, 2 août 2014
-
- - -
-
-

Well. Let's do it again. One more time.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

Pain oublié dans le grille-pain, un peu de fumée. Je suis seul dans la cuisine. Décalage horaire. Il est tôt. Tout le monde dort. Le parfum de la forêt en bouffée quand on ouvre la porte d'entrée. Les pétales de rose vaincues par la rosée se sont posés au sol. Le thé dans un bol avec un motif floral, je trempe mes lèvres doucement, patiemment. Je goûte à l'amertume avec plaisir.

-

Il faudra plus d'un pétale pour disparaître.

- -
-
-
- -
- - tag:la-grange.net,2014-08-01:2014/08/01/riz - - Quand le voyage commence-t-il ? - 2014-08-01T23:59:00+09:00 - 2014-09-28T12:17:00Z - -
-
- Vues depuis le train de champs de riz -
Narita, Japon, 1er août 2014
-
- - -
-
-

Treasure every grain of rice. It's a gift of blood and sweat.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

Je suis dans le Narita Express à destination de l'aéroport. Devant mes yeux défilent les collines, les maisons blotties près de la forêt et surtout les longues rizières. Tout est si vert, si troublant, si délicat. Je glisse à la surface des brins, je suis le vent. Ce voyage a-t-il débuté ? Était-ce lorsque j'ai réservé le billet d'avion ou bien avant lorsque j'ai conçu l'idée. Était-ce ce moment où j'ai fermé la porte, marché dans la rue ? Ou cela commence-t-il demain lorsque je serais à l'aéroport en France ?

- -

Le premier grain de riz au bout de mes baguettes qui me donne le goût est indéterminé et pourtant il est bien là.

- -

1er août 2014 : Mes écritures à rebours me donnent l'espace de la respiration, donnent de l'épaisseur à l'opacité et donc une plus grande liberté.

-
-
-
- -
- - - tag:la-grange.net,2014-07-31:2014/07/31/adresse - - Le lieu physique et son intimité - 2014-07-31T23:59:00+09:00 - 2014-09-27T07:16:00Z - -
-
- Boîtes aux lettres dans une entrée d'immeuble -
Atami, Japon, 12 juillet 2014
-
- - -
-
-

Not even a woman could captivate the fishermen and sailors as much as the supply ship did. This ship did not stink of fish, and it bore the fragrance of Hakodate. It carried a fragrance of that solid earth that they had not trodden for months, for hundreds of days. Moreover, the supply ship delivered long-delayed letters, shirts, underwear, magazines, and various other necessities.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

Stéphane et Emmanuel ont démarré une conversation qui me tient à cœur. J'ai pris quelques notes rapides dans mon carnet.

- -
-
-

Emmanuel a lancé l’idée qu’on s’écrive les uns les autres des cartes postales, après qu’Olivier a noté que c’était fini, tout ça, à l’époque des emails. Alors joignons l’utile à l’agréable et dérouillons, avant les cartes, nos jointures vermoulues sur un cahier acheté à l’occasion des vacances, comme souvent.

-
-

Stéphane Deschamp, la belle langue en vacances.

-
- -

Donner son adresse postale à un tiers m'est devenu de plus en plus difficile. Je m'exécute quand les circonstances l'exigent. Les administrations, les services de livraison, les banques ont une dépendance de leurs systèmes sur l'identification physique du lieu de vie qu'il est très difficile d'y échapper. Je lutte déjà très souvent contre le requis du téléphone. Mais le propos n'est pas là. Non, il s'agit de délivrer la clé de l'accès à un lieu qui est sacré : le lieu où j'habite.

- -

Cela tient peut-être à la clairière dans la forêt, au lieu sanctuaire où l'on peut écrire les notes de sa cabane. Peut-être que c'est juste absurde et que je devrais me soucier beaucoup moins de cette inquiétude. Ce partage inconfortable s'est accentué avec tous les services de gestion du carnet d'adresses en ligne. Les personnes rentrent l'adresse dans le carnet d'adresses de leur ordinateur, la synchronise avec leurs téléphones en ligne et parfois avec un service de synchronisation distant. Certaines applications demandent l'accès au carnet d'adresse pour rechercher les adresses email et faire des croisements avec leur base de données et au même moment en profitent pour accéder à de nombreuses autres données, dont l'adresse.

- -

Lorsque je travaille avec un bureau physique quotidien, je donne souvent mon adresse de bureau. C'est une façon de permettre l'anonymat physique de l'intime sans bloquer la communication. Mais lorsque l'on travaille de chez soi, cet anonymat devient de plus en plus délicat. Je pense très souvent à ouvrir une case postale dans une poste afin de recréer ce tampon.

- -

Quand finalement, je me décide à donner confiance à mon interlocuteur, je précise de ne pas partager l'adresse avec qui que ce soit individus ou entités, et bien sûr, de ne pas partager avec les services en ligne. Ce qui rend la gestion de mon adresse quelque peu contraignante.

- -

Tout ceci n'est pas tout à fait rationnel, puisque j'ai plaisir à écrire ou dessiner sur le papier et à envoyer quelques mots dans la boite aux lettres postales d'une personne lorsque je voyage. Je trouve aussi que le rythme d'envoi et de réponse de la correspondance manuscrite est finalement beaucoup plus humain que celle du courrier. Non pas que l'électronique change quoi que ce soit, si ce n'est que les personnes ont construit une attente de réponse immédiate à un message, alors que préfère prendre du temps pour répondre.

- -

Donc tout comme Stéphane, oui j'aime cela écrire, et délier la langue dans le creux du papier, mais je note aussi que je suis un ours pour ce qui est de l'accès à mon adresse.

- -
-
-
- -
- - tag:la-grange.net,2014-07-30:2014/07/30/reparer - - Le choix de la durée - 2014-07-30T23:59:00+09:00 - 2014-09-26T13:37:00Z - -
-
- Noren avec des morceaux de scotch -
Atami, Japon, 12 juillet 2014
-
- - -
-
-

Each morning before starting to work, everybody gathered in one corner of the factory. Their faces all looked like those of mud dolls.

-

"I'm going to slow down," said the miner. "I just can't keep this up."

-

Worker's faces came to life but no one spoke. Then someone said, "You're going to get yourself branded, you know…"

-

I'm not trying to get out of the work. I just can't do it.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

En informatique, nous disons souvent « Si ce n'est pas cassé, on n'y touche pas. » Il y a plus de risques à modifier un système qui fonctionne avec satisfaction plutôt que de tenter de l'améliorer. Optimiser pour le seul but de la perfection n'est pas une action suffisamment intéressante. C'est le côté Confucius de l'informatique.

- -

Il y a ce restaurant de yakitori qui a réparé son enseigne avec des morceaux de scotchs transparents plutôt que de jeter l'ancien et de le remplacer par un nouveau noren. Cette fois-ci, il s'agit de patcher un système afin qu'il puisse durer un peu plus longtemps. Encore une fois, ce n'est pas une recherche de la perfection, mais bien plus de la longévité.

- -

Nous oublions bien souvent que nos systèmes peuvent durer très longtemps sans les mettre à jour et en les réparant juste de façon nécessaire. Est-ce un problème ? Moins souvent que l'on veuille bien le penser.

- - -
-
-
- -
- - tag:la-grange.net,2014-07-29:2014/07/29/protection - - La lutte du jardin - 2014-07-29T23:59:00+09:00 - 2014-09-26T12:39:00Z - -
-
- Une rue, deux femmes, et une haie coupée -
Tsujido, Japon, 27 juillet 2014
-
- - -
-
-

"The damned lice are going to devour us alive."

-

"Yeah, that'll be a wonderful way to go."

-

They could not help laughing.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

Une femme agée coupe la haie. Aligner le feuillage avec la route, ne pas envahir, trop, l'espace commun. Elle s'est couverte, un chapeau, des gants, un masque facial, une serviette éponge autour du cou, un pantalon long et un tablier. Son armure souple la protège des moustiques voraces. Elle a tout de même une dernière botte secrète à son attirail. À sa ceinture, elle a accroché la boite métallique pour permettre les spirales vertes contre les insectes trop amoureux. Ce n'est pas l'encens du temple mais la fumée de l'anti-moustique que je sens.

- -

Et dans cette rue, la rêverie des boîtes de spirales anti-moustiques s'éveille. Les moustiques sont loin.

- -
- Boîte de spirales antimoustiques -
蚊取り線香 金鳥
-
- -
-
-
- - -
- - tag:la-grange.net,2014-07-28:2014/07/28/cendres - - La chaleur des cendres - 2014-07-28T23:59:00+07:00 - 2014-09-26T12:16:00Z - -
-
- Cinq tombes dans un pré -
Tsujido, Japon, 27 juillet 2014
-
- - -
-
-

The great storm had snatched away from the men any ability to steer the boat, making them more helpless than a chid gripped by the scruff of its neck. They had gone out the farthest, and now the wind was blowing them even farther. All were prepared for the worst. Fishermen are trained to bid life good-bye at a moment's notice.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

Le feu permet la cendre. La cendre permet l'exigüité. L'exigüité permet la proximité. La proximité permet le souvenir. Le souvenir permet l'humanité.

- -
-
-
- -
- - - tag:la-grange.net,2014-07-27:2014/07/27/quartier - - La vie de quartier - 2014-07-27T23:59:00+07:00 - 2014-09-22T13:11:00Z - -
-
- Intérieur d'un atelier de tatami -
Tsujido, Japon, 27 juillet 2014
-
- - -
-
-

Recalling the previous day's horrendous work, everyone concluded that the man had been swept away by the waves. It made them feel awful. They were forced to resume work before dawn and had no chance to talk about it.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

Par la fenêtre, le silence de l'atelier s'expose. L'artisan a délaissé ses tatamis pour la journée. Peut-être est-il avec les autres pour porter le « mikoshi » de son bloc. Ensemble. Dans le son tumultueux des tambours et du pipeau. Ensemble. Sous la chaleur et la poussière.

- -
- Mains sur une poutre du mikoshi -
Tsujido, Japon, 27 juillet 2014
-
- -
-
-
- - -
- - tag:la-grange.net,2014-07-26:2014/07/26/matsuri - - Matsuri de quartier - 2014-07-26T23:59:00+07:00 - 2014-09-22T12:57:00Z - -
-
- Groupes de personnes en face du temple -
Tsujido, Japon, 26 juillet 2014
-
- - -
-
-

Sitting cross-legged and placing plates of salted fish across their legs, they blew against the steam, filled their cheeks with hot bits of fish, and rolled them around inside their mouths. The food was the first hot object they had been near all day, and their noses kept running, threatening to drip into the dishes.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

C'est le temps de la fête de quartier. Les vendeurs s'alignent dans la rue. Les gens boivent, discutent, échangent, rient et mangent. Les jeunes femmes ont mis leur plus beau yukata. Nous traversons une barquette de pommes de terre au beurre dans la main.

- -
- Groupes de personnes dans la rue -
Tsujido, Japon, 26 juillet 2014
-
- -
-
-
- -
- - tag:la-grange.net,2014-07-25:2014/07/25/sacs - - Éco, éco - 2014-07-25T23:59:00+07:00 - 2014-09-22T12:45:00Z - -
-
- Deux poissons sur du papier -
Tsujido, Japon, 24 juillet 2014
-
- - -
-
-

Everyone was silent. All the same, they felt relieved.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

Je refuse le sac en plastique à la caisse. La femme avec un large sourire me répond : « éco ! éco ! » C'est la première fois que la compréhension de mon geste est verbalisé. Nous avons tous les deux le sourire. Elle à sa caisse, et moi déjà sur le chemin.

- -
-
-
- - -
- - tag:la-grange.net,2014-07-23:2014/07/23/discussions - - Discussions ouvertes - 2014-07-23T23:59:00+07:00 - 2014-09-19T14:16:00Z - -
-
- personnages en tissu -
Tsurunoyu, Japon, 11 janvier 2008
-
- - -
-
-

It was highly convenient for the employers to assemble such a crew of unorganized migrant workers.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

Dans un groupe social, si vous permettez une discussion sur un sujet conflictuel, vous devez être prêt à répondre à cette discussion de manière ouverte et franc-jeu. Si le but de la discussion est de donner l'illusion d'une concertation alors que la décision finale est déjà prise, vous non seulement manipulez cette communauté, mais vous la rendez aussi suspicieuse, divisée. Vous perdez la confiance et l'énergie du groupe à vouloir travailler ensemble. Ce n'est pas une bonne stratégie.

- -
-
-
- -
- - tag:la-grange.net,2014-07-22:2014/07/22/intime - - Vie privée et intimité - 2014-07-22T23:59:00+07:00 - 2014-09-19T11:59:00Z - -
-
- stalagtites sur mur de bois -
Tsurunoyu, Japon, 11 janvier 2008
-
- - -
-
-

They could not go home again. To survive the winter in snowy Hokkaido where they had no relatives, they had to "sell" their bodies as cheaply as dirt. Though they had done it over and over, they would calmly (if such a word is appropriate) do the same again the following year.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

privacy, intimacy sur Ngram donne un résultat différencié avec deux périodes. Je n'ai pas d'interprétation magique. Juste que le mot « privacy » semble émerger dans les années 1910 et intimacy reprend du poil de la bête dans les années 1960.

- -

Qu'est-ce qui fait le succès d'un mot ?

- -
- graphe -
Ngram des mots privacy et intimacy en langue anglaise
-
- -
-
-
- -
- - tag:la-grange.net,2014-07-20:2014/07/20/regex - - Regex 101 - 2014-07-20T23:59:00+07:00 - 2014-09-19T11:59:00Z - -
-
- Tuyaux sur fond de mur en béton -
Atami, Japon, 12 juillet 2014
-
- - -
-
-

A woman took caramels out of a box and handed two each to the nearby children, saying, "You be good to my Kenkichi, and work together like friends." The woman's hair and clothes were covered with cement dust. Her hands were ungainly, large and rough like roots of a tree.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

Un de mes outils favoris lorsque j'ai des expressions régulières complexes à explorer est Regex 101. Il permet non seulement de comprendre les choix réalisés au fur et à mesure en expliquant les commandes que l'on choisit dans la boîte en haut à droite. Mais il montre également les succès dans la boite à droite juste en dessous. Il y a de nombreuses petites subtilités et aides dans l'interface.

- -
- copie d'écran -
Une expression régulière sur une chaîne de caractères
-
- -

Un atout supplémentaire et pratique, il possède un générateur automatique de code en JavaScript, PHP et Python.

- -
- copie d'écran -
Génération automatique de code
-
- - -
-
-
- -
- - - tag:la-grange.net,2014-07-19:2014/07/19/fantome - - Le voyage est un fantôme - 2014-07-19T23:59:00+07:00 - 2014-09-16T23:54:00Z - -
-
- Personnes en double dans une rue -
Shibuya, Japon, 19 juillet 2014
-
- - -
-
-

Two foreign sailors with pipes in mouth paced the deck back and forth like automatons.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

De passage. Un immeuble proche de sa destruction devient le canevas pour l'expression. Une transition, un état éphémère, nous voyageons avec notre passé et notre futur à quelques pas de nous-même. Je passe par un café. Six ans que je ne suis pas venu. Et pourtant. « Oh ! Cela fait longtemps ! » m'accueille l'employé. Des capsules de notre existence, images fixes, dans un continuum. Je ferme les yeux. J'ouvre les yeux. Déjà une fraction d'années de lumière. L'esthétique de l'automate. Déjà une fraction d'années de lumière. Le voyage est un fantôme.

- - -
-
-
- -
- tag:la-grange.net,2014-07-17:2014/07/17/expiration - - L'information se cache pour mourir - 2014-07-17T23:59:00+07:00 - 2014-09-15T12:40:00Z - -
-
- Daruman sur étagères vides -
Atami, Japon, 12 juillet 2014
-
- - -
-
-

Blown by the wind, smoke drifted over waves wafting a stifling smell of coal. From time to time a harsh rattle of winches traveling along the waves reverberated against the flesh.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

Un article totalement bénin dans la rubrique sport d'un journal en ligne. Et pourtant, l'article a disparu. La rouille aura fait son effet. Il y a cependant trois éléments originaux :

- -
    -
  • L'URL est toujours la même
  • -
  • Le contenu de l'article a été remplacé par la mention The requested article has expired, and is no longer available. Any related articles, and user comments are shown below.
  • -
  • Les commentaires sont toujours présents. Ils sont devenus en fait le commentaire principal. Un peu si comme une œuvre avait été détruite et que nous n'avions plus que les commentaires périphériques pour la reconstruire.
  • -
- -

En fait tout comme un roman historique qui s'appuie sur l'information contextuelle et non directe, nous pourrions nous lancer dans le projet de réécrire ces articles disparus, expirés en utilisant uniquement comme source l'information des commentaires. Cela nous offrirait un champ du possible immensément riche et créatif.

- -
- Copie d'écran d'une page de journal -
JapanToday, 8 juin 2012
-
- - -
-
-
-
- - tag:la-grange.net,2014-07-16:2014/07/16/abandon - - Le premier pas dans la poussière - 2014-07-16T23:59:00+07:00 - 2014-09-15T12:25:00Z - -
-
- Maison abandonnée couverte de lierre -
Atami, Japon, 12 juillet 2014
-
- - -
-
-

Buddy, we're off to hell.

-
-

Takiji Kobayashi, The Crab Cannery Ship.

-
- -

Les lieux abandonnés sont ces endroits qui offrent la possibilité du territoire vierge, le premier pas dans la poussière, la trace dans la neige. On imagine le craquement de la branche morte dans la forêt étouffée. Nous désirons l'ombre, le silence et la suspension du temps, l'océan infini, la tempête de sable, le blizzard.

- -
-
-
- - -
- - tag:la-grange.net,2014-07-15:2014/07/15/cirque - - Le souvenir du cirque - 2014-07-15T23:59:00+07:00 - 2014-09-11T12:25:00Z - -
-
- Deux peluches d'ourson au bord d'une fenêtre -
Atami, Japon, 12 juillet 2014
-
- - -
-
-

Le coeur monte et s'ébat dans l'air mol et fleuri.
-- Mon coeur, qu'attendez-vous de la chaude journée,
-Est-ce le clair réveil de l'enfance étonnée
-Qui regarde, s'élance, ouvre les mains et rit ? -

-
-

Anna de Noailles, L'inquiet désir.

-
- -

Je lui disais « raconte moi l'histoire du cirque Narcisse. » Inlassablement avant que les paupières lourdes n'emportent la fin du récit, ma mère me racontait l'histoire que son père lui racontait dans son enfance. C'est ainsi que la légende du cirque vibre au son de la grande parade. Les rêves d'enfance n'ont pas d'âge. Ils habitent nos corps un à un, génération après génération. Ils vivent sur nos mots et nous les transmettons à la suivante.

- -

Alors ce soir encore, je rêve du cirque Narcisse.

- -
-
-
- - -
- - - tag:la-grange.net,2014-07-14:2014/07/14/amis - - Amis - 2014-07-14T23:59:00+07:00 - 2014-09-11T12:13:00Z - -
-
- Deux personnes marchant sur le trottoir -
Atami, Japon, 12 juillet 2014
-
- - -
-
-

Une averse a lavé le ciel. Il se fait tard.
-Le creux de la vallée est couvert de brouillard ;
-Mais sur les coteaux clairs luit au loin la feuillée,
-Et le firmament mêle à la forêt mouillée
-Des palpitations de clarté pâle. Amis,
-L'heure est propice : allons, par les bois endormis,
-Dans les champs, au-dessus de la prairie humide,
-Voir Vénus qui se lève à l'horizon limpide !

-
-

Émile Blémont, Vénus au ciel.

-
- -

Les décisions que l'on prend par amitié, les chemins que l'on explore ensemble sans toujours se croiser si ce n'est qu'au long des années trop distantes.

-
-
-
- - -
- - tag:la-grange.net,2014-07-13:2014/07/13/vestige - - Twitter et l'empire des bots - 2014-07-13T23:59:00+07:00 - 2014-09-08T10:05:00Z - -
-
- Escalier sans destination -
Atami, Japon, 12 juillet 2014
-
- - -
-
-

On n'estime plus maintenant
-Un homme, eût-il le sens d'Homère
-S'il n'est riche et grands biens tenant
-Quoi qu'il soit trompeur et faussaire.

-
-

Eustorg de Beaulieu, Ballade d'aucunes mauvaises coutumes qui règnent maintenant.

-
- -

Dans nos espaces, nos mots, nos pensées, nous rencontrons des vestiges du sens. Ils ont eu, à un moment donné, toute l'ampleur du signifiant et du signifié. Et puis un jour, ils ont perdu leur raison d'être.

- -

Quel est le sens de nos communications anonymes ? Hier et aujourd'hui, je voulais découvrir pour moi si les agents utilisateurs de l'application twitter et de Safari lui-même sur iOS étaient différents ou similaires. Je voulais comprendre comment le nom choix de son navigateur ou de sa bibliothèques de rendu Web gonflait les statistiques d'un navigateur plutôt qu'un autre.

- -

J'ai donc posté un URL qui n'a pas de représentation sur twitter afin de tester et j'ai suivi le journal des connexions du serveur afin de définir quels étaient les différentes modalités.

- -
http://www.la-grange.net/tmp/test
- -

Un premier test avec mon navigateur, puis avec l'application twitter sur iOS et puis finalement avec Safari sur iOS.

- - - - - - - - - - - -
Liste des accès pour un lien en fonction de la date
heurerefererUA
21:25:06Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0
21:30:00http://t.co/CpmEEUTIwnMozilla/5.0 (iPod; CPU iPhone OS 6_1_6 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B500 Twitter for iPhone
21:31:06Mozilla/5.0 (iPod; CPU iPhone OS 6_1_6 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B500 Safari/8536.25
- -

Comme prévu les deux clients diffèrent. Le début de la chaîne est la même et puis la fin devient :

- -
            Mobile/10B500 Twitter for iPhone
-Version/6.0 Mobile/10B500 Safari/8536.25
-
- -

Dans les statistiques de trafic, on sépare rarement pour les appareils iOS ce qui vient du navigateur directement et ce qui vient de l'utilisation par l'application native des WebViews.

- -

Les non conversations avec les robots

- -

Mais ce qui m'a surpris n'est finalement pas ce que je voulais tester mais le résultat du trafic que j'ai pu observer suite à la publication du lien. Aussitôt le lien publié sur twitter, ce sont les bots qui ont avalé le trafic. Immédiatement, certains avec un HEAD pour tester la ressource, d'autres directement avec un GET. Autres constats de ce trafic organique sur 113 requêtes :

- -
    -
  • 35 Safari, 23 Firefox, 9 chrome, 4 IE
  • -
  • 47 Macintosh, 7 iPhone, 3 iPad, 2 iPod, 7 Android, 10 Windows, 2 Windows Phone, 3 Linux
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Liste des accès pour un lien en fonction de la date
DateMéthodeAgent utilisateur
12T21:25:06GETMozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0
12T21:29:01HEADMetaURI API/2.0 +metauri.com
12T21:29:01HEADpython-requests/1.2.3 CPython/2.7.2+ Linux/3.0.0-16-virtual
12T21:29:01GETMozilla/5.0 ()
12T21:29:02GETLivelapbot/0.1
12T21:29:02GETMozilla/5.0 (compatible; TweetmemeBot/3.0; +http://tweetmeme.com/)
12T21:29:03HEADGoogle-HTTP-Java-Client/1.17.0-rc (gzip)
12T21:29:03HEADGoogle-HTTP-Java-Client/1.17.0-rc (gzip)
12T21:29:03GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
12T21:29:10GETMozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)
12T21:29:10GETMozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
12T21:29:18GETJakarta Commons-HttpClient/3.1
12T21:29:45HEADJakarta Commons-HttpClient/3.0.1
12T21:29:56HEADMozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
12T21:30:00GETMozilla/5.0 (iPod; CPU iPhone OS 6_1_6 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B500 Twitter for iPhone
12T21:30:14GETMozilla/5.0 (compatible; PaperLiBot/2.1; http://support.paper.li/entries/20023257-what-is-paper-li)
12T21:30:22GETMozilla/5.0 (compatible; PaperLiBot/2.1; http://support.paper.li/entries/20023257-what-is-paper-li)
12T21:31:06GETMozilla/5.0 (iPod; CPU iPhone OS 6_1_6 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B500 Safari/8536.25
12T21:35:05GETMozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0
12T21:35:29GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
12T21:35:58GET-
12T21:36:30GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
12T21:37:14GETMozilla/5.0 (Linux; Android 4.4.4; Nexus 5 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36
12T21:39:45GETMozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2
12T21:42:14GETMozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 4.0.20506)
12T21:43:01GETMozilla/5.0 (compatible; EveryoneSocialBot/1.0; support@everyonesocial.com http://everyonesocial.com/)
12T21:43:20GETMozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0
12T21:43:27GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
12T21:43:55HEADMozilla/5.0 (compatible; Jetslide; +http://jetsli.de/crawler)
12T21:44:23GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
12T21:46:39GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.77.4 (KHTML, like Gecko) Version/7.0.5 Safari/537.77.4
12T21:46:49GETMozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
12T21:51:06GETPython-urllib/2.7
12T21:51:58GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
12T21:56:06GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.90 Safari/537.1
12T21:59:04GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
12T22:00:35GETTwurly v1.0 (http://twurly.org)
12T22:03:56GETMozilla/5.0 (Linux; Android 4.4.4; Nexus 5 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36
12T22:12:56GETMozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 Twitter for iPhone
12T22:13:51GETMozilla/5.0 (Linux; Android 4.0.3; GT-P5110 Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36
12T22:13:58GETMozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 Twitter for iPhone
12T22:16:54GETjack
12T22:26:18GETMozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204firefox/2.0.0.1
12T22:36:47GETMozilla/5.0 (compatible; TweetedTimes Bot/1.0; +http://tweetedtimes.com)
12T22:42:44GETMozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920) like Gecko
12T22:52:33GETnewsme/1.0; feedback@news.me
12T23:16:11GETMozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
12T23:24:22GETMozilla/5.0 (compatible; TweetedTimes Bot/1.0; +http://tweetedtimes.com)
12T23:24:54GETGooglebot/2.1 (+http://www.google.com/bot.html)
12T23:28:29GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T00:01:06GETMozilla/5.0 (compatible; TweetedTimes Bot/1.0; +http://tweetedtimes.com)
13T00:14:51GETMozilla/5.0 (compatible; TweetedTimes Bot/1.0; +http://tweetedtimes.com)
13T00:23:36GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T00:59:08GETMozilla/5.0 (iPhone; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D167 Twitter for iPhone
13T01:05:20GETMozilla/5.0 (iPhone; CPU iPhone OS 7_1_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D201 Twitter for iPhone
13T01:12:28GETMozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 Twitter for iPhone
13T01:22:25HEADJava/1.7.0_51
13T01:36:20GETMozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920) like Gecko
13T01:37:17GETMozilla/5.0 (Android; Mobile; rv:30.0) Gecko/30.0 Firefox/30.0
13T01:47:20GETMozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257
13T01:53:46HEAD-
13T02:26:16GETMozilla/5.0 (Windows NT 6.1; Win64; x64; rv:30.0) Gecko/20100101 Firefox/30.0 Cyberfox/30.0
13T02:33:35GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T03:02:33GETMozilla/5.0 (X11; Linux i686; rv:33.0) Gecko/20100101 Firefox/33.0
13T03:04:06GETMozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:30.0) Gecko/20100101 Firefox/30.0
13T03:04:40HEAD-
13T03:16:00GETMozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 Twitter for iPhone
13T03:21:56GETMozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0
13T03:39:51GETMozilla/5.0 (Windows NT 6.3; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
13T03:49:57GETMozilla/5.0 (Mobile; rv:33.0) Gecko/33.0 Firefox/33.0
13T03:54:46GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T04:00:27GETMozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0
13T04:03:55GETMozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 Twitter for iPhone
13T04:08:50GETMozilla/5.0 (compatible; TweetedTimes Bot/1.0; +http://tweetedtimes.com)
13T04:10:56GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T04:33:55GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T04:43:24GETMozilla/5.0 (Android; Mobile; rv:30.0) Gecko/30.0 Firefox/30.0
13T04:46:20GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T04:46:39GETMozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257
13T04:56:10GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
13T05:21:18GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T05:33:03GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T05:34:47GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T05:41:46GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T05:51:22GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T05:59:15GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T06:03:10GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T06:11:47GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T06:21:14GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T06:33:04GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T06:40:53GETMozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 Twitter for iPhone
13T06:41:42GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T06:51:18GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T07:02:51GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T07:08:46GETMozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:33.0) Gecko/20100101 Firefox/33.0
13T07:11:49GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T07:21:21GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T07:31:49GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T07:41:28GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T07:50:22GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T08:02:41GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T08:15:09HEADlibwww-perl/6.05
13T08:19:42GETMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
13T08:44:23GETpython-requests/2.1.0 CPython/2.7.6 Linux/3.13.0-24-generic
13T08:55:11GETMozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0
13T09:07:27GETMozilla/5.0 (Linux; Android 4.4.4; Nexus 5 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36
13T09:27:30GETMozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0
13T12:24:58GETMozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
13T12:45:43GETMozilla/5.0 (Android; Mobile; rv:30.0) Gecko/30.0 Firefox/30.0
13T13:10:12HEAD-
13T15:40:55GETMozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:30.0) Gecko/20100101 Firefox/30.0
-
-
-
- -
- - tag:la-grange.net,2014-07-12:2014/07/12/atami - - Ce que l'on y cherche - 2014-07-12T23:59:00+07:00 - 2014-09-08T10:05:00Z - -
-
- Boutiques dans les rues -
Atami, Japon, 12 juillet 2014
-
- - -
-
-

Déjà la nuit s'avance, et, du sombre orient,
-Ses voiles par degrés dans les airs se déploient.
-Sommeil, doux abandon, image du néant,
-Des maux de l'existence heureux délassement,
-Tranquille oubli des soins où les hommes se noient ;
-Et vous, qui nous rendez à nos plaisirs passés,
-Touchante Illusion, déesse des mensonges,
-Venez dans mon asile, et sur mes yeux lassés
-Secouez les pavots et les aimables songes.

-
-

Évariste de Parny, Souvenir.

-
- -

Je ne sais pas très bien. Est-ce le fantôme de Atami qui me séduit ? Ou bien est-ce moi qui crée le fantôme dans Atami. Ce matin, je ne savais pas trop quelle direction prendre sur le quai de Tsujido. J'ai finalement le premier train qui venait. Il allait vers Atami et non vers Tokyo.

- -
- Chouette sur une chaise -
Atami, Japon, 12 juillet 2014
-
- -

Le soleil me pousse les épaules dans les rues étroites. La rue étroite me prend la main vers les lieux abandonnés. Une femme prend un verre dans un bar sombre. Sa chouette vivante sur la chaise attends patiemment le fond du verre. Un magasin de céramiques qui ne vend plus rien, juste de la poussière et des images.

- -
- Un pot en céramique sur une étagère -
Atami, Japon, 12 juillet 2014
-
- -

Et une surprise, presque inattendue, se présente. Il aura fallu le coin d'une rue, un premier rideau et puis une porte. Un restaurant de poisson sans fenêtres, une pièce sombre et des notes de jazz, je m'assoie. Je commande un salmon-ikura-don.

- -
- Plateau de repas -
Atami, Japon, 12 juillet 2014
-
- -

Après le repas je reprendrais ma dérive dans la ville fantôme. J'y recherche peut-être le sentiment d'abandon.

- -
- Façade d'immeuble -
Atami, Japon, 12 juillet 2014
-
- - -
-
-
- -
- - tag:la-grange.net,2014-07-11:2014/07/11/souvenir - - La mémoire du goût - 2014-07-11T23:59:00+07:00 - 2014-09-08T09:21:00Z - -
-
- Café en cours d'infusion -
Tsujido, Japon, 5 juillet 2014
-
- - -
-
-

Enfin, de ta liqueur lentement reposée,
-Dans le vase fumant la lie est déposée ;
-Ma coupe, ton nectar, le miel américain,
-Que du suc des roseaux exprima l'Africain,
-Tout est prêt : du Japon l'émail reçoit tes ondes,
-Et seul tu réunis les tributs des deux mondes.

-
-

Jacques Delille, Le café.

-
- -

Parfois nous avons juste besoin de prolonger le souvenir du voyage.

- -
- Café infusé au dessus de lait concentré -
Tsujido, Japon, 5 juillet 2014
-
- -
-
-
- - -
- - tag:la-grange.net,2014-07-10:2014/07/10/typhon - - Typhon discret - 2014-07-10T23:59:00+07:00 - 2014-09-07T13:21:00Z - -
-
- Lampions au dessus de la rue -
Hiratsuka, Japon, 4 juillet 2014
-
- - -
-
-

Je ne laisserai pas de Mémoires.
-La poésie n'est pas la tempête, pas plus que le cyclone. C'est un -fleuve majestueux et fertile.

-
-

Lautréamont, Poésies I.

-
- -

Un Typhon, phon, phon,
-Les magnifiques girouettes,
-Un Typhon, phon, phon,
-Trois p'tits tours et puis s'en vont.

- -

Nous avions fermé tous les volets métalliques de la maison. Okinawa avait subit de plein fouet le souffle du sud. Neoguri devait nous assommer de son marteau. Et puis… et puis… et puis… rien.

- -
-
-
- - -
- - tag:la-grange.net,2014-07-09:2014/07/09/frustration - - Frustration - 2014-07-09T23:59:00+07:00 - 2014-09-07T09:18:00Z - -
-
- bâtiments vus à travers un feuillage -
Omori, Japon, 6 juillet 2014
-
- - -
-
-

Chante donc ta douleur profonde,
-Ton désert au milieu du monde,
-Ton veuvage, ton abandon ;
-Dis, dis quelle amertume affreuse
-Rend la liberté douloureuse
-Pour qui n'en sait plus que le nom !

-
-

Marceline Desbordes-Valmore, Le rossignol aveugle.

-
- -

Il est parfois difficile de trouver le bon équilibre entre le plaisir quotidien que l'on a dans notre travail avec la politique générale de l'organisation qui nous fournit ce travail. Gérer la frustration, prendre du recul et se concentrer sur ce qui nous semble être plus important.

- -

Heureusement ce matin, il y a la bruine fine. Les épines de pin brillent des gouttes d'eau. Heureusement, il y a le souvenir de l'intime feuillage et de l'architecture.

- -
-
-
- -
- - tag:la-grange.net,2014-07-08:2014/07/08/echelle - - Échelle, capacité et opacité - 2014-07-08T23:59:00+07:00 - 2014-09-07T08:34:00Z - -
-
- Dessert en forme de poisson -
Togoshi-Ginza Shinagawa, Japon, 6 juillet 2014
-
- - -
-
-

Le mot local, très clair, s'entend ;
-Du puriste il choque l'oreille ;
-Malgré tout, comme il s'appareille,
-Et comme il s'accorde pourtant
-Avec la parlure d'antan.

-
-

Nérée Beauchemin, Le vieux parler.

-
- -

En me promenant le week-end dernier dans cette rue commerciale, je remarque de nombreuses boutiques, qui ne font pas partie d'une franchise. Elles sont là pour répondre à un besoin qui est local. Elles dépendent des personnes qui les font vivre et non d'une structure multinationale avec ses logiques de marché complètement différente. La question de la marque est une question d'identité personnelle avec son environnement proche et non celle de séduire des milliers de personnes.

- -

Sur le Web, nous tentons souvent de résoudre des problèmes que nous n'avons pas vraiment. La politique économique des infrastructures technologiques nous poussent à certains choix qui finalement sont idiots et en contrepartie créés de nombreux problèmes. Dans les zones urbaines, nous avons accès à des communications cablées ou ADSL de bonne qualité. Très souvent, ces connexions sont permanentes. Nous utilisons des logiciels clients qui sont finalement assez complexes et qui prennent en charge la communication à travers le réseau HTTP.

- -

Et pourtant dès qu'il s'agit d'héberger un service Web, email, etc. Tout devient beaucoup plus compliqué. Il faut louer un espace sur le Web, que ce soit machine unique ou tant de CPUs chez un hébergeur. Ou il est possible pour une personne d'utiliser un des services en ligne offert par l'une des grandes compagnies. Comme toutes ces structures veulent réaliser des bénéfices, leur stratégie est créer des infrastructures qui permettent de gérer un grand nombre. En réalisant ces ensembles, nous permettons une hypercentralisation des services. Les services de courrier, de listes, d'hébergement, de messagerie, de réseau sont alors définies par une poignée de grandes multinationales. Les protocoles sont ajustés afin de permettre à ces services hypercentralisés à haut trafic d'être efficaces.

- -

L'hypercentralisation favorise en retour la surveillance. Elle rend sa pratique efficace et moins coûteuse. Elle devient si accessible qu'il devient tentant d'abandonner un peu de son éthique pour tenter l'expérience et finalement enclencher un processus irréversible. Alors pour répondre à la menace d'une surveillance accrue, nous renforçons la sécurité. Nous rendons nos protocoles plus opaques. Nous créons des murs plus épais, plus hauts. Nous renforçons la résistance. Mais nous n'avons pas réglé le problème initial. Nous avons juste créé les circonstances pour une catastrophe globale plus importante. De la même manière que la course sécuritaire et aux armements ne rend pas le monde plus libre et plus anodin, mais au contraire beaucoup plus sous tension. L'équilibre de la riposte nucléaire tient dans la peur que les gens ne l'utiliseront pas. Elle ne répond pas le monde moins dangereux, bien au contraire.

- -

Alors que faire ?

- -

Pour retourner un réseau Web plus opaque, plus humain et moins victime de la surveillance massive. Il faut favoriser la décentralisation. La décentralisation commence par la réciprocité de la capacité à publier de chez soi, de pouvoir facilement démarrer un serveur Web, d'héberger son propre nom de domaine, sa prope liste de discussions. Nous n'avons pour la plupart aucun besoin des performances ultimes des serveurs Web des grands groupes de presse, des grandes sociétés. Le trafic généré sur nos sites pourrait être parfaitement absorbé par une machine locale. Les logiciels d'administration pourraient être très simplifiés. On ne réglera pas tous les problèmes. On ne garantira pas une sécurité ultime, mais on réduira nettement l'ampleur et l'intérêt des attaques.

- -
- Dessert avec pâte de haricot -
Togoshi-Ginza Shinagawa, Japon, 6 juillet 2014
-
- -

Dans cette rue, j'ai mangé un produit qui a été fait localement, qui n'avait pas de marque sur le paquet en papier, qui n'avait que son goût, qui m'offrait du plaisir et répondait à mon besoin de faim. Non seulement, ce produit peut exister ailleurs fait par une autre boutique, mais celui-ci est l'opportunité de la nostalgie, d'une ancre pour la mémoire, la possibilité d'un manque. Il en est de même de nos services Web, nous n'avons pas besoin d'être résistant à un trafic de millions de personnes lorsqu'uniquement quelques dizaines de personnes nous liront.

- -
-
-
- -
- -
\ No newline at end of file From 21ac0a5fd980daffb6c0ce04c87c2d0ee5a46cf4 Mon Sep 17 00:00:00 2001 From: Mathias Kresin Date: Sun, 18 Jan 2015 18:40:00 +0100 Subject: [PATCH 6/7] fix compatibility for php < 5.5 --- controllers/common.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/common.php b/controllers/common.php index e622a84..ff39893 100644 --- a/controllers/common.php +++ b/controllers/common.php @@ -14,7 +14,7 @@ Router\before(function($action) { // Select the requested database either from post param database or from the // session variable. If it fails, logout to destroy session and // 'remember me' cookie - if (! empty(Request\value('database')) && ! Model\Database\select(Request\value('database'))) { + if (! is_null(Request\value('database')) && ! Model\Database\select(Request\value('database'))) { Model\User\logout(); Response\redirect('?action=login'); } From 972fa86357f7778b66eb3144c3078f84c272d76c Mon Sep 17 00:00:00 2001 From: Mathias Kresin Date: Thu, 15 Jan 2015 02:01:54 +0100 Subject: [PATCH 7/7] update integration tests - more flexibility and explicitly with the expected dataset - use radio button to select unittest.db - add tests: - previous/next article with arrow key left/right - no alerts are displayed by default - alert is displayed on first feed page if feed has parsing error - keyboard shortcuts are disabled with modifier keys shift, alt and control (except IE) - display logic on subscription page --- phpunit.xml | 2 +- .../datasets/fixture_feed1_parsing_error.xml | 178 ++++++++++++++++++ .../fixture_feed_error_disabled_normal.xml | 177 +++++++++++++++++ tests/integration/keyboardShortcutsTest.php | 145 ++++++++++++-- tests/integration/minifluxTestCase.php | 118 +++++++++--- tests/integration/pageBookmarksTest.php | 58 +++--- tests/integration/pageFirstFeedTest.php | 93 ++++++--- tests/integration/pageHistoryTest.php | 46 +++-- tests/integration/pageSubscriptionTest.php | 130 +++++++++++++ tests/integration/pageUnreadTest.php | 42 +++-- 10 files changed, 861 insertions(+), 128 deletions(-) create mode 100644 tests/integration/datasets/fixture_feed1_parsing_error.xml create mode 100644 tests/integration/datasets/fixture_feed_error_disabled_normal.xml create mode 100644 tests/integration/pageSubscriptionTest.php diff --git a/phpunit.xml b/phpunit.xml index 7a7e353..5909a9b 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,4 +1,4 @@ - + diff --git a/tests/integration/datasets/fixture_feed1_parsing_error.xml b/tests/integration/datasets/fixture_feed1_parsing_error.xml new file mode 100644 index 0000000..55e8ed7 --- /dev/null +++ b/tests/integration/datasets/fixture_feed1_parsing_error.xml @@ -0,0 +1,178 @@ + + + + id + site_url + feed_url + title + last_modified + etag + last_checked + enabled + download_content + parsing_error + rtl + + 1 + http://miniflux.net/ + http://miniflux.net/feed.xml + Recent Miniflux Releases + + + + 1 + 0 + 1 + 0 + +
+ + id + url + title + author + content + updated + status + feed_id + bookmark + enclosure + enclosure_type + language + + 22ca3b4f + http://miniflux.net/news.html#2013-03-21 + Miniflux 1.0.2 is released + + <ul><li><a href="http://miniflux.net/miniflux-1.0.2.zip" rel="noreferrer" target="_blank" >Download archive</a></li> + <li><a href="http://miniflux.net/changes.html#v1.0.2" rel="noreferrer" target="_blank" >ChangeLog</a></li> + </ul> + ##TIMESTAMP##92 + unread + 1 + 0 + + + en-US + + + 30d227f3 + http://miniflux.net/news.html#2013-07-22 + Miniflux 1.0.10 is released! + + <ul><li><a href="http://miniflux.net/miniflux-1.0.10.zip" rel="noreferrer" target="_blank" >Download archive</a></li> + <li><a href="http://miniflux.net/changes.html#v1.0.10" rel="noreferrer" target="_blank" >ChangeLog</a></li> + </ul> + ##TIMESTAMP##97 + unread + 1 + 1 + + + en-US + + + 4b2dbd17 + http://miniflux.net/news.html#2013-03-26 + Miniflux 1.0.3 is released + + <ul><li><a href="http://miniflux.net/miniflux-1.0.3.zip" rel="noreferrer" target="_blank" >Download archive</a></li> + <li><a href="http://miniflux.net/changes.html#v1.0.3" rel="noreferrer" target="_blank" >ChangeLog</a></li> + </ul> + ##TIMESTAMP##93 + read + 1 + 0 + + + en-US + + + 51b4239b + http://miniflux.net/news.html#2013-04-12 + Miniflux 1.0.6 is released + + <ul><li><a href="http://miniflux.net/miniflux-1.0.6.zip" rel="noreferrer" target="_blank" >Download archive</a></li> + <li><a href="http://miniflux.net/changes.html#v1.0.6" rel="noreferrer" target="_blank" >ChangeLog</a></li> + </ul> + ##TIMESTAMP##94 + read + 1 + 1 + + + en-US + + + 7c6afaa5 + http://miniflux.net/news.html#2014-01-02 + Miniflux 1.1.1 is released + + <ul><li><a href="http://miniflux.net/miniflux-1.1.1.zip" rel="noreferrer" target="_blank" >Download archive</a></li> + <li><a href="http://miniflux.net/changes.html#v1.1.1" rel="noreferrer" target="_blank" >ChangeLog</a></li> + </ul><p>Major improvements:</p> + <ul><li>New theme: Copper (By the contributor Nicolas Dewaele)</li> + <li>Display a message next to a feed when there is a parsing error</li> + <li>Change default value of autoflush to 15 days if not set to avoid large database</li> + <li>Add autoflush value &quot;immediately&quot;</li> + <li>Add an option to choose where to be redirected when there is nothing to read</li> + <li>Bug fixes</li> + </ul> + ##TIMESTAMP##99 + unread + 1 + 0 + + + en-US + + + 7cb2809d + http://miniflux.net/news.html#2013-09-02 + Miniflux 1.0.11 is released + + <ul><li><a href="http://miniflux.net/miniflux-1.0.11.zip" rel="noreferrer" target="_blank" >Download archive</a></li> + <li><a href="http://miniflux.net/changes.html#v1.0.11" rel="noreferrer" target="_blank" >ChangeLog</a></li> + </ul> + ##TIMESTAMP##98 + unread + 1 + 1 + + + en-US + + + 9b20eb66 + http://miniflux.net/news.html#2013-04-30 + Miniflux 1.0.7 is released + + <ul><li><a href="http://miniflux.net/miniflux-1.0.7.zip" rel="noreferrer" target="_blank" >Download archive</a></li> + <li><a href="http://miniflux.net/changes.html#v1.0.7" rel="noreferrer" target="_blank" >ChangeLog</a></li> + </ul> + ##TIMESTAMP##95 + read + 1 + 0 + + + en-US + + + 9fa78b54 + http://miniflux.net/news.html#2013-06-02 + Miniflux 1.0.8 is released + + <ul><li><a href="http://miniflux.net/miniflux-1.0.8.zip" rel="noreferrer" target="_blank" >Download archive</a></li> + <li><a href="http://miniflux.net/changes.htm#v1.0.8" rel="noreferrer" target="_blank" >ChangeLog</a></li> + </ul> + ##TIMESTAMP##96 + read + 1 + 1 + + + en-US + +
+
diff --git a/tests/integration/datasets/fixture_feed_error_disabled_normal.xml b/tests/integration/datasets/fixture_feed_error_disabled_normal.xml new file mode 100644 index 0000000..3361a6e --- /dev/null +++ b/tests/integration/datasets/fixture_feed_error_disabled_normal.xml @@ -0,0 +1,177 @@ + + + + id + site_url + feed_url + title + last_modified + etag + last_checked + enabled + download_content + parsing_error + rtl + + 1 + http://www.01net.com/actus/ + http://www.netzsensor.de/noone.rss + 01net. Actualités + + + + 1 + 0 + 0 + 0 + + + 2 + http://devopsreactions.tumblr.com/ + http://devopsreactions.tumblr.com/rss + DevOps Reactions + + + ##TIMESTAMP##00 + 0 + 0 + 0 + 0 + + + 3 + http://forums.fedoraforum.org/ + http://forums.fedoraforum.org/external.php?type=RSS2 + FedoraForum.org + + + ##TIMESTAMP##00 + 1 + 0 + 0 + 0 + + + 4 + https://news.ycombinator.com/ + https://news.ycombinator.com/rss + Hacker News + + + ##TIMESTAMP##00 + 1 + 0 + 1 + 0 + + + 5 + http://xakep.ru/ + http://www.xakep.ru/articles/rss/ + XAKEP.RU + + + ##TIMESTAMP##00 + 1 + 0 + 0 + 0 + +
+ + id + url + title + author + content + updated + status + feed_id + bookmark + enclosure + enclosure_type + language + + 0fccceb1 + http://www.expatsoftware.com/Articles/bootstrapping-abroad.html?try=3 + Bootstrapping overseas as an American + + <a href="https://news.ycombinator.com/item?id=8898238" rel="noreferrer" target="_blank">Comments</a> + ##TIMESTAMP##00 + read + 4 + 0 + + + + + + 6b8e4aa3 + http://forums.fedoraforum.org/showthread.php?t=302442&goto=newpost + Question about http hack from another thread + lightman47 + Ref: <a href="http://www.forums.fedoraforum.org/showthread.php?t=302439" rel="noreferrer" target="_blank">http://www.forums.fedoraforum.org/sh...d.php?t=302439</a><br/><br/> +I didn&#039;t want to hijack this thread, but the bigger question remains - How could this happen? In my mind I wouldn&#039;t think that user Apache (or ftpsecure) could even get to the &#039;etc&#039; directory - much less abscond a file.<br/><br/> +I&#039;m curious because I run a site of my own, although I also run denyhosts with bad attempts throttled to 3 and lock out all sevrvices.<br/><br/> +Thx + ##TIMESTAMP##00 + unread + 3 + 0 + + + en-US + + + 72d36b63 + http://ocsigen.org/js_of_ocaml/ + Js_of_ocaml – A compiler of OCaml bytecode to Javascript + + <a href="https://news.ycombinator.com/item?id=8898680" rel="noreferrer" target="_blank">Comments</a> + ##TIMESTAMP##00 + unread + 4 + 0 + + + + + + 8374a575 + http://devopsreactions.tumblr.com/post/108246850813 + Who will pick up this bug in the legacy code? + sharhalakis + <p><img src="?action=proxy&amp;url=https%3A%2F%2Fi.imgur.com%2FqSU3xKV.gif"/></p> +<p>by uaiHebert</p> + ##TIMESTAMP##00 + read + 2 + 0 + + + + + + b8b894ad + https://xakep.ru/2015/01/16/hackers-list/ + Hacker’s List: найми правильного хакера! + Denis Mirkov + <a href="https://xakep.ru/2015/01/16/hackers-list/" rel="noreferrer" target="_blank"><img src="?action=proxy&amp;url=https%3A%2F%2Fxakep.ru%2Fwp-content%2Fuploads%2F2015%2F01%2F00228-120x76.jpg%3F614ffd" title="Hacker’s List: найми правильного хакера!"/></a><p>Нужно провести разведывательную операцию? Шпионаж? Прослушка? Никаких проблем — в онлайне сотни хакеров, готовых помочь за вознаграждение. Нужно только выбрать среди них.</p> +<p>«Найми подходящего хакера!», — под таким девизом открылся новый сайт Hacker’s List, настоящий каталог со списком разнообразных услуг, <a href="http://dealbook.nytimes.com/2015/01/15/need-some-espionage-done-hackers-are-for-hire-online/" rel="noreferrer" target="_blank">пишет</a> NY Times. Сайт открылся в начале ноября.</p> +<p>Спрос на хакерские услуги немаленький. Например, некий житель Швеции предлагает $2000 тому, кто сможет взломать сайт его арендодателя. Жительница Калифорнии предлагает $500 за взлом странички Facebook её парня, а также его почтового ящика Gmail — несчастная девушка хочет убедиться, что парень ей не изменяет. Какой-то австралиец готов выложить $2000, чтобы получить список клиентов из базы конкурента.</p> +<p>В наше время взлом, слежка и прослушка перестали быть монополией спецслужб. Соответствующие инструменты и обучающие курсы свободно доступны в онлайне. Специалисты по информационной безопасности работают не только на государственные структуры, но не гнушаются и более мелкими заказами от частных лиц. И если взломы крупных корпораций вроде Sony Pictures, JPMorgan Chase и Home Depot привлекают всеобщее внимание, то подпольная индустрия частного взлома тихо живёт и процветает.</p> +<p>Взлом почтовых ящиков, удаление фотографий из социальной сети, доступ к базе данных компании, изменение оценки на школьном сервере. Менее чем за три месяца работы на сайте Hacker’s List накопилось более 500 «грязных» заказов, по которым идёт торговля со снижением цены (голландский аукцион). Есть и «невинные» заказы, когда клиент просит восстановить забытый пароль от собственного почтового ящика (впрочем, кто докажет, что это именно его ящик?).</p> +<p>Всего на сайте сейчас около 40 зарегистрированных хакеров и 844 зарегистрированных клиента.</p> +<p>Все участники сохраняют анонимность, а неизвестный оператор сайта получает процент с каждого заказа. Есть опция «гарантированной оплаты», когда платёж происходит только после выполнения работы. Оператор сайта снимает с себя всякую ответственность: каждый пользователь должен подписать 10-страничное соглашение об использовании сервиса, в котором обязуется соблюдать закон. Сайт зарегистрирован в Новой Зеландии, у него даже есть твиттер-аккаунт (@hackerslist).</p> +<p>Пример этого сайта, а также исключительная активность в соответствующих ветках форума журнала «Хакер» показывает, что рынок «низкоуровневых» взломов процветает, а главное — существует огромный неудовлетворённый спрос на хакерские услуги. Независимые эксперты подтверждают, что взлом почтовых ящиков и аккаунтов в социальных сетях происходит на ежедневной основе. Появились даже специализированные ресурсы вроде <a href="http://hackerforhirereview.com/" rel="noreferrer" target="_blank">hackerforhirereview.com</a> с обзором таких сервисов, где им выставляют оценки.</p> +<p>Прочитать полностью на сайте: <a href="https://xakep.ru/2015/01/16/hackers-list/" rel="noreferrer" target="_blank">Hacker’s List: найми правильного хакера!</a></p> + ##TIMESTAMP##00 + unread + 5 + 0 + + + en-US + +
+
diff --git a/tests/integration/keyboardShortcutsTest.php b/tests/integration/keyboardShortcutsTest.php index 514a334..f81bcd2 100644 --- a/tests/integration/keyboardShortcutsTest.php +++ b/tests/integration/keyboardShortcutsTest.php @@ -1,7 +1,5 @@ expectedCounterPage) $this->basePageHeading"; } + public function testNoAlertShown() + { + $alertBox = $this->getAlertBox(); + $this->assertEmpty($alertBox, 'Unexpected alert box found'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } + public function testNextItemShortcutA() { $articles = $this->getArticles(); @@ -36,7 +44,7 @@ class keyboardShortcutTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); } public function testNextItemShortcutB() @@ -54,7 +62,25 @@ class keyboardShortcutTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('fixture_feed1');; + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } + + public function testNextItemShortcutC() + { + $articles = $this->getArticles(); + + $this->setArticleAsCurrentArticle($articles[0]); + $this->keys($this->getShortcutNextItemC()); + + $firstIsNotCurrentArticle = $this->waitForArticleIsNotCurrentArticle($articles[0]); + $secondIsCurrentArticle = $this->waitForArticleIsCurrentArticle($articles[1]); + + $this->assertTrue($firstIsNotCurrentArticle, 'The first Article is still the current Article'); + $this->assertTrue($secondIsCurrentArticle, 'The second Article is not the current Article'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); } public function testPreviousItemA() @@ -67,12 +93,12 @@ class keyboardShortcutTest extends minifluxTestCase $firstIsCurrentArticle = $this->waitForArticleIsCurrentArticle($articles[0]); $secondIsNotCurrentArticle = $this->waitForArticleIsNotCurrentArticle($articles[1]); - $this->assertTrue($firstIsCurrentArticle, 'The first Article is not the current Article'); + $this->assertTrue($firstIsCurrentArticle, 'The first article is not the current article'); $this->assertTrue($secondIsNotCurrentArticle, 'The second Article is still the current Article'); $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); } public function testPreviousItemB() @@ -85,12 +111,30 @@ class keyboardShortcutTest extends minifluxTestCase $firstIsCurrentArticle = $this->waitForArticleIsCurrentArticle($articles[0]); $secondIsNotCurrentArticle = $this->waitForArticleIsNotCurrentArticle($articles[1]); - $this->assertTrue($firstIsCurrentArticle, 'The first Article is not the current Article'); + $this->assertTrue($firstIsCurrentArticle, 'The first article is not the current article'); $this->assertTrue($secondIsNotCurrentArticle, 'The second Article is still the current Article'); $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } + + public function testPreviousItemC() + { + $articles = $this->getArticles(); + + $this->setArticleAsCurrentArticle($articles[1]); + $this->keys($this->getShortcutPreviousItemC()); + + $firstIsCurrentArticle = $this->waitForArticleIsCurrentArticle($articles[0]); + $secondIsNotCurrentArticle = $this->waitForArticleIsNotCurrentArticle($articles[1]); + + $this->assertTrue($firstIsCurrentArticle, 'The first article is not the current article'); + $this->assertTrue($secondIsNotCurrentArticle, 'The second Article is still the current Article'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); } public function testNextStopsAtLastArticle() @@ -109,7 +153,7 @@ class keyboardShortcutTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); } public function testPreviousStopsAtFirstArticle() @@ -124,11 +168,74 @@ class keyboardShortcutTest extends minifluxTestCase $firstIsCurrentArticle = $this->waitForArticleIsCurrentArticle($articles[0]); $this->assertTrue($lastIsNotCurrentArticle, 'The last Article is still the current Article'); - $this->assertTrue($firstIsCurrentArticle, 'The first Article is not the current Article'); + $this->assertTrue($firstIsCurrentArticle, 'The first article is not the current article'); $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } + + public function testSHIFTModifierIsDisabled() + { + if ($this->getBrowser() === "iexplore") { + $this->markTestSkipped('Modifier key test is not supported with Internet Explorer [Selenium issue #4973].'); + } + + $articles = $this->getArticles(); + + $this->setArticleAsCurrentArticle($articles[0]); + $this->keys(PHPUnit_Extensions_Selenium2TestCase_Keys::SHIFT.$this->getShortcutNextItemC()); + $this->keys(PHPUnit_Extensions_Selenium2TestCase_Keys::SHIFT); + + $firstIsNotCurrentArticle = $this->waitForArticleIsNotCurrentArticle($articles[0]); + + $this->assertFalse($firstIsNotCurrentArticle, 'The first article is not the current article'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } + + public function testALTModifierIsDisabled() + { + if ($this->getBrowser() === "iexplore") { + $this->markTestSkipped('Modifier key test is not supported with Internet Explorer [Selenium issue #4973].'); + } + + $articles = $this->getArticles(); + + $this->setArticleAsCurrentArticle($articles[0]); + $this->keys(PHPUnit_Extensions_Selenium2TestCase_Keys::ALT.$this->getShortcutNextItemB()); + $this->keys(PHPUnit_Extensions_Selenium2TestCase_Keys::ALT); + + $firstIsNotCurrentArticle = $this->waitForArticleIsNotCurrentArticle($articles[0]); + + $this->assertFalse($firstIsNotCurrentArticle, 'The first article is not the current article'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } + + public function testCTRLModifierIsDisabled() + { + if ($this->getBrowser() === "iexplore") { + $this->markTestSkipped('Modifier key test is not supported with Internet Explorer [Selenium issue #4973].'); + } + + $articles = $this->getArticles(); + + $this->setArticleAsCurrentArticle($articles[0]); + $this->keys(PHPUnit_Extensions_Selenium2TestCase_Keys::CONTROL.$this->getShortcutNextItemB()); + $this->keys(PHPUnit_Extensions_Selenium2TestCase_Keys::CONTROL); + + $firstIsNotCurrentArticle = $this->waitForArticleIsNotCurrentArticle($articles[0]); + + $this->assertFalse($firstIsNotCurrentArticle, 'The first article is not the current article'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); } public function testShortcutsOnInputFiledAreDisabled() @@ -136,11 +243,13 @@ class keyboardShortcutTest extends minifluxTestCase $url = $this->getURLPagePreferences(); $this->url($url); - $this->byId('form-username')->value($this->getShortcutGoToUnread()); + + $this->byId('form-username')->click(); + $this->keys($this->getShortcutGoToUnread()); $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; $this->expectedPageUrl = $url; - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); $this->ignorePageTitle = TRUE; } @@ -152,7 +261,7 @@ class keyboardShortcutTest extends minifluxTestCase $this->expectedCounterPage = '6'; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; $this->expectedPageUrl = $this->getURLPageBookmarks(); - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); $this->ignorePageTitle = TRUE; } @@ -164,7 +273,7 @@ class keyboardShortcutTest extends minifluxTestCase $this->expectedCounterPage = '6'; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; $this->expectedPageUrl = $this->getURLPageHistory(); - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); $this->ignorePageTitle = TRUE; } @@ -176,7 +285,7 @@ class keyboardShortcutTest extends minifluxTestCase $this->expectedCounterPage = '6'; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; $this->expectedPageUrl = $this->getURLPageUnread(); - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); $this->ignorePageTitle = TRUE; } @@ -187,7 +296,7 @@ class keyboardShortcutTest extends minifluxTestCase $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; $this->expectedPageUrl = PHPUNIT_TESTSUITE_EXTENSION_SELENIUM_BASEURL.'?action=feeds'; - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); $this->ignorePageTitle = TRUE; } @@ -198,7 +307,7 @@ class keyboardShortcutTest extends minifluxTestCase $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; $this->expectedPageUrl = $this->getURLPagePreferences(); - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); $this->ignorePageTitle = TRUE; } diff --git a/tests/integration/minifluxTestCase.php b/tests/integration/minifluxTestCase.php index ed119ce..3e31b4c 100644 --- a/tests/integration/minifluxTestCase.php +++ b/tests/integration/minifluxTestCase.php @@ -1,5 +1,7 @@ getDatabaseTester('fixture_feed1', TRUE)->onSetUp(); + $dataset = $this->getDataSet('fixture_feed1', 'fixture_feed2'); + $this->getDatabaseTester($dataset)->onSetUp(); // Set the base URL for the tests. $this->setBrowserUrl(PHPUNIT_TESTSUITE_EXTENSION_SELENIUM_BASEURL); @@ -40,7 +43,7 @@ abstract class minifluxTestCase extends PHPUnit_Extensions_Selenium2TestCase $elements = $this->elements($this->using('css selector')->value('body#login-page')); if (count($elements) === 1) { - $this->url('?action=select-db&database='.DB_FILENAME); + $this->byCssSelector("input[value='".DB_FILENAME."']")->click(); $this->byId('form-username')->click(); $this->keys('admin'); @@ -90,17 +93,14 @@ abstract class minifluxTestCase extends PHPUnit_Extensions_Selenium2TestCase PHPUnit_Extensions_Database_TestCase::assertDataSetsEqual($expectedDataSetFiltered, $actualDataSetFiltered, 'Unexpected changes in database'); } - protected function getDataSet($dataSetFile, $appendFeed2 = TRUE) + protected function getDataSet() { $compositeDs = new PHPUnit_Extensions_Database_DataSet_CompositeDataSet(); + $dataSetFiles = func_get_args(); - $ds1 = new PHPUnit_Extensions_Database_DataSet_XmlDataSet(dirname(__FILE__).DIRECTORY_SEPARATOR.'datasets'.DIRECTORY_SEPARATOR.$dataSetFile.'.xml'); - $compositeDs->addDataSet($ds1); - - if ($appendFeed2) { - // feed2 should be normaly untouched - $ds2 = new PHPUnit_Extensions_Database_DataSet_XmlDataSet(dirname(__FILE__).DIRECTORY_SEPARATOR.'datasets'.DIRECTORY_SEPARATOR.'fixture_feed2.xml'); - $compositeDs->addDataSet($ds2); + foreach ($dataSetFiles as $dataSetFile) { + $ds = new PHPUnit_Extensions_Database_DataSet_XmlDataSet(dirname(__FILE__).DIRECTORY_SEPARATOR.'datasets'.DIRECTORY_SEPARATOR.$dataSetFile.'.xml'); + $compositeDs->addDataSet($ds); } return $compositeDs; @@ -140,16 +140,15 @@ abstract class minifluxTestCase extends PHPUnit_Extensions_Selenium2TestCase return static::$databaseConnection; } - protected function getDatabaseTester($dataSetFile, $appendFeed2) + protected function getDatabaseTester($dataset) { if (is_null(static::$databaseTester)) { - $tester = new PHPUnit_Extensions_Database_DefaultTester($this->getConnection()); - - // article/feed import on database->onSetUp(); - $tester->setSetUpOperation(PHPUnit_Extensions_Database_Operation_Factory::CLEAN_INSERT()); - $dataset = $this->getDataSet($dataSetFile, $appendFeed2); $rdataset = new PHPUnit_Extensions_Database_DataSet_ReplacementDataSet($dataset); $rdataset->addSubStrReplacement('##TIMESTAMP##', substr((string)(time()-100), 0, -2)); + + // article/feed import on database->onSetUp(); + $tester = new PHPUnit_Extensions_Database_DefaultTester($this->getConnection()); + $tester->setSetUpOperation(PHPUnit_Extensions_Database_Operation_Factory::CLEAN_INSERT()); $tester->setDataSet($rdataset); static::$databaseTester = $tester; @@ -177,18 +176,35 @@ abstract class minifluxTestCase extends PHPUnit_Extensions_Selenium2TestCase return $value; } + // public to be accessible within an closure + public function isElementVisible($element) + { + $displaySize = $element->size(); + + return ($element->displayed() && $displaySize['height']>0 && $displaySize['width']>0); + } + + // public to be accessible within an closure + public function isElementInvisible($element) + { + $displaySize = $element->size(); + + return ($element->displayed() === FALSE || $displaySize['height']=0 || $displaySize['width']=0); + } + private function waitForElementVisibility($element, $visible) { // return false in case of timeout try { - $value = $this->waitUntil(function() use($element, $visible) { + // Workaround for PHP < 5.4 + $CI = $this; + + $value = $this->waitUntil(function() use($CI, $element, $visible) { // a "No such Element" or "Stale Element Reference" exception is // valid if an object should disappear try { - $displaySize = $element->size(); - - if ((($visible === TRUE) && ($element->displayed() && $displaySize['height']>0 && $displaySize['width']>0)) - || (($visible === FALSE) && ($element->displayed() === FALSE || $displaySize['height']=0 || $displaySize['width']=0))) { + if (($visible && $CI->isElementVisible($element)) + || (! $visible && $CI->isElementInvisible($element))) { return TRUE; } } @@ -329,6 +345,11 @@ abstract class minifluxTestCase extends PHPUnit_Extensions_Selenium2TestCase return PHPUNIT_TESTSUITE_EXTENSION_SELENIUM_BASEURL.'?action=config'; } + public function getURLPageSubscriptions() + { + return PHPUNIT_TESTSUITE_EXTENSION_SELENIUM_BASEURL.'?action=feeds'; + } + public function getShortcutNextItemA() { return 'n'; @@ -339,6 +360,11 @@ abstract class minifluxTestCase extends PHPUnit_Extensions_Selenium2TestCase return 'j'; } + public function getShortcutNextItemC() + { + return PHPUnit_Extensions_Selenium2TestCase_Keys::RIGHT; + } + public function getShortcutPreviousItemA() { return 'p'; @@ -349,6 +375,11 @@ abstract class minifluxTestCase extends PHPUnit_Extensions_Selenium2TestCase return 'k'; } + public function getShortcutPreviousItemC() + { + return PHPUnit_Extensions_Selenium2TestCase_Keys::LEFT; + } + public function getShortcutToogleReadStatus() { return 'm'; @@ -404,6 +435,43 @@ abstract class minifluxTestCase extends PHPUnit_Extensions_Selenium2TestCase return $articles; } + public function getFeedFailed() + { + $cssSelector = 'article[data-feed-id="4"]'; + + $feed = $this->element($this->using('css selector')->value($cssSelector)); + return $feed; + } + + public function getFeedDisabled() + { + $cssSelector = 'article[data-feed-id="2"]'; + + $feed = $this->element($this->using('css selector')->value($cssSelector)); + return $feed; + } + + public function getFeedErrorMessages() + { + $cssSelector = 'article .feed-parsing-error'; + + if (func_num_args() === 0) { + $feed = $this; + } + else { + $feed = func_get_arg(0); + } + + $feeds = $feed->elements($this->using('css selector')->value($cssSelector)); + + // Workaround for PHP < 5.4 + $CI = $this; + + return array_filter($feeds, function($feed) use($CI) { + return $CI->isElementVisible($feed); + }); + } + public function getArticleUnreadNotBookmarked() { $cssSelector = 'article[data-item-id="7c6afaa5"]'; @@ -490,6 +558,14 @@ abstract class minifluxTestCase extends PHPUnit_Extensions_Selenium2TestCase return $link; } + public function getAlertBox() + { + $cssSelector = 'p.alert'; + + $alertBox = $this->elements($this->using('css selector')->value($cssSelector)); + return $alertBox; + } + public function waitForArticleIsCurrentArticle($article) { $isCurrent = $this->waitForElementAttributeHasValue($article, 'id', 'current-item'); diff --git a/tests/integration/pageBookmarksTest.php b/tests/integration/pageBookmarksTest.php index 28d8f9a..6599dc7 100644 --- a/tests/integration/pageBookmarksTest.php +++ b/tests/integration/pageBookmarksTest.php @@ -1,7 +1,5 @@ basePageHeading ($this->expectedCounterPage)"; } + public function testNoAlertShown() + { + $alertBox = $this->getAlertBox(); + $this->assertEmpty($alertBox, 'Unexpected alert box found'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } + public function testItemsFromAllFeeds() { $articles = $this->getArticlesNotFromFeedOne(); @@ -28,7 +36,7 @@ class pageBookmarksTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); } public function testOnlyBookmarkedArticles() @@ -38,7 +46,7 @@ class pageBookmarksTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); } public function testMarkReadBookmarkedArticleLink() @@ -52,8 +60,8 @@ class pageBookmarksTest extends minifluxTestCase $this->assertTrue($visible, 'read icon is not visible'); $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; - $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1;; - $this->expectedDataSet = $this->getDataSet('expected_MarkReadBookmarkedArticle'); + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; + $this->expectedDataSet = $this->getDataSet('expected_MarkReadBookmarkedArticle', 'fixture_feed2'); } public function testMarkReadBookmarkedArticleKeyboard() @@ -67,8 +75,8 @@ class pageBookmarksTest extends minifluxTestCase $this->assertTrue($visible, 'read icon is not visible'); $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; - $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1;; - $this->expectedDataSet = $this->getDataSet('expected_MarkReadBookmarkedArticle'); + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; + $this->expectedDataSet = $this->getDataSet('expected_MarkReadBookmarkedArticle', 'fixture_feed2'); } public function testMarkUnreadBookmarkedArticleLink() @@ -82,8 +90,8 @@ class pageBookmarksTest extends minifluxTestCase $this->assertTrue($invisible, 'read icon is not invisible'); $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; - $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD + 1;; - $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadBookmarkedArticle'); + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD + 1; + $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadBookmarkedArticle', 'fixture_feed2'); } public function testMarkUnreadBookmarkedArticleKeyboard() @@ -97,8 +105,8 @@ class pageBookmarksTest extends minifluxTestCase $this->assertTrue($invisible, 'read icon is not invisible'); $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; - $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD + 1;; - $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadBookmarkedArticle'); + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD + 1; + $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadBookmarkedArticle', 'fixture_feed2'); } public function testUnbookmarkReadArticleLink() @@ -113,7 +121,7 @@ class pageBookmarksTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkReadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkReadArticle', 'fixture_feed2'); } @@ -129,7 +137,7 @@ class pageBookmarksTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkReadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkReadArticle', 'fixture_feed2'); } public function testUnbookmarkUnreadArticleLink() @@ -144,7 +152,7 @@ class pageBookmarksTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkUnreadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkUnreadArticle', 'fixture_feed2'); } public function testUnbookmarkUnreadArticleKeyboard() @@ -159,7 +167,7 @@ class pageBookmarksTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkUnreadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkUnreadArticle', 'fixture_feed2'); } public function testRemoveReadBookmarkedArticleLink() @@ -174,7 +182,7 @@ class pageBookmarksTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_RemoveReadBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_RemoveReadBookmarkedArticle', 'fixture_feed2'); } public function testRemoveUnreadBookmarkedArticleLink() @@ -189,7 +197,7 @@ class pageBookmarksTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; - $this->expectedDataSet = $this->getDataSet('expected_RemoveUnreadBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_RemoveUnreadBookmarkedArticle', 'fixture_feed2'); } public function testUnreadCounterFromNothingToValue() @@ -198,7 +206,9 @@ class pageBookmarksTest extends minifluxTestCase $backupDataTester = static::$databaseTester; static::$databaseTester = NULL; - $this->getDatabaseTester('fixture_OnlyReadArticles', FALSE)->onSetUp(); + + $dataset = $this->getDataSet('fixture_OnlyReadArticles'); + $this->getDatabaseTester($dataset)->onSetUp(); static::$databaseTester = $backupDataTester; $this->refresh(); @@ -214,7 +224,7 @@ class pageBookmarksTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = 1; - $this->expectedDataSet = $this->getDataSet('fixture_OneUnreadArticle',FALSE); + $this->expectedDataSet = $this->getDataSet('fixture_OneUnreadArticle'); } public function testUnreadCounterFromValueToNothing() @@ -223,7 +233,9 @@ class pageBookmarksTest extends minifluxTestCase $backupDataTester = static::$databaseTester; static::$databaseTester = NULL; - $this->getDatabaseTester('fixture_OneUnreadArticle', FALSE)->onSetUp(); + + $dataset = $this->getDataSet('fixture_OneUnreadArticle'); + $this->getDatabaseTester($dataset)->onSetUp(); static::$databaseTester = $backupDataTester; $this->refresh(); @@ -238,7 +250,7 @@ class pageBookmarksTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = ''; - $this->expectedDataSet = $this->getDataSet('fixture_OnlyReadArticles',FALSE); + $this->expectedDataSet = $this->getDataSet('fixture_OnlyReadArticles'); } public function testRedirectWithZeroArticles() @@ -257,7 +269,7 @@ class pageBookmarksTest extends minifluxTestCase $this->expectedCounterPage = NULL; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_NoBookmarkedArticles', FALSE); + $this->expectedDataSet = $this->getDataSet('expected_NoBookmarkedArticles'); $this->ignorePageTitle = TRUE; } diff --git a/tests/integration/pageFirstFeedTest.php b/tests/integration/pageFirstFeedTest.php index 45c2b2d..bbdad08 100644 --- a/tests/integration/pageFirstFeedTest.php +++ b/tests/integration/pageFirstFeedTest.php @@ -1,7 +1,5 @@ expectedCounterPage) $this->basePageHeading"; } + public function testNoAlertShown() + { + $alertBox = $this->getAlertBox(); + $this->assertEmpty($alertBox, 'Unexpected alert box found'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } + + public function testAlertOnParsingError() + { + // load different fixture and reload the page + $backupDataTester = static::$databaseTester; + + static::$databaseTester = NULL; + + $dataset = $this->getDataSet('fixture_feed1_parsing_error', 'fixture_feed2'); + $this->getDatabaseTester($dataset)->onSetUp(); + + static::$databaseTester = $backupDataTester; + $this->refresh(); + + $alertBox = $this->getAlertBox(); + $this->assertCount(1, $alertBox, 'No alert box found'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = $dataset; + } + public function testOnlyItemsFromFirstFeed() { $articles = $this->getArticlesNotFromFeedOne(); @@ -28,7 +57,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); } public function testMarkReadNotBookmarkedArticleLink() @@ -43,7 +72,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkReadNotBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkReadNotBookmarkedArticle', 'fixture_feed2'); } public function testMarkReadNotBookmarkedArticleKeyboard() @@ -58,7 +87,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkReadNotBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkReadNotBookmarkedArticle', 'fixture_feed2'); } public function testMarkReadBookmarkedArticleLink() @@ -73,7 +102,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkReadBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkReadBookmarkedArticle', 'fixture_feed2'); } public function testMarkReadBookmarkedArticleKeyboard() @@ -88,7 +117,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkReadBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkReadBookmarkedArticle', 'fixture_feed2'); } public function testMarkUnreadNotBookmarkedArticleLink() @@ -103,7 +132,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD + 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadNotBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadNotBookmarkedArticle', 'fixture_feed2'); } public function testMarkUnreadNotBookmarkedArticleKeyboard() @@ -118,7 +147,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD + 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadNotBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadNotBookmarkedArticle', 'fixture_feed2'); } public function testMarkUnreadBookmarkedArticleLink() @@ -133,7 +162,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD + 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadBookmarkedArticle', 'fixture_feed2'); } public function testMarkUnreadBookmarkedArticleKeyboard() @@ -148,7 +177,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD + 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadBookmarkedArticle', 'fixture_feed2'); } public function testBookmarkReadArticleLink() @@ -163,7 +192,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_BookmarkReadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_BookmarkReadArticle', 'fixture_feed2'); } public function testBookmarkReadArticleKeyboard() @@ -178,7 +207,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_BookmarkReadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_BookmarkReadArticle', 'fixture_feed2'); } public function testBookmarkUnreadArticleLink() @@ -193,7 +222,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_BookmarkUnreadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_BookmarkUnreadArticle', 'fixture_feed2'); } public function testBookmarkUnreadArticleKeyboard() @@ -208,7 +237,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_BookmarkUnreadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_BookmarkUnreadArticle', 'fixture_feed2'); } public function testUnbookmarkReadArticleLink() @@ -223,7 +252,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkReadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkReadArticle', 'fixture_feed2'); } public function testUnbookmarkReadArticleKeyboard() @@ -238,7 +267,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkReadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkReadArticle', 'fixture_feed2'); } public function testUnbookmarkUnreadArticleLink() @@ -253,7 +282,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkUnreadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkUnreadArticle', 'fixture_feed2'); } public function testUnbookmarkUnreadArticleKeyboard() @@ -268,7 +297,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkUnreadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkUnreadArticle', 'fixture_feed2'); } public function testRemoveReadNotBookmarkedArticleLink() @@ -283,7 +312,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_RemoveReadNotBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_RemoveReadNotBookmarkedArticle', 'fixture_feed2'); } public function testRemoveReadBookmarkedArticleLink() @@ -298,7 +327,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_RemoveReadBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_RemoveReadBookmarkedArticle', 'fixture_feed2'); } public function testRemoveUnreadNotBookmarkedArticleLink() @@ -313,7 +342,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; - $this->expectedDataSet = $this->getDataSet('expected_RemoveUnreadNotBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_RemoveUnreadNotBookmarkedArticle', 'fixture_feed2'); } public function testRemoveUnreadBookmarkedArticleLink() @@ -328,7 +357,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; - $this->expectedDataSet = $this->getDataSet('expected_RemoveUnreadBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_RemoveUnreadBookmarkedArticle', 'fixture_feed2'); } public function testMarkFeedReadHeaderLink() @@ -341,7 +370,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = 2; - $this->expectedDataSet = $this->getDataSet('expected_MarkFeedRead'); + $this->expectedDataSet = $this->getDataSet('expected_MarkFeedRead', 'fixture_feed2'); } public function testMarkFeedReadBottomLink() @@ -354,7 +383,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = 2; - $this->expectedDataSet = $this->getDataSet('expected_MarkFeedRead'); + $this->expectedDataSet = $this->getDataSet('expected_MarkFeedRead', 'fixture_feed2'); } public function testUnreadCounterFromNothingToValue() @@ -363,7 +392,9 @@ class pageFirstFeedTest extends minifluxTestCase $backupDataTester = static::$databaseTester; static::$databaseTester = NULL; - $this->getDatabaseTester('fixture_OnlyReadArticles', FALSE)->onSetUp(); + + $dataset = $this->getDataSet('fixture_OnlyReadArticles'); + $this->getDatabaseTester($dataset)->onSetUp(); static::$databaseTester = $backupDataTester; $this->refresh(); @@ -379,7 +410,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = 1; - $this->expectedDataSet = $this->getDataSet('fixture_OneUnreadArticle',FALSE); + $this->expectedDataSet = $this->getDataSet('fixture_OneUnreadArticle'); } public function testUnreadCounterFromValueToNothing() @@ -388,7 +419,9 @@ class pageFirstFeedTest extends minifluxTestCase $backupDataTester = static::$databaseTester; static::$databaseTester = NULL; - $this->getDatabaseTester('fixture_OneUnreadArticle', FALSE)->onSetUp(); + + $dataset = $this->getDataSet('fixture_OneUnreadArticle'); + $this->getDatabaseTester($dataset)->onSetUp(); static::$databaseTester = $backupDataTester; $this->refresh(); @@ -403,7 +436,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = ''; - $this->expectedDataSet = $this->getDataSet('fixture_OnlyReadArticles',FALSE); + $this->expectedDataSet = $this->getDataSet('fixture_OnlyReadArticles'); } public function testRedirectWithZeroArticles() @@ -423,7 +456,7 @@ class pageFirstFeedTest extends minifluxTestCase $this->expectedCounterPage = NULL; $this->expectedCounterUnread = 2; - $this->expectedDataSet = $this->getDataSet('expected_FirstFeedAllRemoved'); + $this->expectedDataSet = $this->getDataSet('expected_FirstFeedAllRemoved', 'fixture_feed2'); $this->ignorePageTitle = TRUE; } diff --git a/tests/integration/pageHistoryTest.php b/tests/integration/pageHistoryTest.php index ed1a684..0763544 100644 --- a/tests/integration/pageHistoryTest.php +++ b/tests/integration/pageHistoryTest.php @@ -1,7 +1,5 @@ basePageHeading ($this->expectedCounterPage)"; } + public function testNoAlertShown() + { + $alertBox = $this->getAlertBox(); + $this->assertEmpty($alertBox, 'Unexpected alert box found'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } + public function testItemsFromAllFeeds() { $articles = $this->getArticlesNotFromFeedOne(); @@ -28,7 +36,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); } public function testOnlyReadArticles() @@ -38,7 +46,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); } public function testMarkUnreadNotBookmarkedArticleLink() @@ -53,7 +61,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD + 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadNotBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadNotBookmarkedArticle', 'fixture_feed2'); } public function testMarkUnreadNotBookmarkedArticleKeyboard() @@ -68,7 +76,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD + 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadNotBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadNotBookmarkedArticle', 'fixture_feed2'); } public function testMarkUnreadBookmarkedArticleLink() @@ -83,7 +91,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD + 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadBookmarkedArticle', 'fixture_feed2'); } public function testMarkUnreadBookmarkedArticleKeyboard() @@ -98,7 +106,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD + 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkUnreadBookmarkedArticle', 'fixture_feed2'); } public function testBookmarkReadArticleLink() @@ -113,7 +121,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_BookmarkReadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_BookmarkReadArticle', 'fixture_feed2'); } public function testBookmarkReadArticleKeyboard() @@ -128,7 +136,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_BookmarkReadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_BookmarkReadArticle', 'fixture_feed2'); } public function testUnbookmarkReadArticleLink() @@ -143,7 +151,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkReadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkReadArticle', 'fixture_feed2'); } public function testUnbookmarkReadArticleKeyboard() @@ -158,7 +166,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkReadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkReadArticle', 'fixture_feed2'); } public function testRemoveReadNotBookmarkedArticleLink() @@ -173,7 +181,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_RemoveReadNotBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_RemoveReadNotBookmarkedArticle', 'fixture_feed2'); } public function testRemoveReadBookmarkedArticleLink() @@ -188,7 +196,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_RemoveReadBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_RemoveReadBookmarkedArticle', 'fixture_feed2'); } public function testFlushAllKeepsBookmarkedAndUnread() @@ -201,7 +209,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = 3; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_NoReadNotBookmarkedArticles', FALSE); + $this->expectedDataSet = $this->getDataSet('expected_NoReadNotBookmarkedArticles'); $this->ignorePageTitle = TRUE; } @@ -212,7 +220,9 @@ class pageHistoryTest extends minifluxTestCase $backupDataTester = static::$databaseTester; static::$databaseTester = NULL; - $this->getDatabaseTester('fixture_OnlyReadArticles', FALSE)->onSetUp(); + + $dataset = $this->getDataSet('fixture_OnlyReadArticles'); + $this->getDatabaseTester($dataset)->onSetUp(); static::$databaseTester = $backupDataTester; $this->refresh(); @@ -228,7 +238,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE + static::DEFAULT_COUNTER_UNREAD - 1; $this->expectedCounterUnread = 1; - $this->expectedDataSet = $this->getDataSet('fixture_OneUnreadArticle',FALSE); + $this->expectedDataSet = $this->getDataSet('fixture_OneUnreadArticle'); } public function testRedirectWithZeroArticles() @@ -248,7 +258,7 @@ class pageHistoryTest extends minifluxTestCase $this->expectedCounterPage = NULL; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD + static::DEFAULT_COUNTER_PAGE; - $this->expectedDataSet = $this->getDataSet('expected_NoReadArticles', FALSE); + $this->expectedDataSet = $this->getDataSet('expected_NoReadArticles'); $this->ignorePageTitle = TRUE; } diff --git a/tests/integration/pageSubscriptionTest.php b/tests/integration/pageSubscriptionTest.php new file mode 100644 index 0000000..868cce9 --- /dev/null +++ b/tests/integration/pageSubscriptionTest.php @@ -0,0 +1,130 @@ +getDataSet('fixture_feed_error_disabled_normal'); + $this->getDatabaseTester($dataset)->onSetUp(); + + // Set the base URL for the tests. + $this->setBrowserUrl(PHPUNIT_TESTSUITE_EXTENSION_SELENIUM_BASEURL); + } + + public function setUpPage() + { + $url = $this->getURLPageSubscriptions(); + $this->doLoginIfRequired($url); + + $this->basePageHeading = $this->getBasePageHeading(); + $this->expectedPageUrl = $url; + } + + public function getExpectedPageTitle() + { + return "$this->basePageHeading"; + } + + public function testNoAlertShown() + { + // load different fixture and reload the page + $backupDataTester = static::$databaseTester; + + static::$databaseTester = NULL; + + $dataset = $this->getDataSet('fixture_feed1', 'fixture_feed2'); + $this->getDatabaseTester($dataset)->onSetUp(); + + static::$databaseTester = $backupDataTester; + $this->refresh(); + + $alertBox = $this->getAlertBox(); + $this->assertEmpty($alertBox, 'Unexpected alert box found'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = 6; + $this->expectedDataSet = $dataset; + } + + public function testNoPerFeedErrorMessages() + { + // load different fixture and reload the page + $backupDataTester = static::$databaseTester; + + static::$databaseTester = NULL; + + $dataset = $this->getDataSet('fixture_feed1', 'fixture_feed2'); + $this->getDatabaseTester($dataset)->onSetUp(); + + static::$databaseTester = $backupDataTester; + $this->refresh(); + + $messages = $this->getFeedErrorMessages(); + + $this->assertCount(0, $messages, 'Feeds have unexpected error messages visible.'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = 6; + $this->expectedDataSet = $dataset; + } + + public function testAlertOnParsingError() + { + $alertBox = $this->getAlertBox(); + $this->assertCount(1, $alertBox, 'No alert box found'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } + + public function testFailedFeedIsFirstFeed() + { + $feeds = $this->getArticles(); + + $this->assertEquals($this->getFeedFailed(), $feeds[0], 'The first feed is not the failed feed'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } + + public function testFailedFeedIsHighlighted() + { + $feeds = $this->getArticles(); + + $this->assertNotEquals($feeds[0]->css('background-color'), $feeds[1]->css('background-color'), 'The failed feed is not highlighted'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } + + public function testFailedHasErrorMessageVisible() + { + $feed = $this->getFeedFailed(); + + $this->assertCount(1, $this->getFeedErrorMessages($feed), 'The failed feed has no error message'); + $this->assertCount(1, $this->getFeedErrorMessages(), 'Another than the failed feed has an error message'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } + + public function testDisabledIsLastFeed() + { + $feeds = $this->getArticles(); + + $this->assertEquals($this->getFeedDisabled(), $feeds[count($feeds)-1], 'The disabled feed is not the last feed'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } +} +?> \ No newline at end of file diff --git a/tests/integration/pageUnreadTest.php b/tests/integration/pageUnreadTest.php index d78848f..2c8312d 100644 --- a/tests/integration/pageUnreadTest.php +++ b/tests/integration/pageUnreadTest.php @@ -1,7 +1,5 @@ expectedCounterPage)"; } + public function testNoAlertShown() + { + $alertBox = $this->getAlertBox(); + $this->assertEmpty($alertBox, 'Unexpected alert box found'); + + $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; + $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; + $this->expectedDataSet = static::$databaseTester->getDataSet(); + } + public function testItemsFromAllFeeds() { $articles = $this->getArticlesNotFromFeedOne(); @@ -28,7 +36,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); } public function testOnlyUnreadArticles() @@ -38,7 +46,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('fixture_feed1'); + $this->expectedDataSet = static::$databaseTester->getDataSet(); } public function testMarkReadNotBookmarkedArticleLink() @@ -53,7 +61,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkReadNotBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkReadNotBookmarkedArticle', 'fixture_feed2'); } public function testMarkReadNotBookmarkedArticleKeyboard() @@ -68,7 +76,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkReadNotBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkReadNotBookmarkedArticle', 'fixture_feed2'); } public function testMarkReadBookmarkedArticleLink() @@ -83,7 +91,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkReadBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkReadBookmarkedArticle', 'fixture_feed2'); } public function testMarkReadBookmarkedArticleKeyboard() @@ -98,7 +106,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; - $this->expectedDataSet = $this->getDataSet('expected_MarkReadBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_MarkReadBookmarkedArticle', 'fixture_feed2'); } public function testBookmarkUnreadArticleLink() @@ -113,7 +121,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_BookmarkUnreadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_BookmarkUnreadArticle', 'fixture_feed2'); } public function testBookmarkUnreadArticleKeyboard() @@ -128,7 +136,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_BookmarkUnreadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_BookmarkUnreadArticle', 'fixture_feed2'); } public function testUnbookmarkUnreadArticleLink() @@ -143,7 +151,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkUnreadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkUnreadArticle', 'fixture_feed2'); } public function testUnbookmarkUnreadArticleKeyboard() @@ -158,7 +166,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD; - $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkUnreadArticle'); + $this->expectedDataSet = $this->getDataSet('expected_UnbookmarkUnreadArticle', 'fixture_feed2'); } public function testRemoveUnreadNotBookmarkedArticleLink() @@ -173,7 +181,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; - $this->expectedDataSet = $this->getDataSet('expected_RemoveUnreadNotBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_RemoveUnreadNotBookmarkedArticle', 'fixture_feed2'); } public function testRemoveUnreadBookmarkedArticleLink() @@ -188,7 +196,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = static::DEFAULT_COUNTER_PAGE - 1; $this->expectedCounterUnread = static::DEFAULT_COUNTER_UNREAD - 1; - $this->expectedDataSet = $this->getDataSet('expected_RemoveUnreadBookmarkedArticle'); + $this->expectedDataSet = $this->getDataSet('expected_RemoveUnreadBookmarkedArticle', 'fixture_feed2'); } public function testMarkAllReadHeaderLink() @@ -202,7 +210,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = NULL; $this->expectedCounterUnread = ''; $this->expectedPageUrl = PHPUNIT_TESTSUITE_EXTENSION_SELENIUM_BASEURL.'?action=feeds¬hing_to_read=1'; - $this->expectedDataSet = $this->getDataSet('fixture_OnlyReadArticles', FALSE); + $this->expectedDataSet = $this->getDataSet('fixture_OnlyReadArticles'); $this->ignorePageTitle = TRUE; } @@ -218,7 +226,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = NULL; $this->expectedCounterUnread = ''; $this->expectedPageUrl = PHPUNIT_TESTSUITE_EXTENSION_SELENIUM_BASEURL.'?action=feeds¬hing_to_read=1'; - $this->expectedDataSet = $this->getDataSet('fixture_OnlyReadArticles', FALSE); + $this->expectedDataSet = $this->getDataSet('fixture_OnlyReadArticles'); $this->ignorePageTitle = TRUE; } @@ -241,7 +249,7 @@ class pageUnreadTest extends minifluxTestCase $this->expectedCounterPage = NULL; $this->expectedCounterUnread = ''; $this->expectedPageUrl = PHPUNIT_TESTSUITE_EXTENSION_SELENIUM_BASEURL.'?action=feeds¬hing_to_read=1'; - $this->expectedDataSet = $this->getDataSet('fixture_OnlyReadArticles', FALSE); + $this->expectedDataSet = $this->getDataSet('fixture_OnlyReadArticles'); $this->ignorePageTitle = TRUE; }