def test_update_user_story_timeline():
    user_watcher = factories.UserFactory()
    user_story = factories.UserStoryFactory.create(subject="test us timeline")
    history_services.take_snapshot(user_story, user=user_story.owner)
    user_story.add_watcher(user_watcher)
    user_story.subject = "test us timeline updated"
    user_story.save()
    history_services.take_snapshot(user_story, user=user_story.owner)
    project_timeline = service.get_project_timeline(user_story.project)
    assert project_timeline[0].event_type == "userstories.userstory.change"
    assert project_timeline[0].data["userstory"][
        "subject"] == "test us timeline updated"
    assert project_timeline[0].data["values_diff"]["subject"][
        0] == "test us timeline"
    assert project_timeline[0].data["values_diff"]["subject"][
        1] == "test us timeline updated"
    user_watcher_timeline = service.get_profile_timeline(user_watcher)
    assert user_watcher_timeline[
        0].event_type == "userstories.userstory.change"
    assert user_watcher_timeline[0].data["userstory"][
        "subject"] == "test us timeline updated"
    assert user_watcher_timeline[0].data["values_diff"]["subject"][
        0] == "test us timeline"
    assert user_watcher_timeline[0].data["values_diff"]["subject"][
        1] == "test us timeline updated"
def test_update_milestone_timeline():
    user_watcher = factories.UserFactory()
    milestone = factories.MilestoneFactory.create(
        name="test milestone timeline")
    history_services.take_snapshot(milestone, user=milestone.owner)
    milestone.add_watcher(user_watcher)
    milestone.name = "test milestone timeline updated"
    milestone.save()
    history_services.take_snapshot(milestone, user=milestone.owner)
    project_timeline = service.get_project_timeline(milestone.project)
    assert project_timeline[0].event_type == "milestones.milestone.change"
    assert project_timeline[0].data["milestone"][
        "name"] == "test milestone timeline updated"
    assert project_timeline[0].data["values_diff"]["name"][
        0] == "test milestone timeline"
    assert project_timeline[0].data["values_diff"]["name"][
        1] == "test milestone timeline updated"
    user_watcher_timeline = service.get_profile_timeline(user_watcher)
    assert user_watcher_timeline[0].event_type == "milestones.milestone.change"
    assert user_watcher_timeline[0].data["milestone"][
        "name"] == "test milestone timeline updated"
    assert user_watcher_timeline[0].data["values_diff"]["name"][
        0] == "test milestone timeline"
    assert user_watcher_timeline[0].data["values_diff"]["name"][
        1] == "test milestone timeline updated"
def test_assigned_to_user_story_timeline():
    membership = factories.MembershipFactory.create()
    user_story = factories.UserStoryFactory.create(subject="test us timeline",
                                                   assigned_to=membership.user,
                                                   project=membership.project)
    history_services.take_snapshot(user_story, user=user_story.owner)
    user_timeline = service.get_profile_timeline(user_story.assigned_to)
    assert user_timeline[0].event_type == "userstories.userstory.create"
    assert user_timeline[0].data["userstory"]["subject"] == "test us timeline"
def test_delete_project_timeline():
    project = factories.ProjectFactory.create(name="test project timeline")
    user_watcher = factories.UserFactory()
    project.add_watcher(user_watcher)
    history_services.take_snapshot(project, user=project.owner, delete=True)
    user_timeline = service.get_project_timeline(project)
    assert user_timeline[0].event_type == "projects.project.delete"
    assert user_timeline[0].data["project"]["id"] == project.id
    user_watcher_timeline = service.get_profile_timeline(user_watcher)
    assert user_watcher_timeline[0].event_type == "projects.project.delete"
    assert user_watcher_timeline[0].data["project"]["id"] == project.id
def test_delete_task_timeline():
    task = factories.TaskFactory.create(subject="test task timeline")
    user_watcher = factories.UserFactory()
    task.add_watcher(user_watcher)
    history_services.take_snapshot(task, user=task.owner, delete=True)
    project_timeline = service.get_project_timeline(task.project)
    assert project_timeline[0].event_type == "tasks.task.delete"
    assert project_timeline[0].data["task"]["subject"] == "test task timeline"
    user_watcher_timeline = service.get_profile_timeline(user_watcher)
    assert user_watcher_timeline[0].event_type == "tasks.task.delete"
    assert user_watcher_timeline[0].data["task"][
        "subject"] == "test task timeline"
def test_assigned_users_user_story_timeline():
    membership = factories.MembershipFactory.create()
    user_story = factories.UserStoryFactory.create(subject="test us timeline",
                                                   project=membership.project)
    history_services.take_snapshot(user_story, user=user_story.owner)
    user_timeline = service.get_profile_timeline(user_story.owner)

    assert user_timeline[0].event_type == "userstories.userstory.create"
    assert user_timeline[0].data["userstory"]["subject"] == "test us timeline"

    user_story.assigned_to = membership.user
    user_story.assigned_users = (membership.user, )
    user_story.save()

    history_services.take_snapshot(user_story, user=user_story.owner)

    user_timeline = service.get_profile_timeline(user_story.owner)

    assert user_timeline[0].event_type == "userstories.userstory.change"
    assert "assigned_to" not in user_timeline[0].data["values_diff"].keys()
    assert user_timeline[0].data["values_diff"]['assigned_users'] == \
        [None, membership.user.username]
def test_delete_wiki_page_timeline():
    page = factories.WikiPageFactory.create(slug="test wiki page timeline")
    user_watcher = factories.UserFactory()
    page.add_watcher(user_watcher)
    history_services.take_snapshot(page, user=page.owner, delete=True)
    project_timeline = service.get_project_timeline(page.project)
    assert project_timeline[0].event_type == "wiki.wikipage.delete"
    assert project_timeline[0].data["wikipage"][
        "slug"] == "test wiki page timeline"
    user_watcher_timeline = service.get_profile_timeline(user_watcher)
    assert user_watcher_timeline[0].event_type == "wiki.wikipage.delete"
    assert user_watcher_timeline[0].data["wikipage"][
        "slug"] == "test wiki page timeline"
def test_delete_issue_timeline():
    issue = factories.IssueFactory.create(subject="test issue timeline")
    user_watcher = factories.UserFactory()
    issue.add_watcher(user_watcher)
    history_services.take_snapshot(issue, user=issue.owner, delete=True)
    project_timeline = service.get_project_timeline(issue.project)
    assert project_timeline[0].event_type == "issues.issue.delete"
    assert project_timeline[0].data["issue"][
        "subject"] == "test issue timeline"
    user_watcher_timeline = service.get_profile_timeline(user_watcher)
    assert user_watcher_timeline[0].event_type == "issues.issue.delete"
    assert user_watcher_timeline[0].data["issue"][
        "subject"] == "test issue timeline"
def test_timeline_error_use_member_ids_instead_of_memberships_ids():
    user_story = factories.UserStoryFactory.create(
        subject="test error use member ids instead of "
        "memberships ids")

    member_user = user_story.owner
    external_user = factories.UserFactory.create()

    membership = factories.MembershipFactory.create(project=user_story.project,
                                                    user=member_user,
                                                    id=external_user.id)

    history_services.take_snapshot(user_story, user=member_user)

    user_timeline = service.get_profile_timeline(member_user)

    assert len(user_timeline) == 3
    assert user_timeline[0].event_type == "userstories.userstory.create"
    assert user_timeline[1].event_type == "projects.membership.create"
    assert user_timeline[2].event_type == "users.user.create"

    external_user_timeline = service.get_profile_timeline(external_user)
    assert len(external_user_timeline) == 1
    assert external_user_timeline[0].event_type == "users.user.create"
def test_delete_user_story_timeline():
    user_story = factories.UserStoryFactory.create(subject="test us timeline")
    user_watcher = factories.UserFactory()
    user_story.add_watcher(user_watcher)
    history_services.take_snapshot(user_story,
                                   user=user_story.owner,
                                   delete=True)
    project_timeline = service.get_project_timeline(user_story.project)
    assert project_timeline[0].event_type == "userstories.userstory.delete"
    assert project_timeline[0].data["userstory"][
        "subject"] == "test us timeline"
    user_watcher_timeline = service.get_profile_timeline(user_watcher)
    assert user_watcher_timeline[
        0].event_type == "userstories.userstory.delete"
    assert user_watcher_timeline[0].data["userstory"][
        "subject"] == "test us timeline"
def test_delete_milestone_timeline():
    milestone = factories.MilestoneFactory.create(
        name="test milestone timeline")
    user_watcher = factories.UserFactory()
    milestone.add_watcher(user_watcher)
    history_services.take_snapshot(milestone,
                                   user=milestone.owner,
                                   delete=True)
    project_timeline = service.get_project_timeline(milestone.project)
    assert project_timeline[0].event_type == "milestones.milestone.delete"
    assert project_timeline[0].data["milestone"][
        "name"] == "test milestone timeline"
    user_watcher_timeline = service.get_profile_timeline(user_watcher)
    assert user_watcher_timeline[0].event_type == "milestones.milestone.delete"
    assert user_watcher_timeline[0].data["milestone"][
        "name"] == "test milestone timeline"
def test_due_date_user_story_timeline():
    initial_due_date = datetime.now(pytz.utc) + timedelta(days=1)
    membership = factories.MembershipFactory.create()
    user_story = factories.UserStoryFactory.create(subject="test us timeline",
                                                   due_date=initial_due_date,
                                                   project=membership.project)
    history_services.take_snapshot(user_story, user=user_story.owner)

    new_due_date = datetime.now(pytz.utc) + timedelta(days=3)
    user_story.due_date = new_due_date
    user_story.save()

    history_services.take_snapshot(user_story, user=user_story.owner)
    user_timeline = service.get_profile_timeline(user_story.owner)

    assert user_timeline[0].event_type == "userstories.userstory.change"
    assert user_timeline[0].data["values_diff"]['due_date'] == [
        str(initial_due_date.date()),
        str(new_due_date.date())
    ]
def test_update_wiki_page_timeline():
    user_watcher = factories.UserFactory()
    page = factories.WikiPageFactory.create(slug="test wiki page timeline")
    history_services.take_snapshot(page, user=page.owner)
    page.add_watcher(user_watcher)
    page.slug = "test wiki page timeline updated"
    page.save()
    history_services.take_snapshot(page, user=page.owner)
    project_timeline = service.get_project_timeline(page.project)
    assert project_timeline[0].event_type == "wiki.wikipage.change"
    assert project_timeline[0].data["wikipage"][
        "slug"] == "test wiki page timeline updated"
    assert project_timeline[0].data["values_diff"]["slug"][
        0] == "test wiki page timeline"
    assert project_timeline[0].data["values_diff"]["slug"][
        1] == "test wiki page timeline updated"
    user_watcher_timeline = service.get_profile_timeline(user_watcher)
    assert user_watcher_timeline[0].event_type == "wiki.wikipage.change"
    assert user_watcher_timeline[0].data["wikipage"][
        "slug"] == "test wiki page timeline updated"
    assert user_watcher_timeline[0].data["values_diff"]["slug"][
        0] == "test wiki page timeline"
    assert user_watcher_timeline[0].data["values_diff"]["slug"][
        1] == "test wiki page timeline updated"
def test_update_task_timeline():
    user_watcher = factories.UserFactory()
    task = factories.TaskFactory.create(subject="test task timeline")
    history_services.take_snapshot(task, user=task.owner)
    task.add_watcher(user_watcher)
    task.subject = "test task timeline updated"
    task.save()
    history_services.take_snapshot(task, user=task.owner)
    project_timeline = service.get_project_timeline(task.project)
    assert project_timeline[0].event_type == "tasks.task.change"
    assert project_timeline[0].data["task"][
        "subject"] == "test task timeline updated"
    assert project_timeline[0].data["values_diff"]["subject"][
        0] == "test task timeline"
    assert project_timeline[0].data["values_diff"]["subject"][
        1] == "test task timeline updated"
    user_watcher_timeline = service.get_profile_timeline(user_watcher)
    assert user_watcher_timeline[0].event_type == "tasks.task.change"
    assert user_watcher_timeline[0].data["task"][
        "subject"] == "test task timeline updated"
    assert user_watcher_timeline[0].data["values_diff"]["subject"][
        0] == "test task timeline"
    assert user_watcher_timeline[0].data["values_diff"]["subject"][
        1] == "test task timeline updated"
def test_update_issue_timeline():
    user_watcher = factories.UserFactory()
    issue = factories.IssueFactory.create(subject="test issue timeline")
    history_services.take_snapshot(issue, user=issue.owner)
    issue.add_watcher(user_watcher)
    issue.subject = "test issue timeline updated"
    issue.save()
    history_services.take_snapshot(issue, user=issue.owner)
    project_timeline = service.get_project_timeline(issue.project)
    assert project_timeline[0].event_type == "issues.issue.change"
    assert project_timeline[0].data["issue"][
        "subject"] == "test issue timeline updated"
    assert project_timeline[0].data["values_diff"]["subject"][
        0] == "test issue timeline"
    assert project_timeline[0].data["values_diff"]["subject"][
        1] == "test issue timeline updated"
    user_watcher_timeline = service.get_profile_timeline(user_watcher)
    assert user_watcher_timeline[0].event_type == "issues.issue.change"
    assert user_watcher_timeline[0].data["issue"][
        "subject"] == "test issue timeline updated"
    assert user_watcher_timeline[0].data["values_diff"]["subject"][
        0] == "test issue timeline"
    assert user_watcher_timeline[0].data["values_diff"]["subject"][
        1] == "test issue timeline updated"
def test_update_project_timeline():
    user_watcher = factories.UserFactory()
    project = factories.ProjectFactory.create(name="test project timeline")
    history_services.take_snapshot(project, user=project.owner)
    project.add_watcher(user_watcher)
    project.name = "test project timeline updated"
    project.save()
    history_services.take_snapshot(project, user=project.owner)
    project_timeline = service.get_project_timeline(project)
    assert project_timeline[0].event_type == "projects.project.change"
    assert project_timeline[0].data["project"][
        "name"] == "test project timeline updated"
    assert project_timeline[0].data["values_diff"]["name"][
        0] == "test project timeline"
    assert project_timeline[0].data["values_diff"]["name"][
        1] == "test project timeline updated"
    user_watcher_timeline = service.get_profile_timeline(user_watcher)
    assert user_watcher_timeline[0].event_type == "projects.project.change"
    assert user_watcher_timeline[0].data["project"][
        "name"] == "test project timeline updated"
    assert user_watcher_timeline[0].data["values_diff"]["name"][
        0] == "test project timeline"
    assert user_watcher_timeline[0].data["values_diff"]["name"][
        1] == "test project timeline updated"