def test_project_publish(client, phase, staff_user): project = phase.module.project project.is_draft = True project.information = '' project.save() project_publish_url = reverse('a4dashboard:project-publish', kwargs={'project_slug': project.slug}) data = {'action': 'publish'} # publishing incomplete projects has no effect client.login(username=staff_user, password='******') response = client.post(project_publish_url, data) assert redirect_target(response) == 'project-edit' project.refresh_from_db() assert project.is_draft is True # complete project and publish it project.information = 'project information' project.save() client.login(username=staff_user, password='******') response = client.post(project_publish_url, data) assert redirect_target(response) == 'project-edit' project.refresh_from_db() assert project.is_draft is False
def test_initiator_can_delete_invitation(client, phase_factory): phase, module, project, idea = setup_phase( phase_factory, None, CollectFeedbackPhase) url = component.get_base_url(project) initiator = module.project.organisation.initiators.first() client.login(username=initiator.email, password='******') response = client.get(url) assert_template_response( response, 'a4_candy_projects/project_participants.html') data = { 'add_users': '[email protected],[email protected]', } response = client.post(url, data) assert redirect_target(response) == \ 'dashboard-{}-edit'.format(component.identifier) assert ParticipantInvite.objects.get(email='*****@*****.**') invite_pk = int(ParticipantInvite.objects.get(email='*****@*****.**').pk) data = { 'submit_action': 'remove_invite', 'invite_pk': invite_pk } response = client.post(url, data) assert redirect_target(response) == \ 'dashboard-{}-edit'.format(component.identifier) assert response.status_code == 302 assert not ParticipantInvite.objects.filter(email='*****@*****.**').exists() response = client.post(url, data) assert redirect_target(response) == \ 'dashboard-{}-edit'.format(component.identifier) assert response.status_code == 302
def test_project_unpublish(client, phase, another_user): project = phase.module.project project.is_draft = False project.save() organisation = project.organisation organisation.initiators.add(another_user) project_publish_url = reverse('a4dashboard:project-publish', kwargs={ 'project_slug': project.slug}) data = {'action': 'unpublish'} client.login(username=another_user, password='******') response = client.post(project_publish_url, data) assert redirect_target(response) == 'project-edit' project.refresh_from_db() assert project.is_draft is True # unpublishing draft projects has no effect client.login(username=another_user, password='******') response = client.post(project_publish_url, data) assert redirect_target(response) == 'project-edit' project.refresh_from_db() assert project.is_draft is True
def test_project_create(client, organisation, user): initiator = organisation.initiators.first() url = reverse('a4dashboard:project-create', kwargs={ 'organisation_slug': organisation.slug, }) data = { 'name': 'project name', 'description': 'project description', 'access': 1 } response = client.post(url, data) assert redirect_target(response) == 'account_login' client.login(username=user, password='******') response = client.post(url, data) assert response.status_code == 403 client.login(username=initiator, password='******') response = client.post(url, data) assert redirect_target(response) == 'project-edit' assert 1 == Project.objects.all().count() project = Project.objects.all().first() assert 'project name' == project.name assert 'project description' == project.description
def test_send_platform(client, project, user_factory): organisation = project.organisation assert organisation.initiators.count() == 1 assert project.moderators.count() == 1 admin = user_factory(is_superuser=True) user_factory() User.objects.update(get_newsletters=True) assert User.objects.count() == 4 data = { 'sender_name': 'Tester', 'sender': '*****@*****.**', 'subject': 'Testsubject', 'body': 'Testbody', 'receivers': newsletter_models.PLATFORM, 'organisation': '', 'project': '', 'send': 'Send', } url = reverse('meinberlin_newsletters:newsletter-create') client.login(username=admin.email, password='******') response = client.post(url, data) assert redirect_target(response) == 'newsletter-create' assert newsletter_models.Newsletter.objects.count() == 1 assert len(mail.outbox) == 4 to_sent = sorted([m.to[0] for m in mail.outbox]) to_expected = sorted(User.objects.all().values_list('email', flat=True)) assert to_sent == to_expected
def test_admin_can_create_idea_in_wrong_phase(client, phase_factory, category_factory, admin): phase = phase_factory(phase_content=phases.RatingPhase()) module = phase.module category = category_factory(module=module) url = reverse('a4_candy_ideas:idea-create', kwargs={ 'organisation_slug': module.project.organisation.slug, 'module_slug': module.slug }) with freeze_phase(phase): client.login(username=admin.email, password='******') response = client.get(url) assert_template_response(response, 'a4_candy_ideas/idea_create_form.html') assert response.status_code == 200 idea = { 'name': 'Idea', 'description': 'description', 'category': category.pk, } response = client.post(url, idea) assert response.status_code == 302 assert redirect_target(response) == 'idea-detail' count = models.Idea.objects.all().count() assert count == 1
def test_initiator_can_create_topic_before_phase(client, phase_factory, category_factory, admin): phase = phase_factory(phase_content=phases.PrioritizePhase()) module = phase.module project = module.project category = category_factory(module=module) initiator = project.organisation.initiators.first() url = reverse('a4dashboard:topic-create', kwargs={'module_slug': module.slug}) with freeze_pre_phase(phase): client.login(username=initiator.email, password='******') response = client.get(url) assert_template_response( response, 'meinberlin_topicprio/topic_create_form.html') assert response.status_code == 200 topic = { 'name': 'Topic', 'description': 'description', 'category': category.pk, } response = client.post(url, topic) assert response.status_code == 302 assert redirect_target(response) == 'topic-list' count = models.Topic.objects.all().count() assert count == 1
def test_participant_can_only_be_invited_once( client, phase_factory, user): phase, module, project, idea = setup_phase( phase_factory, None, CollectFeedbackPhase) assert user not in module.project.participants.all() module.project.participants.add(user) url = component.get_base_url(project) initiator = module.project.organisation.initiators.first() client.login(username=initiator.email, password='******') response = client.get(url) assert_template_response( response, 'a4_candy_projects/project_participants.html') data = { 'add_users': '[email protected], [email protected], ' + user.email, } response = client.post(url, data) assert redirect_target(response) == \ 'dashboard-{}-edit'.format(component.identifier) assert ParticipantInvite.objects.get(email='*****@*****.**') assert ParticipantInvite.objects.get(email='*****@*****.**') messages = list(get_messages(response.wsgi_request)) assert len(messages) == 2 assert str(messages[0]) == ( 'Following users already accepted an invitation: ' + user.email) assert str(messages[1]) == ('2 participants invited.') data = { 'add_users': '*****@*****.**', } response = client.post(url, data) messages = list(get_messages(response.wsgi_request)) assert len(messages) == 4 assert str(messages[2]) == ( 'Following users are already invited: [email protected]') assert str(messages[3]) == ('0 participants invited.')
def test_invite_accept(client, user, invite): url = reverse('ideainvite-update', args=[invite.token]) client.force_login(user) response = client.post(url, {'accept': True}) assert redirect_target(response) == 'idea-detail' assert user in invite.subject.co_workers.all()
def test_module_create(client, project): organisation = project.organisation initiator = organisation.initiators.first() url = reverse('a4dashboard:module-create', kwargs={'organisation_slug': organisation.slug, 'project_slug': project.slug, 'blueprint_slug': 'interactive-event' }) client.login(username=initiator.email, password='******') response = client.post(url) assert redirect_target(response) == 'dashboard-module_basic-edit' messages = list(get_messages(response.wsgi_request)) assert len(messages) == 1 assert str(messages[0]) == 'The module was created' response2 = client.post(response.url) assert not response2.context_data['form'].is_valid() assert 'name' in response2.context_data['form'].errors assert 'description' in response2.context_data['form'].errors data = {'name': 'interactive event module', 'description': 'ask questions'} response3 = client.post(response.url, data) assert response3.status_code == 302 response4 = client.get(response3.url) assert response4.context_data['form'].errors == {} assert Module.objects.all().count() == 1 module = Module.objects.first() assert module.name == data['name'] assert module.description == data['description']
def test_creator_can_update_during_active_phase(client, phase_factory, map_idea_factory, category_factory, area_settings_factory): phase, module, project, mapidea = setup_phase(phase_factory, map_idea_factory, phases.IssuePhase) category = category_factory(module=module) area_settings_factory(module=module) user = mapidea.creator url = reverse('mapidea-update', kwargs={'slug': mapidea.slug}) with freeze_phase(phase): client.login(username=user.email, password='******') data = { 'name': 'Another MapIdea', 'description': 'changed description', 'category': category.pk, 'point': (0, 1), 'point_label': 'somewhere else' } response = client.post(url, data) assert redirect_target(response) == 'mapidea-detail' assert response.status_code == 302 updated_mapidea = models.MapIdea.objects.get(id=mapidea.pk) assert updated_mapidea.description == 'changed description'
def test_creator_can_update_during_active_phase(client, phase_factory, idea_factory, category_factory): phase, module, project, idea = setup_phase( phase_factory, idea_factory, phases.IssuePhase) category = category_factory(module=module) user = idea.creator url = reverse( 'meinberlin_ideas:idea-update', kwargs={ 'pk': idea.pk, 'year': idea.created.year }) with freeze_phase(phase): client.login(username=user.email, password='******') data = { 'name': 'Another Idea', 'description': 'changed description', 'category': category.pk, } response = client.post(url, data) assert redirect_target(response) == 'idea-detail' assert response.status_code == 302 updated_idea = models.Idea.objects.get(id=idea.pk) assert updated_idea.description == 'changed description'
def test_admin_can_create_mapidea_in_wrong_phase(client, phase_factory, category_factory, admin, area_settings_factory): phase = phase_factory(phase_content=phases.RatingPhase()) module = phase.module area_settings_factory(module=module) category = category_factory(module=module) url = reverse('mapidea-create', kwargs={'slug': module.slug}) with freeze_phase(phase): client.login(username=admin.email, password='******') response = client.get(url) assert_template_response( response, '{{ cookiecutter.project_app_prefix }}_mapideas/mapidea_form.html') assert response.status_code == 200 mapidea = { 'name': 'MapIdea', 'description': 'description', 'category': category.pk, 'point': (0, 0), 'point_label': 'somewhere' } response = client.post(url, mapidea) assert response.status_code == 302 assert redirect_target(response) == 'mapidea-detail' count = models.MapIdea.objects.all().count() assert count == 1
def test_send_project(admin, client, project, user_factory, follow_factory): organisation = project.organisation user1 = user_factory(get_newsletters=True) user2 = user_factory() user_factory() follow_models.Follow.objects.all().delete() follow_factory(creator=user1, project=project) follow_factory(creator=user2, project=project, enabled=False) data = { 'sender_name': 'Tester', 'sender': '*****@*****.**', 'subject': 'Testsubject', 'body': 'Testbody', 'receivers': newsletter_models.PROJECT, 'organisation': organisation.pk, 'project': project.pk, 'send': 'Send', } url = reverse('a4dashboard:newsletter-create', kwargs={'organisation_slug': organisation.slug}) client.login(username=admin.email, password='******') response = client.post(url, data) assert redirect_target(response) == 'newsletter-create' assert newsletter_models.Newsletter.objects.count() == 1 assert len(mail.outbox) == 1 assert mail.outbox[0].to == [user1.email] assert mail.outbox[0].subject == 'Testsubject'
def test_skip_inactive(admin, client, project, user_factory, follow_factory): organisation = project.organisation user1 = user_factory(is_active=False) follow_models.Follow.objects.all().delete() follow_factory(creator=user1, project=project) data = { 'sender_name': 'Tester', 'sender': '*****@*****.**', 'subject': 'Testsubject', 'body': 'Testbody', 'receivers': newsletter_models.ORGANISATION, 'organisation': organisation.pk, 'project': '', 'send': 'Send', } url = reverse('a4dashboard:newsletter-create', kwargs={'organisation_slug': organisation.slug}) client.login(username=admin.email, password='******') response = client.post(url, data) assert redirect_target(response) == 'newsletter-create' assert newsletter_models.Newsletter.objects.count() == 1 assert len(mail.outbox) == 0
def test_invite_reject(client, user, invite): url = reverse('ideainvite-update', args=[invite.token]) client.force_login(user) response = client.post(url, {'reject': True}) assert redirect_target(response) == 'wagtail_serve' assert user not in invite.subject.co_workers.all()
def test_module_delete(client, module_factory): module1 = module_factory() project = module1.project module2 = module_factory(project=project, is_draft=True) organisation = project.organisation initiator = organisation.initiators.first() assert project.modules.count() == 2 url = reverse('a4dashboard:module-delete', kwargs={'organisation_slug': organisation.slug, 'slug': module1.slug }) client.login(username=initiator.email, password='******') response = client.post(url) messages = list(get_messages(response.wsgi_request)) assert len(messages) > 0 assert str(messages[-1]) == 'Module cannot be deleted. It has to be ' \ 'removed from the project first.' assert redirect_target(response) == 'project-edit' assert project.modules.count() == 2 url = reverse('a4dashboard:module-delete', kwargs={'organisation_slug': organisation.slug, 'slug': module2.slug }) response = client.post(url) messages = list(get_messages(response.wsgi_request)) assert str(messages[-1]) == 'The module has been deleted' assert project.modules.count() == 1
def test_user_can_create_idea_during_active_phase(client, phase_factory, user, category_factory): phase = phase_factory(phase_content=phases.IssuePhase()) module = phase.module category = category_factory(module=module) url = reverse('idea-create', kwargs={'slug': module.slug}) with freeze_phase(phase): count = models.Idea.objects.all().count() assert count == 0 client.login(username=user.email, password='******') response = client.get(url) assert_template_response( response, '{{ cookiecutter.project_app_prefix }}_ideas/idea_form.html') assert response.status_code == 200 idea = { 'name': 'Idea', 'description': 'description', 'category': category.pk, } response = client.post(url, idea) assert response.status_code == 302 assert redirect_target(response) == 'idea-detail' count = models.Idea.objects.all().count() assert count == 1
def test_moderate_view(client, phase_factory, proposal_factory, user, area_settings_factory): phase, module, project, item = setup_phase(phase_factory, proposal_factory, phases.RequestPhase) area_settings_factory(module=module) url = reverse('a4_candy_budgeting:proposal-moderate', kwargs={ 'organisation_slug': project.organisation.slug, 'pk': item.pk, 'year': item.created.year }) project.moderators.set([user]) with freeze_phase(phase): client.login(username=user.email, password='******') response = client.get(url) assert_template_response( response, 'a4_candy_budgeting/proposal_moderate_form.html') data = { 'moderator_feedback': 'test', 'is_archived': False, 'statement': 'its a statement' } response = client.post(url, data) assert redirect_target(response) == 'proposal-detail'
def test_create_view(client, phase_factory, proposal_factory, user, category_factory, area_settings_factory): phase, module, project, item = setup_phase(phase_factory, proposal_factory, phases.RequestPhase) area_settings_factory(module=module) category = category_factory(module=module) url = reverse('a4_candy_budgeting:proposal-create', kwargs={ 'organisation_slug': project.organisation.slug, 'module_slug': module.slug }) with freeze_phase(phase): client.login(username=user.email, password='******') response = client.get(url) assert_template_response( response, 'a4_candy_budgeting/proposal_create_form.html') data = { 'name': 'Idea', 'description': 'description', 'category': category.pk, 'budget': 123, 'point': (0, 0), 'point_label': 'somewhere' } response = client.post(url, data) assert redirect_target(response) == 'proposal-detail'
def test_user_can_create_mapidea_during_active_phase(client, phase_factory, user, category_factory, area_settings_factory): phase = phase_factory(phase_content=phases.IssuePhase()) module = phase.module area_settings_factory(module=module) category = category_factory(module=module) url = reverse('a4_candy_mapideas:mapidea-create', kwargs={ 'organisation_slug': module.project.organisation.slug, 'module_slug': module.slug }) with freeze_phase(phase): count = models.MapIdea.objects.all().count() assert count == 0 client.login(username=user.email, password='******') response = client.get(url) assert_template_response(response, 'a4_candy_mapideas/mapidea_create_form.html') assert response.status_code == 200 mapidea = { 'name': 'MapIdea', 'description': 'description', 'category': category.pk, 'point': (0, 0), 'point_label': 'somewhere' } response = client.post(url, mapidea) assert response.status_code == 302 assert redirect_target(response) == 'mapidea-detail' count = models.MapIdea.objects.all().count() assert count == 1
def test_moderator_can_create_maptopic_before_phase(client, phase_factory, category_factory, admin, area_settings_factory): phase = phase_factory(phase_content=phases.PrioritizePhase()) module = phase.module project = module.project area_settings_factory(module=module) category = category_factory(module=module) moderator = project.moderators.first() url = reverse('a4dashboard:maptopic-create', kwargs={'module_slug': module.slug}) with freeze_pre_phase(phase): client.login(username=moderator.email, password='******') response = client.get(url) assert_template_response( response, 'meinberlin_maptopicprio/maptopic_create_form.html') assert response.status_code == 200 maptopic = { 'name': 'MapTopic', 'description': 'description', 'category': category.pk, 'point': (0, 0), 'point_label': 'somewhere' } response = client.post(url, maptopic) assert response.status_code == 302 assert redirect_target(response) == 'maptopic-list' count = models.MapTopic.objects.all().count() assert count == 1
def test_anonymous_cannot_edit(client, phase_factory): phase, module, project, idea = setup_phase(phase_factory, None, CollectFeedbackPhase) url = component.get_base_url(project) response = client.get(url) assert response.status_code == 302 assert redirect_target(response) == 'account_login'
def test_moderator_can_update_during_wrong_phase(client, phase_factory, idea_factory, category_factory): phase, module, project, idea = setup_phase(phase_factory, idea_factory, phases.RatingPhase) category = category_factory(module=module) user = idea.creator moderator = project.moderators.first() assert moderator is not user url = reverse('a4_candy_ideas:idea-update', kwargs={ 'organisation_slug': idea.project.organisation.slug, 'pk': idea.pk, 'year': idea.created.year }) with freeze_phase(phase): client.login(username=moderator.email, password='******') data = { 'name': 'Another Idea', 'description': 'changed description', 'category': category.pk, } response = client.post(url, data) assert redirect_target(response) == 'idea-detail' assert response.status_code == 302 updated_idea = models.Idea.objects.get(id=idea.pk) assert updated_idea.description == 'changed description'
def test_moderator_can_delete_in_wrong_phase(client, phase_factory, map_idea_factory): phase, module, project, mapidea = setup_phase(phase_factory, map_idea_factory, phases.RatingPhase) url = reverse('a4_candy_mapideas:mapidea-delete', kwargs={ 'organisation_slug': mapidea.project.organisation.slug, 'pk': mapidea.pk, 'year': mapidea.created.year }) with freeze_phase(phase): count = models.MapIdea.objects.all().count() assert count == 1 moderator = mapidea.module.project.moderators.first() client.login(username=moderator.email, password='******') response = client.get(url) assert response.status_code == 200 assert_template_response( response, 'a4_candy_mapideas/mapidea_confirm_delete.html') response = client.post(url) assert redirect_target(response) == 'project-detail' assert response.status_code == 302 count = models.MapIdea.objects.all().count() assert count == 0
def test_maptopic_update_view(client, phase_factory, maptopic_factory, category_factory, area_settings_factory): phase, module, project, item = setup_phase(phase_factory, maptopic_factory, PrioritizePhase) initiator = module.project.organisation.initiators.first() area_settings_factory(module=module) category = category_factory(module=module) url = reverse('a4dashboard:maptopic-update', kwargs={ 'pk': item.pk, 'year': item.created.year }) data = { 'name': 'name', 'description': 'desc', 'category': category.pk, 'point': '{ "type":"Feature", "geometry":{ "type":"Point",' '"coordinates":[ 13.0, 52.0 ] }, "properties":{}}', 'point_label': 'test', } client.login(username=initiator.email, password='******') response = client.post(url, data) assert redirect_target(response) == 'maptopic-list' item.refresh_from_db() assert item.description == data.get('description') assert item.category.pk == data.get('category') assert item.point == json.loads(data.get('point')) assert item.point_label == data.get('point_label')
def test_register_with_next(client, signup_url): assert EmailAddress.objects.count() == 0 email = '*****@*****.**' response = client.post( signup_url, { 'username': '******', 'email': email, 'password1': 'password', 'password2': 'password', 'terms_of_use': 'on', 'next': '/en/projects/pppp/', }) assert response.status_code == 302 assert EmailAddress.objects.filter(email=email, verified=False).count() == 1 assert len(mail.outbox) == 1 confirmation_url = re.search( r'(http://testserver/.*/?next=/en/projects/pppp/)', str(mail.outbox[0].body)).group(0) confirm_email_response = client.get(confirmation_url) assert confirm_email_response.status_code == 200 assert EmailAddress.objects.filter(email=email, verified=False).count() == 1 confirm_email_response = client.post(confirmation_url) assert confirm_email_response.status_code == 302 assert redirect_target(confirm_email_response) == "project-detail" assert EmailAddress.objects.filter(email=email, verified=True).count() == 1
def test_moderators_can_always_update(client, phase_factory, map_idea_factory, category_factory, area_settings_factory): phase, module, project, mapidea = setup_phase(phase_factory, map_idea_factory, phases.RatingPhase) area_settings_factory(module=module) category = category_factory(module=module) user = mapidea.creator moderator = project.moderators.first() assert moderator is not user url = reverse('a4_candy_mapideas:mapidea-update', kwargs={ 'organisation_slug': mapidea.project.organisation.slug, 'pk': mapidea.pk, 'year': mapidea.created.year }) client.login(username=moderator.email, password='******') data = { 'name': 'Another MapIdea', 'description': 'changed description', 'category': category.pk, 'point': (0, 0), 'point_label': 'somewhere' } response = client.post(url, data) assert redirect_target(response) == 'mapidea-detail' assert response.status_code == 302 updated_mapidea = models.MapIdea.objects.get(id=mapidea.pk) assert updated_mapidea.description == 'changed description'
def test_project_publish_perms(client, phase, user, staff_user): project = phase.module.project project_publish_url = reverse('a4dashboard:project-publish', kwargs={'project_slug': project.slug}) data = {'action': 'publish'} response = client.post(project_publish_url, data) assert redirect_target(response) == 'account_login' client.login(username=user, password='******') response = client.post(project_publish_url, data) assert response.status_code == 403 client.login(username=staff_user, password='******') response = client.post(project_publish_url, data) assert redirect_target(response) == 'project-edit'
def test_anonymous_cannot_delete(client, idea_factory): idea = idea_factory() url = reverse( 'idea-delete', kwargs={ 'slug': idea.slug }) response = client.post(url) assert response.status_code == 302 assert redirect_target(response) == 'account_login'