Improve task filters and tag collections
This commit is contained in:
@@ -151,6 +151,31 @@ class MarkdownHeadingTests(TestCase):
|
||||
self.assertEqual(markdown_title('## Ziel von my2dos\n\nText'), 'Ziel von my2dos')
|
||||
|
||||
|
||||
class QuickCreateFilterTests(TestCase):
|
||||
def setUp(self):
|
||||
self.user = get_user_model().objects.create_user(username='quick-filter', password='secret')
|
||||
self.client.force_login(self.user)
|
||||
|
||||
def test_active_tag_is_added_only_when_content_has_no_tags(self):
|
||||
self.client.post(f'{reverse("index")}?tag=work', {'content': 'Task without tag'})
|
||||
first = Item.objects.get(content='Task without tag #work')
|
||||
self.assertEqual(list(first.tags.values_list('name', flat=True)), ['work'])
|
||||
|
||||
self.client.post(f'{reverse("index")}?tag=work', {'content': 'Task with own #other'})
|
||||
second = Item.objects.get(content='Task with own #other')
|
||||
self.assertEqual(list(second.tags.values_list('name', flat=True)), ['other'])
|
||||
|
||||
def test_hx_create_response_keeps_active_tag_marked(self):
|
||||
response = self.client.post(
|
||||
f'{reverse("index")}?tag=work', {'content': 'Task without tag'}, HTTP_HX_REQUEST='true',
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(response, 'hx-swap-oob="true"')
|
||||
self.assertContains(response, '#work ×')
|
||||
self.assertContains(response, 'text-bg-dark')
|
||||
|
||||
|
||||
class FormattingToolbarTests(TestCase):
|
||||
def test_toolbar_and_shortcuts_are_available(self):
|
||||
user = get_user_model().objects.create_user(username='formatting', password='secret')
|
||||
@@ -189,6 +214,31 @@ class NavigationAndLayoutTests(TestCase):
|
||||
self.assertLess(menu_position, toolbar_position)
|
||||
self.assertLess(toolbar_position, file_position)
|
||||
|
||||
def test_quick_create_is_disabled_while_inline_editor_is_open(self):
|
||||
response = self.client.get(reverse('index'))
|
||||
self.assertContains(response, ':disabled="editingItem"')
|
||||
self.assertContains(response, 'inline-edit-form')
|
||||
item = Item.objects.create(owner=self.user, content='Editable')
|
||||
response = self.client.get(reverse('edit_item', args=[item.id]))
|
||||
self.assertContains(response, 'inline-edit-form')
|
||||
|
||||
def test_tag_filter_list_depends_on_current_filters(self):
|
||||
open_todo = Item.objects.create(owner=self.user, kind=Item.Kind.TODO, content='Open #openonly')
|
||||
open_todo.sync_metadata()
|
||||
done_todo = Item.objects.create(owner=self.user, kind=Item.Kind.TODO, content='Done #archiveonly', is_done=True)
|
||||
done_todo.sync_metadata()
|
||||
note = Item.objects.create(owner=self.user, kind=Item.Kind.NOTE, content='Note #noteonly')
|
||||
note.sync_metadata()
|
||||
|
||||
response = self.client.get(f'{reverse("index")}?status=archive')
|
||||
self.assertContains(response, '#archiveonly')
|
||||
self.assertNotContains(response, '#openonly')
|
||||
self.assertNotContains(response, '#noteonly')
|
||||
|
||||
response = self.client.get(f'{reverse("tag_list")}?status=archive')
|
||||
self.assertContains(response, '#archiveonly')
|
||||
self.assertNotContains(response, '#openonly')
|
||||
|
||||
|
||||
class AttachmentEditTests(TestCase):
|
||||
def setUp(self):
|
||||
@@ -500,6 +550,34 @@ class CollectionTests(TestCase):
|
||||
manage_response = self.client.get(reverse('collection_manage', args=[collection.id]))
|
||||
self.assertRedirects(manage_response, reverse('collection_edit', args=[collection.id]))
|
||||
|
||||
def test_tag_collection_can_filter_included_item_types(self):
|
||||
note = Item.objects.create(owner=self.user, kind=Item.Kind.NOTE, content='Matching note #project')
|
||||
note.sync_metadata()
|
||||
todo = Item.objects.create(owner=self.user, kind=Item.Kind.TODO, content='Matching todo #project')
|
||||
todo.sync_metadata()
|
||||
link = Item.objects.create(owner=self.user, kind=Item.Kind.LINK, content='Matching link #project')
|
||||
link.sync_metadata()
|
||||
collection = Collection.objects.create(
|
||||
owner=self.user, title='Typed tags', mode=Collection.Mode.TAGS,
|
||||
include_notes=False, include_todos=True, include_links=False, include_journal=False,
|
||||
)
|
||||
collection.filter_tags.add(Tag.objects.get(name='project'))
|
||||
|
||||
response = self.client.get(collection.get_absolute_url())
|
||||
|
||||
self.assertContains(response, 'Matching todo')
|
||||
self.assertNotContains(response, 'Matching note')
|
||||
self.assertNotContains(response, 'Matching link')
|
||||
|
||||
def test_tag_collection_form_offers_item_type_selection(self):
|
||||
response = self.client.get(reverse('collection_create'))
|
||||
|
||||
self.assertContains(response, 'Entry types')
|
||||
self.assertContains(response, 'name="include_notes"')
|
||||
self.assertContains(response, 'name="include_todos"')
|
||||
self.assertContains(response, 'name="include_links"')
|
||||
self.assertContains(response, 'name="include_journal"')
|
||||
|
||||
def test_collection_opens_as_continuous_reading_view(self):
|
||||
collection = Collection.objects.create(owner=self.user, title='Reading view')
|
||||
first = Item.objects.create(owner=self.user, kind=Item.Kind.NOTE, content='First paragraph')
|
||||
|
||||
Reference in New Issue
Block a user