From 0c83fd5994861efa728097dd151c994796c39ae1 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sat, 28 Mar 2015 14:27:45 +0100 Subject: Add rss for entries will fix #1000 --- src/Wallabag/CoreBundle/Command/InstallCommand.php | 1 + .../CoreBundle/Controller/ConfigController.php | 58 ++++++++- .../CoreBundle/Controller/RssController.php | 84 +++++++++++++ src/Wallabag/CoreBundle/Entity/Config.php | 74 +++++++++-- src/Wallabag/CoreBundle/Entity/User.php | 2 +- src/Wallabag/CoreBundle/Form/Type/RssType.php | 29 +++++ .../ParamConverter/UsernameRssTokenConverter.php | 92 ++++++++++++++ .../CoreBundle/Repository/UserRepository.php | 26 ++++ .../CoreBundle/Resources/config/services.yml | 7 ++ .../Resources/views/Config/index.html.twig | 136 +++++++++++++-------- .../Resources/views/Entry/entries.xml.twig | 34 ++++++ src/Wallabag/CoreBundle/Tools/Utils.php | 27 ++++ 12 files changed, 509 insertions(+), 61 deletions(-) create mode 100644 src/Wallabag/CoreBundle/Controller/RssController.php create mode 100644 src/Wallabag/CoreBundle/Form/Type/RssType.php create mode 100644 src/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverter.php create mode 100644 src/Wallabag/CoreBundle/Repository/UserRepository.php create mode 100644 src/Wallabag/CoreBundle/Resources/views/Entry/entries.xml.twig create mode 100644 src/Wallabag/CoreBundle/Tools/Utils.php (limited to 'src/Wallabag') diff --git a/src/Wallabag/CoreBundle/Command/InstallCommand.php b/src/Wallabag/CoreBundle/Command/InstallCommand.php index ac7583ea..bba2607d 100644 --- a/src/Wallabag/CoreBundle/Command/InstallCommand.php +++ b/src/Wallabag/CoreBundle/Command/InstallCommand.php @@ -198,6 +198,7 @@ class InstallCommand extends ContainerAwareCommand $config = new Config($user); $config->setTheme($this->getContainer()->getParameter('theme')); $config->setItemsPerPage($this->getContainer()->getParameter('items_on_page')); + $config->setRssLimit($this->getContainer()->getParameter('rss_limit')); $config->setLanguage($this->getContainer()->getParameter('language')); $em->persist($config); diff --git a/src/Wallabag/CoreBundle/Controller/ConfigController.php b/src/Wallabag/CoreBundle/Controller/ConfigController.php index 4e895875..1622f348 100644 --- a/src/Wallabag/CoreBundle/Controller/ConfigController.php +++ b/src/Wallabag/CoreBundle/Controller/ConfigController.php @@ -5,11 +5,14 @@ namespace Wallabag\CoreBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\JsonResponse; use Wallabag\CoreBundle\Entity\Config; use Wallabag\CoreBundle\Entity\User; use Wallabag\CoreBundle\Form\Type\ChangePasswordType; use Wallabag\CoreBundle\Form\Type\UserType; use Wallabag\CoreBundle\Form\Type\NewUserType; +use Wallabag\CoreBundle\Form\Type\RssType; +use Wallabag\CoreBundle\Tools\Utils; class ConfigController extends Controller { @@ -77,6 +80,22 @@ class ConfigController extends Controller return $this->redirect($this->generateUrl('config')); } + // handle rss information + $rssForm = $this->createForm(new RssType(), $config); + $rssForm->handleRequest($request); + + if ($rssForm->isValid()) { + $em->persist($config); + $em->flush(); + + $this->get('session')->getFlashBag()->add( + 'notice', + 'RSS information updated' + ); + + return $this->redirect($this->generateUrl('config')); + } + // handle adding new user $newUser = new User(); $newUserForm = $this->createForm(new NewUserType(), $newUser); @@ -88,6 +107,7 @@ class ConfigController extends Controller $config = new Config($newUser); $config->setTheme($this->container->getParameter('theme')); $config->setItemsPerPage($this->container->getParameter('items_on_page')); + $config->setRssLimit($this->getContainer()->getParameter('rss_limit')); $config->setLanguage($this->container->getParameter('language')); $em->persist($config); @@ -103,13 +123,43 @@ class ConfigController extends Controller } return $this->render('WallabagCoreBundle:Config:index.html.twig', array( - 'configForm' => $configForm->createView(), - 'pwdForm' => $pwdForm->createView(), - 'userForm' => $userForm->createView(), - 'newUserForm' => $newUserForm->createView(), + 'form' => array( + 'config' => $configForm->createView(), + 'rss' => $rssForm->createView(), + 'pwd' => $pwdForm->createView(), + 'user' => $userForm->createView(), + 'new_user' => $newUserForm->createView(), + ), + 'rss' => array( + 'username' => $user->getUsername(), + 'token' => $config->getRssToken(), + ) )); } + /** + * @param Request $request + * + * @Route("/generate-token", name="generate_token") + * + * @return JsonResponse + */ + public function generateTokenAction(Request $request) + { + $config = $this->getConfig(); + $config->setRssToken(Utils::generateToken()); + + $em = $this->getDoctrine()->getManager(); + $em->persist($config); + $em->flush(); + + if ($request->isXmlHttpRequest()) { + return new JsonResponse(array('token' => $config->getRssToken())); + } + + return $request->headers->get('referer') ? $this->redirect($request->headers->get('referer')) : $this->redirectToRoute('config'); + } + /** * Retrieve config for the current user. * If no config were found, create a new one. diff --git a/src/Wallabag/CoreBundle/Controller/RssController.php b/src/Wallabag/CoreBundle/Controller/RssController.php new file mode 100644 index 00000000..f2f8dd65 --- /dev/null +++ b/src/Wallabag/CoreBundle/Controller/RssController.php @@ -0,0 +1,84 @@ +getDoctrine() + ->getRepository('WallabagCoreBundle:Entry') + ->findUnreadByUser( + $user->getId(), + 0, + $user->getConfig()->getRssLimit() ?: $this->getContainer()->getParameter('rss_limit') + ); + + return $this->render('WallabagCoreBundle:Entry:entries.xml.twig', array( + 'type' => 'unread', + 'entries' => $entries, + )); + } + + /** + * Shows read entries for current user + * + * @Route("/{username}/{token}/archive.xml", name="archive_rss") + * @ParamConverter("user", class="WallabagCoreBundle:User", converter="username_rsstoken_converter") + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function showArchiveAction(User $user) + { + $entries = $this->getDoctrine() + ->getRepository('WallabagCoreBundle:Entry') + ->findArchiveByUser( + $user->getId(), + 0, + $user->getConfig()->getRssLimit() ?: $this->getContainer()->getParameter('rss_limit') + ); + + return $this->render('WallabagCoreBundle:Entry:entries.xml.twig', array( + 'type' => 'archive', + 'entries' => $entries, + )); + } + + /** + * Shows starred entries for current user + * + * @Route("/{username}/{token}/starred.xml", name="starred_rss") + * @ParamConverter("user", class="WallabagCoreBundle:User", converter="username_rsstoken_converter") + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function showStarredAction(User $user) + { + $entries = $this->getDoctrine() + ->getRepository('WallabagCoreBundle:Entry') + ->findStarredByUser( + $user->getId(), + 0, + $user->getConfig()->getRssLimit() ?: $this->getContainer()->getParameter('rss_limit') + ); + + return $this->render('WallabagCoreBundle:Entry:entries.xml.twig', array( + 'type' => 'starred', + 'entries' => $entries, + )); + } +} diff --git a/src/Wallabag/CoreBundle/Entity/Config.php b/src/Wallabag/CoreBundle/Entity/Config.php index 91f9bfe8..56eff30c 100644 --- a/src/Wallabag/CoreBundle/Entity/Config.php +++ b/src/Wallabag/CoreBundle/Entity/Config.php @@ -32,12 +32,12 @@ class Config private $theme; /** - * @var string + * @var integer * * @Assert\NotBlank() * @ORM\Column(name="items_per_page", type="integer", nullable=false) */ - private $items_per_page; + private $itemsPerPage; /** * @var string @@ -47,6 +47,20 @@ class Config */ private $language; + /** + * @var string + * + * @ORM\Column(name="rss_token", type="string", nullable=true) + */ + private $rssToken; + + /** + * @var integer + * + * @ORM\Column(name="rss_limit", type="integer", nullable=true) + */ + private $rssLimit; + /** * @ORM\OneToOne(targetEntity="User", inversedBy="config") */ @@ -58,8 +72,6 @@ class Config public function __construct(User $user) { $this->user = $user; - $this->items_per_page = 12; - $this->language = 'en_US'; } /** @@ -96,26 +108,26 @@ class Config } /** - * Set items_per_page + * Set itemsPerPage * * @param integer $itemsPerPage * @return Config */ public function setItemsPerPage($itemsPerPage) { - $this->items_per_page = $itemsPerPage; + $this->itemsPerPage = $itemsPerPage; return $this; } /** - * Get items_per_page + * Get itemsPerPage * * @return integer */ public function getItemsPerPage() { - return $this->items_per_page; + return $this->itemsPerPage; } /** @@ -163,4 +175,50 @@ class Config { return $this->user; } + + /** + * Set rssToken + * + * @param string $rssToken + * @return Config + */ + public function setRssToken($rssToken) + { + $this->rssToken = $rssToken; + + return $this; + } + + /** + * Get rssToken + * + * @return string + */ + public function getRssToken() + { + return $this->rssToken; + } + + /** + * Set rssLimit + * + * @param string $rssLimit + * @return Config + */ + public function setRssLimit($rssLimit) + { + $this->rssLimit = $rssLimit; + + return $this; + } + + /** + * Get rssLimit + * + * @return string + */ + public function getRssLimit() + { + return $this->rssLimit; + } } diff --git a/src/Wallabag/CoreBundle/Entity/User.php b/src/Wallabag/CoreBundle/Entity/User.php index 6a7619ac..e75e3a83 100644 --- a/src/Wallabag/CoreBundle/Entity/User.php +++ b/src/Wallabag/CoreBundle/Entity/User.php @@ -14,7 +14,7 @@ use JMS\Serializer\Annotation\Expose; * User * * @ORM\Table(name="user") - * @ORM\Entity + * @ORM\Entity(repositoryClass="Wallabag\CoreBundle\Repository\UserRepository") * @ORM\HasLifecycleCallbacks() * @ExclusionPolicy("all") */ diff --git a/src/Wallabag/CoreBundle/Form/Type/RssType.php b/src/Wallabag/CoreBundle/Form/Type/RssType.php new file mode 100644 index 00000000..5edb38ba --- /dev/null +++ b/src/Wallabag/CoreBundle/Form/Type/RssType.php @@ -0,0 +1,29 @@ +add('rss_limit', 'text') + ->add('save', 'submit') + ; + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'Wallabag\CoreBundle\Entity\Config', + )); + } + + public function getName() + { + return 'rss_config'; + } +} diff --git a/src/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverter.php b/src/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverter.php new file mode 100644 index 00000000..ea2bda17 --- /dev/null +++ b/src/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverter.php @@ -0,0 +1,92 @@ +registry = $registry; + } + + /** + * {@inheritdoc} + * + * Check, if object supported by our converter + */ + public function supports(ParamConverter $configuration) + { + // If there is no manager, this means that only Doctrine DBAL is configured + // In this case we can do nothing and just return + if (null === $this->registry || !count($this->registry->getManagers())) { + return false; + } + + // Check, if option class was set in configuration + if (null === $configuration->getClass()) { + return false; + } + + // Get actual entity manager for class + $em = $this->registry->getManagerForClass($configuration->getClass()); + + // Check, if class name is what we need + if ('Wallabag\CoreBundle\Entity\User' !== $em->getClassMetadata($configuration->getClass())->getName()) { + return false; + } + + return true; + } + + /** + * {@inheritdoc} + * + * Applies converting + * + * @throws \InvalidArgumentException When route attributes are missing + * @throws NotFoundHttpException When object not found + */ + public function apply(Request $request, ParamConverter $configuration) + { + $username = $request->attributes->get('username'); + $rssToken = $request->attributes->get('token'); + + // Check, if route attributes exists + if (null === $username || null === $rssToken) { + throw new \InvalidArgumentException('Route attribute is missing'); + } + + // Get actual entity manager for class + $em = $this->registry->getManagerForClass($configuration->getClass()); + + $userRepository = $em->getRepository($configuration->getClass()); + + // Try to find user by its username and config rss_token + $user = $userRepository->findOneByUsernameAndRsstoken($username, $rssToken); + + if (null === $user || !($user instanceof User)) { + throw new NotFoundHttpException(sprintf('%s not found.', $configuration->getClass())); + } + + // Map found user to the route's parameter + $request->attributes->set($configuration->getName(), $user); + } +} diff --git a/src/Wallabag/CoreBundle/Repository/UserRepository.php b/src/Wallabag/CoreBundle/Repository/UserRepository.php new file mode 100644 index 00000000..aab3dedc --- /dev/null +++ b/src/Wallabag/CoreBundle/Repository/UserRepository.php @@ -0,0 +1,26 @@ +createQueryBuilder('u') + ->leftJoin('u.config', 'c') + ->where('c.rssToken = :rss_token')->setParameter('rss_token', $rssToken) + ->andWhere('u.username = :username')->setParameter('username', $username) + ->getQuery() + ->getOneOrNullResult(); + } +} diff --git a/src/Wallabag/CoreBundle/Resources/config/services.yml b/src/Wallabag/CoreBundle/Resources/config/services.yml index 062e1651..0f4db94e 100644 --- a/src/Wallabag/CoreBundle/Resources/config/services.yml +++ b/src/Wallabag/CoreBundle/Resources/config/services.yml @@ -36,3 +36,10 @@ services: - @doctrine tags: - { name: form.type, alias: forgot_password } + + wallabag_core.param_converter.username_rsstoken_converter: + class: Wallabag\CoreBundle\ParamConverter\UsernameRssTokenConverter + tags: + - { name: request.param_converter, converter: username_rsstoken_converter } + arguments: + - @doctrine diff --git a/src/Wallabag/CoreBundle/Resources/views/Config/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/Config/index.html.twig index 1835d26e..b134b6ca 100644 --- a/src/Wallabag/CoreBundle/Resources/views/Config/index.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/Config/index.html.twig @@ -5,129 +5,169 @@ {% block content %}

{% trans %}Wallabag configuration{% endtrans %}

-
- {{ form_errors(configForm) }} + + {{ form_errors(form.config) }}
- {{ form_label(configForm.theme) }} - {{ form_errors(configForm.theme) }} - {{ form_widget(configForm.theme) }} + {{ form_label(form.config.theme) }} + {{ form_errors(form.config.theme) }} + {{ form_widget(form.config.theme) }}
- {{ form_label(configForm.items_per_page) }} - {{ form_errors(configForm.items_per_page) }} - {{ form_widget(configForm.items_per_page) }} + {{ form_label(form.config.items_per_page) }} + {{ form_errors(form.config.items_per_page) }} + {{ form_widget(form.config.items_per_page) }}
- {{ form_label(configForm.language) }} - {{ form_errors(configForm.language) }} - {{ form_widget(configForm.language) }} + {{ form_label(form.config.language) }} + {{ form_errors(form.config.language) }} + {{ form_widget(form.config.language) }}
- {{ form_rest(configForm) }} + {{ form_rest(form.config) }} +
+ +

{% trans %}RSS configuration{% endtrans %}

+ +
+ {{ form_errors(form.rss) }} + +
+
+ + {% if rss.token %} + {{ rss.token }} + {% else %} + No token + {% endif %} + – + Regenerate ? +
+
+ +
+
+ + +
+
+ +
+
+ {{ form_label(form.rss.rss_limit) }} + {{ form_errors(form.rss.rss_limit) }} + {{ form_widget(form.rss.rss_limit) }} +
+
+ + {{ form_rest(form.rss) }}

{% trans %}User information{% endtrans %}

-
- {{ form_errors(userForm) }} + + {{ form_errors(form.user) }}
- {{ form_label(userForm.username) }} - {{ form_errors(userForm.username) }} - {{ form_widget(userForm.username) }} + {{ form_label(form.user.username) }} + {{ form_errors(form.user.username) }} + {{ form_widget(form.user.username) }}
- {{ form_label(userForm.name) }} - {{ form_errors(userForm.name) }} - {{ form_widget(userForm.name) }} + {{ form_label(form.user.name) }} + {{ form_errors(form.user.name) }} + {{ form_widget(form.user.name) }}
- {{ form_label(userForm.email) }} - {{ form_errors(userForm.email) }} - {{ form_widget(userForm.email) }} + {{ form_label(form.user.email) }} + {{ form_errors(form.user.email) }} + {{ form_widget(form.user.email) }}
- {{ form_rest(userForm) }} + {{ form_rest(form.user) }}

{% trans %}Change your password{% endtrans %}

-
- {{ form_errors(pwdForm) }} + + {{ form_errors(form.pwd) }}
- {{ form_label(pwdForm.old_password) }} - {{ form_errors(pwdForm.old_password) }} - {{ form_widget(pwdForm.old_password) }} + {{ form_label(form.pwd.old_password) }} + {{ form_errors(form.pwd.old_password) }} + {{ form_widget(form.pwd.old_password) }}
- {{ form_label(pwdForm.new_password.first) }} - {{ form_errors(pwdForm.new_password.first) }} - {{ form_widget(pwdForm.new_password.first) }} + {{ form_label(form.pwd.new_password.first) }} + {{ form_errors(form.pwd.new_password.first) }} + {{ form_widget(form.pwd.new_password.first) }}
- {{ form_label(pwdForm.new_password.second) }} - {{ form_errors(pwdForm.new_password.second) }} - {{ form_widget(pwdForm.new_password.second) }} + {{ form_label(form.pwd.new_password.second) }} + {{ form_errors(form.pwd.new_password.second) }} + {{ form_widget(form.pwd.new_password.second) }}
- {{ form_rest(pwdForm) }} + {{ form_rest(form.pwd) }}

{% trans %}Add a user{% endtrans %}

-
- {{ form_errors(newUserForm) }} + + {{ form_errors(form.new_user) }}
- {{ form_label(newUserForm.username) }} - {{ form_errors(newUserForm.username) }} - {{ form_widget(newUserForm.username) }} + {{ form_label(form.new_user.username) }} + {{ form_errors(form.new_user.username) }} + {{ form_widget(form.new_user.username) }}
- {{ form_label(newUserForm.password) }} - {{ form_errors(newUserForm.password) }} - {{ form_widget(newUserForm.password) }} + {{ form_label(form.new_user.password) }} + {{ form_errors(form.new_user.password) }} + {{ form_widget(form.new_user.password) }}
- {{ form_label(newUserForm.email) }} - {{ form_errors(newUserForm.email) }} - {{ form_widget(newUserForm.email) }} + {{ form_label(form.new_user.email) }} + {{ form_errors(form.new_user.email) }} + {{ form_widget(form.new_user.email) }}
- {{ form_rest(newUserForm) }} + {{ form_rest(form.new_user) }}
{% endblock %} diff --git a/src/Wallabag/CoreBundle/Resources/views/Entry/entries.xml.twig b/src/Wallabag/CoreBundle/Resources/views/Entry/entries.xml.twig new file mode 100644 index 00000000..6eebc80d --- /dev/null +++ b/src/Wallabag/CoreBundle/Resources/views/Entry/entries.xml.twig @@ -0,0 +1,34 @@ + + + + wallabag — {{type}} feed + {{ url('unread') }} + {{ "now"|date('D, d M Y H:i:s') }} + wallabag + wallabag {{type}} elements + + {% for entry in entries %} + + + <![CDATA[{{ entry.title }}]]> + wallabag + {{ url('view', { 'id': entry.id }) }} + {{ url('view', { 'id': entry.id }) }} + {{ entry.createdAt|date('D, d M Y H:i:s') }} + + 0 %} + {% trans %}estimated reading time :{% endtrans %} {{ entry.content| readingTime }} min + {% else -%} + {% trans %}estimated reading time :{% endtrans %} < 1 min + {% endif -%} + + {{ entry.content -}} + ]]> + + + + {% endfor %} + + + diff --git a/src/Wallabag/CoreBundle/Tools/Utils.php b/src/Wallabag/CoreBundle/Tools/Utils.php new file mode 100644 index 00000000..de97c796 --- /dev/null +++ b/src/Wallabag/CoreBundle/Tools/Utils.php @@ -0,0 +1,27 @@ + Date: Sat, 28 Mar 2015 14:28:24 +0100 Subject: Sort by id is faster Since it's the primary key --- src/Wallabag/CoreBundle/Repository/EntryRepository.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/Wallabag') diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php index 53e8e2ba..a8c138a9 100644 --- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php +++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php @@ -26,7 +26,7 @@ class EntryRepository extends EntityRepository ->leftJoin('e.user', 'u') ->where('e.isArchived = false') ->andWhere('u.id =:userId')->setParameter('userId', $userId) - ->orderBy('e.createdAt', 'desc') + ->orderBy('e.id', 'desc') ->getQuery(); $paginator = new Paginator($qb); @@ -52,7 +52,7 @@ class EntryRepository extends EntityRepository ->leftJoin('e.user', 'u') ->where('e.isArchived = true') ->andWhere('u.id =:userId')->setParameter('userId', $userId) - ->orderBy('e.createdAt', 'desc') + ->orderBy('e.id', 'desc') ->getQuery(); $paginator = new Paginator($qb); @@ -78,7 +78,7 @@ class EntryRepository extends EntityRepository ->leftJoin('e.user', 'u') ->where('e.isStarred = true') ->andWhere('u.id =:userId')->setParameter('userId', $userId) - ->orderBy('e.createdAt', 'desc') + ->orderBy('e.id', 'desc') ->getQuery(); $paginator = new Paginator($qb); @@ -111,7 +111,7 @@ class EntryRepository extends EntityRepository } if ('created' === $sort) { - $qb->orderBy('e.createdAt', $order); + $qb->orderBy('e.id', $order); } elseif ('updated' === $sort) { $qb->orderBy('e.updatedAt', $order); } -- cgit v1.2.3 From 371ac69a6bd6325929e4efee7958682a6b1666f7 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sat, 28 Mar 2015 21:43:49 +0100 Subject: Add tests and fix few mistakes --- .../CoreBundle/Controller/ConfigController.php | 2 +- .../CoreBundle/Controller/RssController.php | 6 +- .../CoreBundle/DataFixtures/ORM/LoadEntryData.php | 20 ++ src/Wallabag/CoreBundle/Entity/Config.php | 10 + src/Wallabag/CoreBundle/Form/Type/ConfigType.php | 2 +- src/Wallabag/CoreBundle/Form/Type/RssType.php | 2 +- .../Resources/views/Config/index.html.twig | 14 +- .../Resources/views/Entry/entries.xml.twig | 6 +- .../views/themes/baggy/public/css/main.css | 24 +-- .../Tests/Controller/ConfigControllerTest.php | 126 ++++++++++++ .../Tests/Controller/RssControllerTest.php | 126 ++++++++++++ .../UsernameRssTokenConverterTest.php | 220 +++++++++++++++++++++ 12 files changed, 532 insertions(+), 26 deletions(-) create mode 100644 src/Wallabag/CoreBundle/Tests/Controller/RssControllerTest.php create mode 100644 src/Wallabag/CoreBundle/Tests/ParamConverter/UsernameRssTokenConverterTest.php (limited to 'src/Wallabag') diff --git a/src/Wallabag/CoreBundle/Controller/ConfigController.php b/src/Wallabag/CoreBundle/Controller/ConfigController.php index 1622f348..dbae3ea7 100644 --- a/src/Wallabag/CoreBundle/Controller/ConfigController.php +++ b/src/Wallabag/CoreBundle/Controller/ConfigController.php @@ -107,7 +107,7 @@ class ConfigController extends Controller $config = new Config($newUser); $config->setTheme($this->container->getParameter('theme')); $config->setItemsPerPage($this->container->getParameter('items_on_page')); - $config->setRssLimit($this->getContainer()->getParameter('rss_limit')); + $config->setRssLimit($this->container->getParameter('rss_limit')); $config->setLanguage($this->container->getParameter('language')); $em->persist($config); diff --git a/src/Wallabag/CoreBundle/Controller/RssController.php b/src/Wallabag/CoreBundle/Controller/RssController.php index f2f8dd65..14f1dcb2 100644 --- a/src/Wallabag/CoreBundle/Controller/RssController.php +++ b/src/Wallabag/CoreBundle/Controller/RssController.php @@ -25,7 +25,7 @@ class RssController extends Controller ->findUnreadByUser( $user->getId(), 0, - $user->getConfig()->getRssLimit() ?: $this->getContainer()->getParameter('rss_limit') + $user->getConfig()->getRssLimit() ?: $this->container->getParameter('rss_limit') ); return $this->render('WallabagCoreBundle:Entry:entries.xml.twig', array( @@ -49,7 +49,7 @@ class RssController extends Controller ->findArchiveByUser( $user->getId(), 0, - $user->getConfig()->getRssLimit() ?: $this->getContainer()->getParameter('rss_limit') + $user->getConfig()->getRssLimit() ?: $this->container->getParameter('rss_limit') ); return $this->render('WallabagCoreBundle:Entry:entries.xml.twig', array( @@ -73,7 +73,7 @@ class RssController extends Controller ->findStarredByUser( $user->getId(), 0, - $user->getConfig()->getRssLimit() ?: $this->getContainer()->getParameter('rss_limit') + $user->getConfig()->getRssLimit() ?: $this->container->getParameter('rss_limit') ); return $this->render('WallabagCoreBundle:Entry:entries.xml.twig', array( diff --git a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadEntryData.php b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadEntryData.php index ce12ec5d..54d0d6b6 100644 --- a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadEntryData.php +++ b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadEntryData.php @@ -67,6 +67,26 @@ class LoadEntryData extends AbstractFixture implements OrderedFixtureInterface $this->addReference('entry4', $entry4); + $entry5 = new Entry($this->getReference('admin-user')); + $entry5->setUrl('http://0.0.0.0'); + $entry5->setTitle('test title entry5'); + $entry5->setContent('This is my content /o/'); + $entry5->setStarred(true); + + $manager->persist($entry5); + + $this->addReference('entry5', $entry5); + + $entry6 = new Entry($this->getReference('admin-user')); + $entry6->setUrl('http://0.0.0.0'); + $entry6->setTitle('test title entry6'); + $entry6->setContent('This is my content /o/'); + $entry6->setArchived(true); + + $manager->persist($entry6); + + $this->addReference('entry6', $entry6); + $manager->flush(); } diff --git a/src/Wallabag/CoreBundle/Entity/Config.php b/src/Wallabag/CoreBundle/Entity/Config.php index 56eff30c..9f079656 100644 --- a/src/Wallabag/CoreBundle/Entity/Config.php +++ b/src/Wallabag/CoreBundle/Entity/Config.php @@ -35,6 +35,11 @@ class Config * @var integer * * @Assert\NotBlank() + * @Assert\Range( + * min = 1, + * max = 100000, + * maxMessage = "This will certainly kill the app" + * ) * @ORM\Column(name="items_per_page", type="integer", nullable=false) */ private $itemsPerPage; @@ -58,6 +63,11 @@ class Config * @var integer * * @ORM\Column(name="rss_limit", type="integer", nullable=true) + * @Assert\Range( + * min = 1, + * max = 100000, + * maxMessage = "This will certainly kill the app" + * ) */ private $rssLimit; diff --git a/src/Wallabag/CoreBundle/Form/Type/ConfigType.php b/src/Wallabag/CoreBundle/Form/Type/ConfigType.php index 0c8706e2..0fcf020a 100644 --- a/src/Wallabag/CoreBundle/Form/Type/ConfigType.php +++ b/src/Wallabag/CoreBundle/Form/Type/ConfigType.php @@ -24,7 +24,7 @@ class ConfigType extends AbstractType { $builder ->add('theme', 'choice', array('choices' => $this->themes)) - ->add('items_per_page', 'text') + ->add('items_per_page') ->add('language') ->add('save', 'submit') ; diff --git a/src/Wallabag/CoreBundle/Form/Type/RssType.php b/src/Wallabag/CoreBundle/Form/Type/RssType.php index 5edb38ba..a1ab990f 100644 --- a/src/Wallabag/CoreBundle/Form/Type/RssType.php +++ b/src/Wallabag/CoreBundle/Form/Type/RssType.php @@ -10,7 +10,7 @@ class RssType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options) { $builder - ->add('rss_limit', 'text') + ->add('rss_limit') ->add('save', 'submit') ; } diff --git a/src/Wallabag/CoreBundle/Resources/views/Config/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/Config/index.html.twig index b134b6ca..f2a98dfb 100644 --- a/src/Wallabag/CoreBundle/Resources/views/Config/index.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/Config/index.html.twig @@ -56,11 +56,15 @@
- + {% if rss.token %} + + {% else %} + You need to generate a token first. + {% endif %}
diff --git a/src/Wallabag/CoreBundle/Resources/views/Entry/entries.xml.twig b/src/Wallabag/CoreBundle/Resources/views/Entry/entries.xml.twig index 6eebc80d..f1039f5d 100644 --- a/src/Wallabag/CoreBundle/Resources/views/Entry/entries.xml.twig +++ b/src/Wallabag/CoreBundle/Resources/views/Entry/entries.xml.twig @@ -17,11 +17,11 @@ {{ entry.createdAt|date('D, d M Y H:i:s') }} 0 %} + {%- if entry.content| readingTime > 0 -%} {% trans %}estimated reading time :{% endtrans %} {{ entry.content| readingTime }} min - {% else -%} + {%- else -%} {% trans %}estimated reading time :{% endtrans %} < 1 min - {% endif -%} + {%- endif %} {{ entry.content -}} ]]> diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/css/main.css b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/css/main.css index 1df82910..ff1a36a1 100755 --- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/css/main.css +++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/css/main.css @@ -7,7 +7,7 @@ 4 = Messages 5 = Article 6 = Media queries - + ========================================================================== */ html { @@ -42,17 +42,17 @@ body { position: absolute; top: 2em; left: 50%; - margin-left: -55px; + margin-left: -55px; } /* ========================================================================== 1 = Style Guide ========================================================================== */ -::selection { - color: #FFF; +::selection { + color: #FFF; background-color: #000; -} +} .desktopHide { display: none; @@ -62,7 +62,7 @@ body { position: fixed; z-index: 20; top: 0.4em; - left: 0.6em; + left: 0.6em; } h2, h3, h4 { @@ -89,7 +89,7 @@ form fieldset { margin: 0; } -form input[type="text"], select, form input[type="password"], form input[type="url"], form input[type="email"] { +form input[type="text"], form input[type="number"], select, form input[type="password"], form input[type="url"], form input[type="email"] { border: 1px solid #999; padding: 0.5em 1em; min-width: 12em; @@ -149,7 +149,7 @@ form button, input[type="submit"] { #bookmarklet { cursor: move; -} +} h2:after { content: ""; @@ -296,7 +296,7 @@ h2:after { /* ========================================================================== 2 = Layout ========================================================================== */ - + #content { margin-top: 5em; min-height: 30em; @@ -653,7 +653,7 @@ a.add-to-wallabag-link-after:after { /* ========================================================================== 3 = Pictos ========================================================================== */ - + @font-face { font-family: 'icomoon'; src:url('../fonts/icomoon.eot?-s0mcsx'); @@ -866,7 +866,7 @@ blockquote { color: #FFF; text-decoration: none; } - + #article_toolbar a:hover, #article_toolbar a:focus { background-color: #999; } @@ -1052,7 +1052,7 @@ pre code { #article_toolbar a { padding: 0.3em 0.4em 0.2em; } - + #display-mode { display: none; } diff --git a/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php b/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php index d7d341aa..11c86423 100644 --- a/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php +++ b/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php @@ -28,6 +28,8 @@ class ConfigControllerTest extends WallabagTestCase $this->assertCount(1, $crawler->filter('button[id=config_save]')); $this->assertCount(1, $crawler->filter('button[id=change_passwd_save]')); $this->assertCount(1, $crawler->filter('button[id=user_save]')); + $this->assertCount(1, $crawler->filter('button[id=new_user_save]')); + $this->assertCount(1, $crawler->filter('button[id=rss_config_save]')); } public function testUpdate() @@ -347,4 +349,128 @@ class ConfigControllerTest extends WallabagTestCase $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(array('_text'))); $this->assertContains('User "wallace" added', $alert[0]); } + + public function testRssUpdateResetToken() + { + $this->logInAs('admin'); + $client = $this->getClient(); + + // reset the token + $em = $client->getContainer()->get('doctrine.orm.entity_manager'); + $user = $em + ->getRepository('WallabagCoreBundle:User') + ->findOneByUsername('admin'); + + if (!$user) { + $this->markTestSkipped('No user found in db.'); + } + + $config = $user->getConfig(); + $config->setRssToken(null); + $em->persist($config); + $em->flush(); + + $crawler = $client->request('GET', '/config'); + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + + $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(array('_text'))); + $this->assertContains('You need to generate a token first.', $body[0]); + + $client->request('GET', '/generate-token'); + $this->assertEquals(302, $client->getResponse()->getStatusCode()); + + $crawler = $client->followRedirect(); + + $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(array('_text'))); + $this->assertNotContains('You need to generate a token first.', $body[0]); + } + + public function testGenerateTokenAjax() + { + $this->logInAs('admin'); + $client = $this->getClient(); + + $client->request( + 'GET', + '/generate-token', + array(), + array(), + array('HTTP_X-Requested-With' => 'XMLHttpRequest') + ); + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + $content = json_decode($client->getResponse()->getContent(), true);; + $this->assertArrayHasKey('token', $content); + } + + public function testRssUpdate() + { + $this->logInAs('admin'); + $client = $this->getClient(); + + $crawler = $client->request('GET', '/config'); + + if (500 == $client->getResponse()->getStatusCode()) { + var_export($client->getResponse()->getContent()); + die(); + } + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + + $form = $crawler->filter('button[id=rss_config_save]')->form(); + + $data = array( + 'rss_config[rss_limit]' => 12, + ); + + $client->submit($form, $data); + + $this->assertEquals(302, $client->getResponse()->getStatusCode()); + + $crawler = $client->followRedirect(); + + $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(array('_text'))); + $this->assertContains('RSS information updated', $alert[0]); + } + + public function dataForRssFailed() + { + return array( + array( + array( + 'rss_config[rss_limit]' => 0, + ), + 'This value should be 1 or more.', + ), + array( + array( + 'rss_config[rss_limit]' => 1000000000000, + ), + 'This will certainly kill the app', + ), + ); + } + + /** + * @dataProvider dataForRssFailed + */ + public function testRssFailed($data, $expectedMessage) + { + $this->logInAs('admin'); + $client = $this->getClient(); + + $crawler = $client->request('GET', '/config'); + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + + $form = $crawler->filter('button[id=rss_config_save]')->form(); + + $crawler = $client->submit($form, $data); + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + + $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(array('_text'))); + $this->assertContains($expectedMessage, $alert[0]); + } } diff --git a/src/Wallabag/CoreBundle/Tests/Controller/RssControllerTest.php b/src/Wallabag/CoreBundle/Tests/Controller/RssControllerTest.php new file mode 100644 index 00000000..8f627b4b --- /dev/null +++ b/src/Wallabag/CoreBundle/Tests/Controller/RssControllerTest.php @@ -0,0 +1,126 @@ +loadXML($xml); + + $xpath = new \DOMXpath($doc); + + if (null === $nb) { + $this->assertGreaterThan(0, $xpath->query('//item')->length); + } else { + $this->assertEquals($nb, $xpath->query('//item')->length); + } + + $this->assertEquals(1, $xpath->query('/rss')->length); + $this->assertEquals(1, $xpath->query('/rss/channel')->length); + + foreach ($xpath->query('//item') as $item) { + $this->assertEquals(1, $xpath->query('title', $item)->length); + $this->assertEquals(1, $xpath->query('source', $item)->length); + $this->assertEquals(1, $xpath->query('link', $item)->length); + $this->assertEquals(1, $xpath->query('guid', $item)->length); + $this->assertEquals(1, $xpath->query('pubDate', $item)->length); + $this->assertEquals(1, $xpath->query('description', $item)->length); + } + } + + public function dataForBadUrl() + { + return array( + array( + '/admin/YZIOAUZIAO/unread.xml' + ), + array( + '/wallace/YZIOAUZIAO/starred.xml' + ), + array( + '/wallace/YZIOAUZIAO/archives.xml' + ), + ); + } + + /** + * @dataProvider dataForBadUrl + */ + public function testBadUrl($url) + { + $client = $this->getClient(); + + $client->request('GET', $url); + + $this->assertEquals(404, $client->getResponse()->getStatusCode()); + } + + public function testUnread() + { + $client = $this->getClient(); + $em = $client->getContainer()->get('doctrine.orm.entity_manager'); + $user = $em + ->getRepository('WallabagCoreBundle:User') + ->findOneByUsername('admin'); + + $config = $user->getConfig(); + $config->setRssToken('SUPERTOKEN'); + $config->setRssLimit(2); + $em->persist($config); + $em->flush(); + + $client->request('GET', '/admin/SUPERTOKEN/unread.xml'); + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + + $this->validateDom($client->getResponse()->getContent(), 2); + } + + public function testStarred() + { + $client = $this->getClient(); + $em = $client->getContainer()->get('doctrine.orm.entity_manager'); + $user = $em + ->getRepository('WallabagCoreBundle: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/starred.xml'); + + $this->assertEquals(200, $client->getResponse()->getStatusCode(), 1); + + $this->validateDom($client->getResponse()->getContent()); + } + + public function testArchives() + { + $client = $this->getClient(); + $em = $client->getContainer()->get('doctrine.orm.entity_manager'); + $user = $em + ->getRepository('WallabagCoreBundle:User') + ->findOneByUsername('admin'); + + $config = $user->getConfig(); + $config->setRssToken('SUPERTOKEN'); + $config->setRssLimit(null); + $em->persist($config); + $em->flush(); + + $client = $this->getClient(); + $client->request('GET', '/admin/SUPERTOKEN/archive.xml'); + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + + $this->validateDom($client->getResponse()->getContent()); + } +} diff --git a/src/Wallabag/CoreBundle/Tests/ParamConverter/UsernameRssTokenConverterTest.php b/src/Wallabag/CoreBundle/Tests/ParamConverter/UsernameRssTokenConverterTest.php new file mode 100644 index 00000000..ebb550b5 --- /dev/null +++ b/src/Wallabag/CoreBundle/Tests/ParamConverter/UsernameRssTokenConverterTest.php @@ -0,0 +1,220 @@ +assertFalse($converter->supports($params)); + } + + public function testSupportsWithNoRegistryManagers() + { + $registry = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') + ->disableOriginalConstructor() + ->getMock(); + + $registry->expects($this->once()) + ->method('getManagers') + ->will($this->returnValue(array())); + + $params = new ParamConverter(array()); + $converter = new UsernameRssTokenConverter($registry); + + $this->assertFalse($converter->supports($params)); + } + + public function testSupportsWithNoConfigurationClass() + { + $registry = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') + ->disableOriginalConstructor() + ->getMock(); + + $registry->expects($this->once()) + ->method('getManagers') + ->will($this->returnValue(array('default' => null))); + + $params = new ParamConverter(array()); + $converter = new UsernameRssTokenConverter($registry); + + $this->assertFalse($converter->supports($params)); + } + + public function testSupportsWithNotTheGoodClass() + { + $meta = $this->getMockBuilder('Doctrine\Common\Persistence\Mapping\ClassMetadata') + ->disableOriginalConstructor() + ->getMock(); + + $meta->expects($this->once()) + ->method('getName') + ->will($this->returnValue('nothingrelated')); + + $em = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager') + ->disableOriginalConstructor() + ->getMock(); + + $em->expects($this->once()) + ->method('getClassMetadata') + ->with('superclass') + ->will($this->returnValue($meta)); + + $registry = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') + ->disableOriginalConstructor() + ->getMock(); + + $registry->expects($this->once()) + ->method('getManagers') + ->will($this->returnValue(array('default' => null))); + + $registry->expects($this->once()) + ->method('getManagerForClass') + ->with('superclass') + ->will($this->returnValue($em)); + + $params = new ParamConverter(array('class' => 'superclass')); + $converter = new UsernameRssTokenConverter($registry); + + $this->assertFalse($converter->supports($params)); + } + + public function testSupportsWithGoodClass() + { + $meta = $this->getMockBuilder('Doctrine\Common\Persistence\Mapping\ClassMetadata') + ->disableOriginalConstructor() + ->getMock(); + + $meta->expects($this->once()) + ->method('getName') + ->will($this->returnValue('Wallabag\CoreBundle\Entity\User')); + + $em = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager') + ->disableOriginalConstructor() + ->getMock(); + + $em->expects($this->once()) + ->method('getClassMetadata') + ->with('WallabagCoreBundle:User') + ->will($this->returnValue($meta)); + + $registry = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') + ->disableOriginalConstructor() + ->getMock(); + + $registry->expects($this->once()) + ->method('getManagers') + ->will($this->returnValue(array('default' => null))); + + $registry->expects($this->once()) + ->method('getManagerForClass') + ->with('WallabagCoreBundle:User') + ->will($this->returnValue($em)); + + $params = new ParamConverter(array('class' => 'WallabagCoreBundle:User')); + $converter = new UsernameRssTokenConverter($registry); + + $this->assertTrue($converter->supports($params)); + } + + /** + * @expectedException InvalidArgumentException + * @expectedExceptionMessage Route attribute is missing + */ + public function testApplyEmptyRequest() + { + $params = new ParamConverter(array()); + $converter = new UsernameRssTokenConverter(); + + $converter->apply(new Request(), $params); + } + + /** + * @expectedException Symfony\Component\HttpKernel\Exception\NotFoundHttpException + * @expectedExceptionMessage User not found + */ + public function testApplyUserNotFound() + { + $repo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\UserRepository') + ->disableOriginalConstructor() + ->getMock(); + + $repo->expects($this->once()) + ->method('findOneByUsernameAndRsstoken') + ->with('test', 'test') + ->will($this->returnValue(null)); + + $em = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager') + ->disableOriginalConstructor() + ->getMock(); + + $em->expects($this->once()) + ->method('getRepository') + ->with('WallabagCoreBundle:User') + ->will($this->returnValue($repo)); + + $registry = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') + ->disableOriginalConstructor() + ->getMock(); + + $registry->expects($this->once()) + ->method('getManagerForClass') + ->with('WallabagCoreBundle:User') + ->will($this->returnValue($em)); + + $params = new ParamConverter(array('class' => 'WallabagCoreBundle:User')); + $converter = new UsernameRssTokenConverter($registry); + $request = new Request(array(), array(), array('username' => 'test', 'token' => 'test')); + + $converter->apply($request, $params); + } + + public function testApplyUserFound() + { + $user = new User(); + + $repo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\UserRepository') + ->disableOriginalConstructor() + ->getMock(); + + $repo->expects($this->once()) + ->method('findOneByUsernameAndRsstoken') + ->with('test', 'test') + ->will($this->returnValue($user)); + + $em = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager') + ->disableOriginalConstructor() + ->getMock(); + + $em->expects($this->once()) + ->method('getRepository') + ->with('WallabagCoreBundle:User') + ->will($this->returnValue($repo)); + + $registry = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') + ->disableOriginalConstructor() + ->getMock(); + + $registry->expects($this->once()) + ->method('getManagerForClass') + ->with('WallabagCoreBundle:User') + ->will($this->returnValue($em)); + + $params = new ParamConverter(array('class' => 'WallabagCoreBundle:User', 'name' => 'user')); + $converter = new UsernameRssTokenConverter($registry); + $request = new Request(array(), array(), array('username' => 'test', 'token' => 'test')); + + $converter->apply($request, $params); + + $this->assertEquals($user, $request->attributes->get('user')); + } +} -- cgit v1.2.3 From 0ee043f745fc53d782528128c615aa24a6af1d24 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sat, 28 Mar 2015 21:45:35 +0100 Subject: Update InstallCommand test They are god damn too long to execute because it launch external command (mostly related to doctrine). So I've added a PHPUnit @group (`command-doctrine`) so that we can avoid launching them on a regular basis, like that: `phpunit --exclude-group command-doctrine` --- .../Tests/Command/InstallCommandTest.php | 15 +++++++++++---- .../CoreBundle/Tests/Mock/InstallCommandMock.php | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 src/Wallabag/CoreBundle/Tests/Mock/InstallCommandMock.php (limited to 'src/Wallabag') diff --git a/src/Wallabag/CoreBundle/Tests/Command/InstallCommandTest.php b/src/Wallabag/CoreBundle/Tests/Command/InstallCommandTest.php index 64f6c329..f689b532 100644 --- a/src/Wallabag/CoreBundle/Tests/Command/InstallCommandTest.php +++ b/src/Wallabag/CoreBundle/Tests/Command/InstallCommandTest.php @@ -4,6 +4,7 @@ namespace Wallabag\CoreBundle\Tests\Command; use Wallabag\CoreBundle\Tests\WallabagTestCase; use Wallabag\CoreBundle\Command\InstallCommand; +use Wallabag\CoreBundle\Tests\Mock\InstallCommandMock; use Symfony\Bundle\FrameworkBundle\Console\Application; use Symfony\Component\Console\Tester\CommandTester; use Symfony\Component\Console\Input\ArrayInput; @@ -30,7 +31,7 @@ class InstallCommandTest extends WallabagTestCase $this->container = static::$kernel->getContainer(); $application = new Application(static::$kernel); - $application->add(new InstallCommand()); + $application->add(new InstallCommandMock()); $command = $application->find('wallabag:install'); @@ -64,7 +65,7 @@ class InstallCommandTest extends WallabagTestCase $this->container = static::$kernel->getContainer(); $application = new Application(static::$kernel); - $application->add(new InstallCommand()); + $application->add(new InstallCommandMock()); $command = $application->find('wallabag:install'); @@ -97,6 +98,9 @@ class InstallCommandTest extends WallabagTestCase $this->assertContains('Droping database, creating database and schema', $tester->getDisplay()); } + /** + * @group command-doctrine + */ public function testRunInstallCommandWithDatabaseRemoved() { $this->container = static::$kernel->getContainer(); @@ -148,7 +152,7 @@ class InstallCommandTest extends WallabagTestCase $this->container = static::$kernel->getContainer(); $application = new Application(static::$kernel); - $application->add(new InstallCommand()); + $application->add(new InstallCommandMock()); $command = $application->find('wallabag:install'); @@ -181,6 +185,9 @@ class InstallCommandTest extends WallabagTestCase $this->assertContains('Droping schema and creating schema', $tester->getDisplay()); } + /** + * @group command-doctrine + */ public function testRunInstallCommandChooseNothing() { $this->container = static::$kernel->getContainer(); @@ -242,7 +249,7 @@ class InstallCommandTest extends WallabagTestCase $this->container = static::$kernel->getContainer(); $application = new Application(static::$kernel); - $application->add(new InstallCommand()); + $application->add(new InstallCommandMock()); $command = $application->find('wallabag:install'); diff --git a/src/Wallabag/CoreBundle/Tests/Mock/InstallCommandMock.php b/src/Wallabag/CoreBundle/Tests/Mock/InstallCommandMock.php new file mode 100644 index 00000000..69bc48e0 --- /dev/null +++ b/src/Wallabag/CoreBundle/Tests/Mock/InstallCommandMock.php @@ -0,0 +1,22 @@ + Date: Sat, 28 Mar 2015 22:15:24 +0100 Subject: Use lemonde instead of mailjet Mailjet seems to be laggy, hope that LeMonde will be more reliable in the future. @see https://travis-ci.org/wallabag/wallabag/jobs/56246231 --- src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php | 4 ++-- .../CoreBundle/Tests/Controller/WallabagRestControllerTest.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src/Wallabag') diff --git a/src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php b/src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php index 99a3a945..1a0d586c 100644 --- a/src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php +++ b/src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php @@ -60,7 +60,7 @@ class EntryControllerTest extends WallabagTestCase $form = $crawler->filter('button[type=submit]')->form(); $data = array( - 'entry[url]' => 'https://www.mailjet.com/blog/mailjet-zapier-integrations-made-easy/', + 'entry[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', ); $client->submit($form, $data); @@ -70,7 +70,7 @@ class EntryControllerTest extends WallabagTestCase $crawler = $client->followRedirect(); $this->assertGreaterThan(1, $alert = $crawler->filter('h2 a')->extract(array('_text'))); - $this->assertContains('Mailjet', $alert[0]); + $this->assertContains('Google', $alert[0]); } public function testArchive() diff --git a/src/Wallabag/CoreBundle/Tests/Controller/WallabagRestControllerTest.php b/src/Wallabag/CoreBundle/Tests/Controller/WallabagRestControllerTest.php index 0eca7cde..c9907065 100644 --- a/src/Wallabag/CoreBundle/Tests/Controller/WallabagRestControllerTest.php +++ b/src/Wallabag/CoreBundle/Tests/Controller/WallabagRestControllerTest.php @@ -105,7 +105,7 @@ class WallabagRestControllerTest extends WallabagTestCase $this->assertGreaterThanOrEqual(1, count(json_decode($client->getResponse()->getContent()))); - $this->assertContains('Mailjet', $client->getResponse()->getContent()); + $this->assertContains('Google', $client->getResponse()->getContent()); $this->assertTrue( $client->getResponse()->headers->contains( -- cgit v1.2.3 From 7d74a2f32b55fa9c33f5ecff57785e8d9e4de8ae Mon Sep 17 00:00:00 2001 From: Jeremy Date: Wed, 1 Apr 2015 16:11:19 +0200 Subject: Force raw on content We don't want Symfony to escape html content --- src/Wallabag/CoreBundle/Resources/views/Entry/entries.xml.twig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/Wallabag') diff --git a/src/Wallabag/CoreBundle/Resources/views/Entry/entries.xml.twig b/src/Wallabag/CoreBundle/Resources/views/Entry/entries.xml.twig index f1039f5d..5ec9bc03 100644 --- a/src/Wallabag/CoreBundle/Resources/views/Entry/entries.xml.twig +++ b/src/Wallabag/CoreBundle/Resources/views/Entry/entries.xml.twig @@ -17,13 +17,13 @@ {{ entry.createdAt|date('D, d M Y H:i:s') }} 0 -%} - {% trans %}estimated reading time :{% endtrans %} {{ entry.content| readingTime }} min + {%- if entry.content|readingTime > 0 -%} + {% trans %}estimated reading time :{% endtrans %} {{ entry.content|readingTime }} min {%- else -%} {% trans %}estimated reading time :{% endtrans %} < 1 min {%- endif %} - {{ entry.content -}} + {{ entry.content|raw -}} ]]> -- cgit v1.2.3