--- /dev/null
+<?php
+
+namespace Application\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Changed tags to lowercase.
+ */
+class Version20170719231144 extends AbstractMigration implements ContainerAwareInterface
+{
+ /**
+ * @var ContainerInterface
+ */
+ private $container;
+
+ public function setContainer(ContainerInterface $container = null)
+ {
+ $this->container = $container;
+ }
+
+ /**
+ * @param Schema $schema
+ */
+ public function up(Schema $schema)
+ {
+ $this->skipIf($this->connection->getDatabasePlatform()->getName() === 'sqlite', 'Migration can only be executed safely on \'mysql\' or \'postgresql\'.');
+
+ // Find tags which need to be merged
+ $dupTags = $this->connection->query('
+ SELECT LOWER(label)
+ FROM ' . $this->getTable('tag') . '
+ GROUP BY LOWER(label)
+ HAVING COUNT(*) > 1'
+ );
+ $dupTags->execute();
+
+ foreach ($dupTags->fetchAll() as $duplicates) {
+ $label = $duplicates['LOWER(label)'];
+
+ // Retrieve all duplicate tags for a given tag
+ $tags = $this->connection->query('
+ SELECT id
+ FROM ' . $this->getTable('tag') . "
+ WHERE LOWER(label) = '" . $label . "'
+ ORDER BY id ASC"
+ );
+ $tags->execute();
+
+ $first = true;
+ $newId = null;
+ $ids = [];
+
+ foreach ($tags->fetchAll() as $tag) {
+ // Ignore the first tag as we use it as the new reference tag
+ if ($first) {
+ $first = false;
+ $newId = $tag['id'];
+ } else {
+ $ids[] = $tag['id'];
+ }
+ }
+
+ // Just in case...
+ if (count($ids) > 0) {
+ // Merge tags
+ $this->addSql('
+ UPDATE ' . $this->getTable('entry_tag') . '
+ SET tag_id = ' . $newId . '
+ WHERE tag_id IN (' . implode(',', $ids) . ')'
+ );
+
+ // Delete unused tags
+ $this->addSql('
+ DELETE FROM ' . $this->getTable('tag') . '
+ WHERE id IN (' . implode(',', $ids) . ')'
+ );
+ }
+ }
+
+ // Iterate over all tags to lowercase them
+ $this->addSql('
+ UPDATE ' . $this->getTable('tag') . '
+ SET label = LOWER(label)'
+ );
+ }
+
+ /**
+ * @param Schema $schema
+ */
+ public function down(Schema $schema)
+ {
+ throw new SkipMigrationException('Too complex ...');
+ }
+
+ private function getTable($tableName)
+ {
+ return $this->container->getParameter('database_table_prefix') . $tableName;
+ }
+}
class TagControllerTest extends WallabagCoreTestCase
{
public $tagName = 'opensource';
+ public $caseTagName = 'OpenSource';
public function testList()
{
$form = $crawler->filter('form[name=tag]')->form();
$data = [
- 'tag[label]' => $this->tagName,
+ 'tag[label]' => $this->caseTagName,
];
$client->submit($form, $data);
// be sure to reload the entry
$entry = $this->getEntityManager()->getRepository(Entry::class)->find($entry->getId());
$this->assertCount(1, $entry->getTags());
+ $this->assertContains($this->tagName, $entry->getTags());
// tag already exists and already assigned
$client->submit($form, $data);
$form = $crawler->filter('form[name=tag]')->form();
$data = [
- 'tag[label]' => 'foo2, bar2',
+ 'tag[label]' => 'foo2, Bar2',
];
$client->submit($form, $data);
$tags = $content->getTags();
$this->assertContains('foot', $tags, 'It includes the "foot" tag');
$this->assertContains('varnish', $tags, 'It includes the "varnish" tag');
- $this->assertContains('PHP', $tags, 'It includes the "PHP" tag');
+ $this->assertContains('php', $tags, 'It includes the "php" tag');
$this->assertSame(3, count($tags));
$this->assertInstanceOf(\DateTime::class, $content->getCreatedAt());
$tags = $content->getTags();
$this->assertContains('foot', $tags, 'It includes the "foot" tag');
- $this->assertContains('Framabag', $tags, 'It includes the "Framabag" tag');
+ $this->assertContains('framabag', $tags, 'It includes the "framabag" tag');
$this->assertSame(2, count($tags));
$this->assertInstanceOf(\DateTime::class, $content->getCreatedAt());