## Changelog
+### 2.1.5 2016/11/21
+- [#2623](https://github.com/wallabag/wallabag/pull/2623) Force composer to run as PHP 5.5.9 (@j0k3r)
+- [#2608](https://github.com/wallabag/wallabag/pull/2608) Change version to 2.2.0-dev (@nicosomb)
+- [#2607](https://github.com/wallabag/wallabag/pull/2607) Updated changelog for 2.1.4 (@nicosomb)
+
### 2.1.4 2016/11/19
- [#2604](https://github.com/wallabag/wallabag/pull/2604) wallabag can’t work on PostgreSQL <= 9.1 (@j0k3r)
- [#2605](https://github.com/wallabag/wallabag/pull/2605) Add .travis.yml change to RELEASE_PROCESS (@j0k3r)
+# settings_changed: Configuration updated
download_pictures: Download billeder på din server
carrot: Aktiver deling til Carrot
diaspora_url: Diaspora URL, hvis tjenesten er aktiv
+# settings_changed: Configuration updated
download_pictures: Bilder auf den Server herunterladen
carrot: Teilen zu Carrot aktivieren
diaspora_url: Diaspora-URL, sofern der Service aktiviert ist
+settings_changed: Configuration updated
download_pictures: Download pictures on your server
carrot: Enable share to Carrot
diaspora_url: Diaspora URL, if the service is enabled
+# settings_changed: Configuration updated
download_pictures: Descargar imágenes
carrot: Activar compartir con Carrot
diaspora_url: Diaspora URL, si el servicio está activado
+# settings_changed: Configuration updated
download_pictures: تصاویر را در کارگزار خودتان باربگیرید
carrot: فعالسازی همرسانی به Carrot
diaspora_url: نشانی Diaspora، اگر فعال بود
+settings_changed: Configuration mise à jour
download_pictures: Télécharger les images sur le serveur
carrot: Activer le partage vers Carrot
diaspora_url: URL de Diaspora, si le service Diaspora est activé
+# settings_changed: Configuration updated
download_pictures: Scarica le immagini sul tuo server
carrot: Abilita la condivisione con Carrot
diaspora_url: Diaspora URL, se il servizio è abilitato
+# settings_changed: Configuration updated
download_pictures: Telecargar los imatges sul servidor
carrot: Activar lo partatge cap a Carrot
diaspora_url: URL de Diaspora, se lo servici Diaspora es activat
+# settings_changed: Configuration updated
download_pictures: Pobierz obrazy na swój serwer
carrot: Włącz udostępnianie dla Carrot
diaspora_url: Adres URL Diaspora, jeżeli usługa jest włączona
+# settings_changed: Configuration updated
download_pictures: Download imagens no seu servidor
carrot: Habilitar compartilhamento para o Carrot
diaspora_url: URL Diaspora, se o serviço está habilitado
export_json: Habilita exportação para JSON
export_txt: Habilita exportação para TXT
export_xml: Habilita exportação para XML
-pocket_consumer_key: Chave de consumidor do Pocket para importar conteúdo (https://getpocket.com/developer/docs/authentication)
+# import_with_rabbitmq: Enable RabbitMQ to import data asynchronously
+# import_with_redis: Enable Redis to import data asynchronously
shaarli_url: URL Shaarli, se o serviço está habilitado
share_diaspora: Habilitar compartilhamento para o Diaspora
share_mail: Habilitar compartilhamento por e-mail
piwik_enabled: Habilitar Piwik
demo_mode_enabled: "Habilitar modo demo? (somente usado para o demo público do wallabag)"
demo_mode_username: "Usuário demo"
+# share_public: Allow public url for entries
+# download_images_enabled: Download images locally
+# settings_changed: Configuration updated
download_pictures: Descarcă poze pe server
carrot: Permite share către Carrot
diaspora_url: Diaspora URL, dacă serviciul este permis
+# settings_changed: Configuration updated
# download_pictures: Download pictures on your server
# carrot: Enable share to Carrot
# diaspora_url: Diaspora URL, if the service is enabled
assets: ~
wallabag_core:
- version: 2.2.0-dev
+ version: 2.1.5
paypal_url: "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9UBA65LG3FX9Y&lc=gb"
languages:
en: 'English'
auth_code_class: Wallabag\ApiBundle\Entity\AuthCode
service:
user_provider: fos_user.user_manager
-
+ options:
+ refresh_token_lifetime: 1209600
+
scheb_two_factor:
trusted_computer:
enabled: true
redis_host: localhost
redis_port: 6379
redis_path: null
+ redis_password: null
"doctrine/doctrine-fixtures-bundle": "~2.2",
"doctrine/data-fixtures": "~1.1.1",
"sensio/generator-bundle": "^3.0",
- "phpunit/phpunit": "~5.0",
+ "phpunit/phpunit": "~4.0",
"symfony/phpunit-bridge": "^3.0",
"friendsofphp/php-cs-fixer": "~1.9",
"m6web/redis-mock": "^2.0"
"psr-4": { "Tests\\": "tests/" }
},
"config": {
- "bin-dir": "bin"
+ "bin-dir": "bin",
+ "platform": {
+ "php": "5.5.9"
+ }
},
"minimum-stability": "dev",
"prefer-stable": true
Du kannst auch definieren wie viele Artikel du in deinem RSS Feed (Standardwert: 50) haben willst.
+There is also a pagination available for these feeds. You can add ``?page=2`` to jump to the second page.
+The pagination follow `the RFC <https://tools.ietf.org/html/rfc5005#page-4>`_ about that, which means you'll find the ``next``, ``previous`` & ``last`` page link inside the `<channel>` tag of each RSS feed.
+
Benutzer-Informationen
----------------------
redis_host: localhost
redis_port: 6379
redis_path: null
+ redis_password: null
Bedeutung von jedem Parameter
-----------------------------
"redis_host", "localhost", "IP oder Hostname des Zielservers (ignoriert bei Unix Schema)"
"redis_port", "6379", "TCP/IP Port des Zielservers (ignoriert bei Unix Schema)"
"redis_path", "null", "Pfad zur Unix Domain Socket Datei, wenn Redis Unix Domain Sockets nutzt"
+ "redis_password", "null", "Kennwort, welches in der Redis-Server-Konfiguration definiert ist (Parameter `requirepass` in `redis.conf`)"
You can also define how many articles you want in each RSS feed (default value: 50).
+There is also a pagination available for these feeds. You can add ``?page=2`` to jump to the second page.
+The pagination follow `the RFC <https://tools.ietf.org/html/rfc5005#page-4>`_ about that, which means you'll find the ``next``, ``previous`` & ``last`` page link inside the `<channel>` tag of each RSS feed.
+
User information
----------------
redis_host: localhost
redis_port: 6379
redis_path: null
+ redis_password: null
Meaning of each parameter
-------------------------
"redis_host", "localhost", "IP or hostname of the target server (ignored for unix scheme)"
"redis_port", "6379", "TCP/IP port of the target server (ignored for unix scheme)"
"redis_path", "null", "Path of the UNIX domain socket file used when connecting to Redis using UNIX domain sockets"
+ "redis_password", "null", "Password defined in the Redis server configuration (parameter `requirepass` in `redis.conf`)"
Vous pouvez aussi définir combien d'articles vous souhaitez dans vos flux RSS
(50 est la valeur par défaut).
+Une pagination est aussi disponible pour ces flux. Il suffit de rajouter ``?page=2`` pour aller à la seconde page, par exemple.
+Cette pagination suit `la RFC <https://tools.ietf.org/html/rfc5005#page-4>`_, ce qui signifie que vous trouverez la page suivante (``next``), précédente (``previous``) et la dernière (``last``) dans la balise `<channel>` de chaque flux RSS.
+
Mon compte
----------
redis_host: localhost
redis_port: 6379
redis_path: null
+ redis_password: null
Meaning of each parameter
-------------------------
"redis_host", "localhost", "IP ou hôte du serveur cible (ignoré pour un schéma unix)"
"redis_port", "6379", "Port TCP/IP du serveur cible (ignoré pour un schéma unix)"
"redis_path", "null", "Chemin du fichier de socket du domaine UNIX utilisé quand on se connecte à Redis en utilisant les sockets du domaine UNIX"
+ "redis_password", "null", "Mot de passe défini dans la configuration serveur de Redis (paramètre `requirepass` dans `redis.conf`)"
return (new JsonResponse())->setJson($json);
}
+ /**
+ * Reload an entry.
+ * A response with HTTP Status 400 will be return if we weren't able to update the content (because it hasn't changed or we got an error).
+ *
+ * @ApiDoc(
+ * requirements={
+ * {"name"="entry", "dataType"="integer", "requirement"="\w+", "description"="The entry ID"}
+ * }
+ * )
+ *
+ * @return JsonResponse
+ */
+ public function patchEntriesReloadAction(Entry $entry)
+ {
+ $this->validateAuthentication();
+ $this->validateUserAccess($entry->getUser()->getId());
+
+ try {
+ $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl());
+ } catch (\Exception $e) {
+ $this->get('logger')->error('Error while saving an entry', [
+ 'exception' => $e,
+ 'entry' => $entry,
+ ]);
+
+ return new JsonResponse(['error' => 'Error while trying to fetch content'], 400);
+ }
+
+ // if refreshing entry failed, don't save it
+ if ($this->getParameter('wallabag_core.fetching_error_message') === $entry->getContent()) {
+ return new JsonResponse(['error' => 'Error while trying to extract content'], 400);
+ }
+
+ $em = $this->getDoctrine()->getManager();
+ $em->persist($entry);
+ $em->flush();
+
+ // entry saved, dispatch event about it!
+ $this->get('event_dispatcher')->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry));
+
+ $json = $this->get('serializer')->serialize($entry, 'json');
+
+ return (new JsonResponse())->setJson($json);
+ }
+
/**
* Delete **permanently** an entry.
*
namespace Wallabag\CoreBundle\Controller;
use Pagerfanta\Adapter\DoctrineORMAdapter;
+use Pagerfanta\Exception\OutOfRangeCurrentPageException;
use Pagerfanta\Pagerfanta;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
+use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Wallabag\CoreBundle\Entity\Entry;
use Wallabag\UserBundle\Entity\User;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class RssController extends Controller
{
*
* @return \Symfony\Component\HttpFoundation\Response
*/
- public function showUnreadAction(User $user)
+ public function showUnreadAction(Request $request, User $user)
{
- return $this->showEntries('unread', $user);
+ return $this->showEntries('unread', $user, $request->query->get('page', 1));
}
/**
*
* @return \Symfony\Component\HttpFoundation\Response
*/
- public function showArchiveAction(User $user)
+ public function showArchiveAction(Request $request, User $user)
{
- return $this->showEntries('archive', $user);
+ return $this->showEntries('archive', $user, $request->query->get('page', 1));
}
/**
*
* @return \Symfony\Component\HttpFoundation\Response
*/
- public function showStarredAction(User $user)
+ public function showStarredAction(Request $request, User $user)
{
- return $this->showEntries('starred', $user);
+ return $this->showEntries('starred', $user, $request->query->get('page', 1));
}
/**
*
* @param string $type Entries type: unread, starred or archive
* @param User $user
+ * @param int $page
*
* @return \Symfony\Component\HttpFoundation\Response
*/
- private function showEntries($type, User $user)
+ private function showEntries($type, User $user, $page = 1)
{
$repository = $this->getDoctrine()->getRepository('WallabagCoreBundle:Entry');
$perPage = $user->getConfig()->getRssLimit() ?: $this->getParameter('wallabag_core.rss_limit');
$entries->setMaxPerPage($perPage);
+ $url = $this->generateUrl(
+ $type.'_rss',
+ [
+ 'username' => $user->getUsername(),
+ 'token' => $user->getConfig()->getRssToken(),
+ ],
+ UrlGeneratorInterface::ABSOLUTE_URL
+ );
+
+ try {
+ $entries->setCurrentPage((int) $page);
+ } catch (OutOfRangeCurrentPageException $e) {
+ if ($page > 1) {
+ return $this->redirect($url.'?page='.$entries->getNbPages(), 302);
+ }
+ }
+
return $this->render('@WallabagCore/themes/common/Entry/entries.xml.twig', [
'type' => $type,
+ 'url' => $url,
'entries' => $entries,
]);
}
host: '%redis_host%'
port: '%redis_port%'
path: '%redis_path%'
+ password: '%redis_password%'
wallabag_core.exception_controller:
class: Wallabag\CoreBundle\Controller\ExceptionController
save: 'Zapisz'
form_settings:
theme_label: 'Temat'
- items_per_page_label: 'Ilość elementóœ na stronie'
+ items_per_page_label: 'Ilość elementów na stronie'
language_label: 'Język'
reading_speed:
label: 'Prędkość czytania'
redirect_current_page: 'do bieżącej strony'
pocket_consumer_key_label: 'Klucz klienta Pocket do importu zawartości'
android_configuration: Skonfiguruj swoją androidową aplikację
- # help_theme: "wallabag is customizable. You can choose your prefered theme here."
- # help_items_per_page: "You can change the number of articles displayed on each page."
- # help_reading_speed: "wallabag calculates a reading time for each article. You can define here, thanks to this list, if you are a fast or a slow reader. wallabag will recalculate the reading time for each article."
- # help_language: "You can change the language of wallabag interface."
- # help_pocket_consumer_key: "Required for Pocket import. You can create it in your Pocket account."
+ help_theme: "Dopasuj wallabag do swoich potrzeb. Tutaj możesz wybrać preferowany przez ciebie motyw."
+ help_items_per_page: "Możesz zmienić ilość artykułów wyświetlanych na każdej stronie."
+ help_reading_speed: "wallabag oblicza czas czytania każdego artykułu. Dzięki tej liście możesz określić swoje tempo. Wallabag przeliczy ponownie czas potrzebny, na przeczytanie każdego z artykułów."
+ help_language: "Możesz zmienić język interfejsu wallabag."
+ help_pocket_consumer_key: "Wymagane dla importu z Pocket. Możesz go stworzyć na swoim koncie Pocket."
form_rss:
description: 'Kanały RSS prowadzone przez wallabag pozwalają Ci na czytanie twoich zapisanych artykułów w twoium ulubionym czytniku RSS. Musisz najpierw wynegenerować tokena.'
token_label: 'Token RSS'
name_label: 'Nazwa'
email_label: 'Adres email'
twoFactorAuthentication_label: 'Autoryzacja dwuetapowa'
- # help_twoFactorAuthentication: "If you enable 2FA, each time you want to login to wallabag, you'll receive a code by email."
+ help_twoFactorAuthentication: "Jeżeli włączysz autoryzację dwuetapową. Za każdym razem, kiedy będziesz chciał się zalogować, dostaniesz kod na swój e-mail."
delete:
title: Usuń moje konto (niebezpieczna strefa !)
description: Jeżeli usuniesz swoje konto, wszystkie twoje artykuły, tagi, adnotacje, oraz konto zostaną trwale usunięte (operacja jest NIEODWRACALNA). Następnie zostaniesz wylogowany.
entries: usuń WSZYTSTKIE wpisy
confirm: Jesteś pewien? (tej operacji NIE MOŻNA cofnąć)
form_password:
- # description: "You can change your password here. Your new password should by at least 8 characters long."
+ description: "Tutaj możesz zmienić swoje hasło. Twoje nowe hasło powinno mieć conajmniej 8 znaków."
old_password_label: 'Stare hasło'
new_password_label: 'Nowe hasło'
repeat_new_password_label: 'Powtórz nowe hasło'
archived: 'Zarchiwizowane wpisy'
filtered: 'Odfiltrowane wpisy'
filtered_tags: 'Filtrowane po tagach:'
- # filtered_search: 'Filtered by search:'
+ filtered_search: 'Filtrowanie po wyszukiwaniu:'
untagged: 'Odtaguj wpisy'
list:
number_on_the_page: '{0} Nie ma wpisów.|{1} Jest jeden wpis.|]1,Inf[ Są %count% wpisy.'
preview_picture_label: 'Posiada podgląd obrazu'
preview_picture_help: 'Podgląd obrazu'
language_label: 'Język'
- # http_status_label: 'HTTP status'
+ http_status_label: 'Status HTTP'
reading_time:
label: 'Czas czytania w minutach'
from: 'od'
form_new:
url_label: Url
search:
- # placeholder: 'What are you looking for?'
+ placeholder: 'Czego szukasz?'
edit:
page_title: 'Edytuj wpis'
title_label: 'Tytuł'
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
<channel>
<title>wallabag — {{type}} feed</title>
- <link>{{ url('unread') }}</link>
+ <link>{{ url(type) }}</link>
+ <link rel="self" href="{{ app.request.uri }}"/>
+ {% if entries.hasPreviousPage -%}
+ <link rel="previous" href="{{ url }}?page={{ entries.previousPage }}"/>
+ {% endif -%}
+ {% if entries.hasNextPage -%}
+ <link rel="next" href="{{ url }}?page={{ entries.nextPage }}"/>
+ {% endif -%}
+ <link rel="last" href="{{ url }}?page={{ entries.nbPages }}"/>
<pubDate>{{ "now"|date('D, d M Y H:i:s') }}</pubDate>
<generator>wallabag</generator>
<description>wallabag {{type}} elements</description>
<li class="col l4 m6 s12">
<div class="card teal darken-1">
<div class="card-content white-text">
- <span class="card-title">{{ 'quickstart.configure.title'|trans }}</span>
+ <span class="card-title white-text">{{ 'quickstart.configure.title'|trans }}</span>
<p>{{ 'quickstart.configure.description'|trans }}</p>
</div>
<div class="card-action">
<li class="col l4 m6 s12">
<div class="card green darken-1">
<div class="card-content white-text">
- <span class="card-title">{{ 'quickstart.first_steps.title'|trans }}</span>
+ <span class="card-title white-text">{{ 'quickstart.first_steps.title'|trans }}</span>
<p>{{ 'quickstart.first_steps.description'|trans }}</p>
</div>
<div class="card-action">
<li class="col l4 m6 s12">
<div class="card light-green darken-1">
<div class="card-content white-text">
- <span class="card-title">{{ 'quickstart.migrate.title'|trans }}</span>
+ <span class="card-title white-text">{{ 'quickstart.migrate.title'|trans }}</span>
<p>{{ 'quickstart.migrate.description'|trans }}</p>
</div>
<div class="card-action">
<li class="col l4 m6 s12">
<div class="card blue darken-1">
<div class="card-content white-text">
- <span class="card-title">{{ 'quickstart.developer.title'|trans }}</span>
+ <span class="card-title white-text">{{ 'quickstart.developer.title'|trans }}</span>
<p>{{ 'quickstart.developer.description'|trans }}</p>
</div>
<div class="card-action">
<li class="col l4 m6 s12">
<div class="card light-blue darken-1">
<div class="card-content white-text">
- <span class="card-title">{{ 'quickstart.docs.title'|trans }}</span>
+ <span class="card-title white-text">{{ 'quickstart.docs.title'|trans }}</span>
<p>{{ 'quickstart.docs.description'|trans }}</p>
</div>
<div class="card-action">
<li class="col l4 m6 s12">
<div class="card cyan darken-1">
<div class="card-content white-text">
- <span class="card-title">{{ 'quickstart.support.title'|trans }}</span>
+ <span class="card-title white-text">{{ 'quickstart.support.title'|trans }}</span>
<p>{{ 'quickstart.support.description'|trans }}</p>
</div>
<div class="card-action">
$this->assertEquals(403, $this->client->getResponse()->getStatusCode());
}
+
+ public function testReloadEntryErrorWhileFetching()
+ {
+ $entry = $this->client->getContainer()->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:Entry')
+ ->findByUrlAndUserId('http://0.0.0.0/entry4', 1);
+
+ if (!$entry) {
+ $this->markTestSkipped('No content found in db.');
+ }
+
+ $this->client->request('PATCH', '/api/entries/'.$entry->getId().'/reload.json');
+ $this->assertEquals(400, $this->client->getResponse()->getStatusCode());
+
+ $this->assertContains('Error while trying to extract content', $this->client->getResponse()->getContent());
+
+ $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type'));
+ }
+
+ public function testReloadEntry()
+ {
+ $this->client->request('POST', '/api/entries.json', [
+ 'url' => 'http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html',
+ 'archive' => '1',
+ 'tags' => 'google, apple',
+ ]);
+
+ $json = json_decode($this->client->getResponse()->getContent(), true);
+
+ $this->setUp();
+
+ $this->client->request('PATCH', '/api/entries/'.$json['id'].'/reload.json');
+ $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
+
+ $content = json_decode($this->client->getResponse()->getContent(), true);
+
+ $this->assertNotEmpty($content['title']);
+
+ $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type'));
+ }
}
class RssControllerTest extends WallabagCoreTestCase
{
- public function validateDom($xml, $nb = null)
+ public function validateDom($xml, $type, $nb = null)
{
$doc = new \DOMDocument();
$doc->loadXML($xml);
$this->assertEquals(1, $xpath->query('/rss')->length);
$this->assertEquals(1, $xpath->query('/rss/channel')->length);
+ $this->assertEquals(1, $xpath->query('/rss/channel/title')->length);
+ $this->assertEquals('wallabag — '.$type.' feed', $xpath->query('/rss/channel/title')->item(0)->nodeValue);
+
+ $this->assertEquals(1, $xpath->query('/rss/channel/pubDate')->length);
+
+ $this->assertEquals(1, $xpath->query('/rss/channel/generator')->length);
+ $this->assertEquals('wallabag', $xpath->query('/rss/channel/generator')->item(0)->nodeValue);
+
+ $this->assertEquals(1, $xpath->query('/rss/channel/description')->length);
+ $this->assertEquals('wallabag '.$type.' elements', $xpath->query('/rss/channel/description')->item(0)->nodeValue);
+
+ $this->assertEquals(1, $xpath->query('/rss/channel/link[@rel="self"]')->length);
+ $this->assertContains($type.'.xml', $xpath->query('/rss/channel/link[@rel="self"]')->item(0)->getAttribute('href'));
+
+ $this->assertEquals(1, $xpath->query('/rss/channel/link[@rel="last"]')->length);
+ $this->assertContains($type.'.xml?page=', $xpath->query('/rss/channel/link[@rel="last"]')->item(0)->getAttribute('href'));
+
foreach ($xpath->query('//item') as $item) {
$this->assertEquals(1, $xpath->query('title', $item)->length);
$this->assertEquals(1, $xpath->query('source', $item)->length);
$this->assertEquals(200, $client->getResponse()->getStatusCode());
- $this->validateDom($client->getResponse()->getContent(), 2);
+ $this->validateDom($client->getResponse()->getContent(), 'unread', 2);
}
public function testStarred()
$this->assertEquals(200, $client->getResponse()->getStatusCode(), 1);
- $this->validateDom($client->getResponse()->getContent());
+ $this->validateDom($client->getResponse()->getContent(), 'starred');
}
public function testArchives()
$this->assertEquals(200, $client->getResponse()->getStatusCode());
- $this->validateDom($client->getResponse()->getContent());
+ $this->validateDom($client->getResponse()->getContent(), 'archive');
+ }
+
+ public function testPagination()
+ {
+ $client = $this->getClient();
+ $em = $client->getContainer()->get('doctrine.orm.entity_manager');
+ $user = $em
+ ->getRepository('WallabagUserBundle:User')
+ ->findOneByUsername('admin');
+
+ $config = $user->getConfig();
+ $config->setRssToken('SUPERTOKEN');
+ $config->setRssLimit(1);
+ $em->persist($config);
+ $em->flush();
+
+ $client = $this->getClient();
+
+ $client->request('GET', '/admin/SUPERTOKEN/unread.xml');
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+ $this->validateDom($client->getResponse()->getContent(), 'unread');
+
+ $client->request('GET', '/admin/SUPERTOKEN/unread.xml?page=2');
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+ $this->validateDom($client->getResponse()->getContent(), 'unread');
+
+ $client->request('GET', '/admin/SUPERTOKEN/unread.xml?page=3000');
+ $this->assertEquals(302, $client->getResponse()->getStatusCode());
}
}