POST entries/tags with test

This commit is contained in:
Nicolas Lœuillet 2015-02-24 22:00:24 +01:00
parent 46bbd8d321
commit a36737f485
3 changed files with 69 additions and 1 deletions

View file

@ -213,8 +213,34 @@ class WallabagRestController extends Controller
* }
* )
*/
public function postEntriesTagsAction(Entry $entry)
public function postEntriesTagsAction(Request $request, Entry $entry)
{
$tags = explode(',', $request->request->get('tags'));
foreach ($tags as $label) {
$tagEntity = $this
->getDoctrine()
->getRepository('WallabagCoreBundle:Tag')
->findOneByLabel($label);
if (is_null($tagEntity)) {
$tagEntity = new Tag();
$tagEntity->setLabel($label);
}
// only add the tag on the entry if the relation doesn't exist
if (!$entry->getTags()->contains($tagEntity)) {
$entry->addTag($tagEntity);
}
}
$em = $this->getDoctrine()->getManager();
$em->persist($entry);
$em->flush();
$json = $this->get('serializer')->serialize($entry, 'json');
return new Response($json, 200, array('application/json'));
}
/**

View file

@ -119,6 +119,11 @@ class EntryRepository extends EntityRepository
->getResult();
}
/**
* Fetch an entry with a tag. Only used for tests.
*
* @return Entry
*/
public function findOneWithTags()
{
$qb = $this->createQueryBuilder('e')

View file

@ -176,4 +176,41 @@ class WallabagRestControllerTest extends WallabagTestCase
$this->assertEquals(json_encode($tags), $client->getResponse()->getContent());
}
public function testPostTagsOnEntry()
{
$client = $this->createClient();
$client->request('GET', '/api/salts/admin.json');
$salt = json_decode($client->getResponse()->getContent());
$headers = $this->generateHeaders('admin', 'test', $salt[0]);
$entry = $client->getContainer()
->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry')
->findOneByUser(1);
if (!$entry) {
$this->markTestSkipped('No content found in db.');
}
$newTags = 'tag1,tag2,tag3';
$client->request('POST', '/api/entries/'.$entry->getId().'/tags', array('tags' => $newTags), array(), $headers);
$this->assertEquals(200, $client->getResponse()->getStatusCode());
$entryDB = $client->getContainer()
->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry')
->find($entry->getId());
$tagsInDB = array();
foreach ($entryDB->getTags()->toArray() as $tag) {
$tagsInDB[$tag->getId()] = $tag->getLabel();
}
foreach (explode(',', $newTags) as $tag) {
$this->assertContains($tag, $tagsInDB);
}
}
}