def test_canGetTimeUpdatedAt(self):
     story = Story()
     story.updated_at = 1240433216
     timezone = UTC()
     item = PivotalTrackerItem(story, timezone)
     self.assertEqual("2009/04/22 20:46:56", item.updatedAt().strftime("%Y/%m/%d %H:%M:%S"))
     self.assertEqual(None, item.updatedAt().tzinfo)
예제 #2
0
 def test_cannotSetOwnerForStory(self):
     story = Story()
     owner = "me"
     story.SetOwnedBy(owner)
     item = PivotalTrackerItem(story)
     item.withOwner(PivotalUser(owner))
     self.assertEqual([], item.decoratedStory().UPDATE_FIELDS)
예제 #3
0
 def test_cannotSetRequestorForStory(self):
     story = Story()
     requestor = "me"
     story.SetRequestedBy(requestor)
     item = PivotalTrackerItem(story)
     item.withRequestor(PivotalUser(requestor))
     self.assertEqual([], item.decoratedStory().UPDATE_FIELDS)
 def test_whenCommentAddedStoryIsAvailableToUpdate(self):
     story = Story()
     story.story_id = 1234
     item = PivotalTrackerItem(story)
     comment = "blah"
     item.addComment(comment)
     storyToBeUpdated = item.decoratedStory()
     self.assertEqual(story.story_id, storyToBeUpdated.GetStoryId())
예제 #5
0
 def test_cannotSetNoneTypeForStory(self):
     story = Story()
     defaultStoryType = "feature"
     story.SetStoryType(defaultStoryType)
     item = PivotalTrackerItem(story)
     item.withType(None)
     self.assertEqual(story.GetStoryType(), defaultStoryType)
     self.assertEqual([], item.decoratedStory().UPDATE_FIELDS)
예제 #6
0
 def test_cannotAddNoneStatus(self):
     story = Story()
     startingStatus = "unscheduled"
     story.SetCurrentState(startingStatus)
     item = PivotalTrackerItem(story)
     item.withStatus(None)
     self.assertEqual(startingStatus, item.status().pivotal())
     self.assertEqual([], item.decoratedStory().UPDATE_FIELDS)
 def test_retryWhenTryingToGetStoriesAndException(self):
     tracker = self.makeValidTracker()
     trackerInstance = self.trackerInstance_
     when(trackerInstance).GetStories(any()).thenRaise(
         Exception("")).thenReturn([Story(), Story()])
     when(trackerInstance).GetComments(any()).thenReturn([])
     next(tracker.items())
     verify(trackerInstance, times=2).GetStories(any())
예제 #8
0
 def test_canGetTimeUpdatedAt(self):
     story = Story()
     story.updated_at = 1240433216
     timezone = UTC()
     item = PivotalTrackerItem(story, timezone)
     self.assertEqual("2009/04/22 20:46:56",
                      item.updatedAt().strftime("%Y/%m/%d %H:%M:%S"))
     self.assertEqual(None, item.updatedAt().tzinfo)
예제 #9
0
 def test_whenCommentAddedStoryIsAvailableToUpdate(self):
     story = Story()
     story.story_id = 1234
     item = PivotalTrackerItem(story)
     comment = "blah"
     item.addComment(comment)
     storyToBeUpdated = item.decoratedStory()
     self.assertEqual(story.story_id, storyToBeUpdated.GetStoryId())
예제 #10
0
 def test_doNotUpdateJiraKeyOnStoryWhenUpdatedWithDuplicate(self):
     story = Story()
     updateJiraId = "TEST-12345"
     story.jira_id = updateJiraId
     item = PivotalTrackerItem(story)
     item.withJiraKey(updateJiraId)
     storyToUpdate = item.decoratedStory()
     self.assertEqual(None, storyToUpdate.GetName())
     self.assertEqual([], storyToUpdate.UPDATE_FIELDS)
 def test_doNotUpdateJiraUrlOnStoryWhenUpdatedWithDuplicate(self):
     story = Story()
     updateUrl = "http://www.updated.com"
     story.jira_url = updateUrl
     item = PivotalTrackerItem(story)
     item.withJiraUrl(updateUrl)
     storyToUpdate = item.decoratedStory()
     self.assertEqual(None, storyToUpdate.GetDescription())
     self.assertEqual([], storyToUpdate.UPDATE_FIELDS)
 def test_summaryAndDescriptionValidForItemWhenSeededWithExistingValidStorySummaryAndDescription(self):
     story = Story()
     description = "Hello World"
     summary = "HW"
     story.description = description
     story.name = summary
     item = PivotalTrackerItem(story)
     self.assertEqual(item.summary(), summary)
     self.assertEqual(item.description(), description)
 def test_canGetStoriesFromProject(self):
     tracker = self.makeValidTracker()
     trackerInstance = self.trackerInstance_
     when(trackerInstance).GetStories(any()).thenReturn([Story(), Story()])
     when(trackerInstance).GetComments(any()).thenReturn([])
     itemIterator = tracker.items()
     next(itemIterator)
     next(itemIterator)
     self.assertRaises(StopIteration, next, itemIterator)
 def test_doNotUpdateJiraKeyOnStoryWhenUpdatedWithDuplicate(self):
     story = Story()
     updateJiraId = "TEST-12345"
     story.jira_id = updateJiraId
     item = PivotalTrackerItem(story)
     item.withJiraKey(updateJiraId)
     storyToUpdate = item.decoratedStory()
     self.assertEqual(None, storyToUpdate.GetName())
     self.assertEqual([], storyToUpdate.UPDATE_FIELDS)
예제 #15
0
 def test_doNotUpdateJiraUrlOnStoryWhenUpdatedWithDuplicate(self):
     story = Story()
     updateUrl = "http://www.updated.com"
     story.jira_url = updateUrl
     item = PivotalTrackerItem(story)
     item.withJiraUrl(updateUrl)
     storyToUpdate = item.decoratedStory()
     self.assertEqual(None, storyToUpdate.GetDescription())
     self.assertEqual([], storyToUpdate.UPDATE_FIELDS)
예제 #16
0
 def test_whenTryingToChangeStatusToDuplicateStatusNoUpdateIsMade(self):
     summary = "summary"
     story = Story()
     story.SetName(summary)
     item = PivotalTrackerItem(story)
     item.withSummary(summary)
     storyToUpdate = item.decoratedStory()
     self.assertEqual(None, storyToUpdate.GetName())
     self.assertEqual([], storyToUpdate.UPDATE_FIELDS)
예제 #17
0
 def test_whenTryingToChangeDescriptionToDuplicateDescriptionNoUpdateIsMade(
         self):
     description = "description"
     story = Story()
     story.SetDescription(description)
     item = PivotalTrackerItem(story)
     item.withDescription(description)
     storyToUpdate = item.decoratedStory()
     self.assertEqual(None, storyToUpdate.GetDescription())
     self.assertEqual([], storyToUpdate.UPDATE_FIELDS)
 def test_canUpdateJiraUrlOnStory(self):
     story = Story()
     story.jira_url = "http://www.test.com"
     updateUrl = "http://www.updated.com"
     item = PivotalTrackerItem(story)
     item.withJiraUrl(updateUrl)
     self.assertEqual(item.jiraUrl(), updateUrl)
     storyToUpdate = item.decoratedStory()
     self.assertEqual(updateUrl+"\nNone", storyToUpdate.GetDescription())
     self.assertTrue('description' in storyToUpdate.UPDATE_FIELDS)
예제 #19
0
 def test_canUpdateJiraUrlOnStory(self):
     story = Story()
     story.jira_url = "http://www.test.com"
     updateUrl = "http://www.updated.com"
     item = PivotalTrackerItem(story)
     item.withJiraUrl(updateUrl)
     self.assertEqual(item.jiraUrl(), updateUrl)
     storyToUpdate = item.decoratedStory()
     self.assertEqual(updateUrl + "\nNone", storyToUpdate.GetDescription())
     self.assertTrue('description' in storyToUpdate.UPDATE_FIELDS)
예제 #20
0
 def test_itemConstructedWithDecoratedStoryWithJiraKeyGetsValidSummary(
         self):
     story = Story()
     jiraKey = "TEST-pti1234"
     summary = "summary"
     decoratedSummary = "[TEST-pti1234]: summary"
     story.SetName(decoratedSummary)
     item = PivotalTrackerItem(story)
     self.assertEqual(item.summary(), summary)
     self.assertEqual(item.jiraKey(), jiraKey)
 def test_canUpdateJiraKeyOnStory(self):
     story = Story()
     story.jira_id = "TEST-pti1234"
     updateJiraId = "TEST-12345"
     item = PivotalTrackerItem(story)
     item.withJiraKey(updateJiraId)
     self.assertEqual(item.jiraKey(), updateJiraId)
     storyToUpdate = item.decoratedStory()
     self.assertEqual("[" + updateJiraId + "]: None", storyToUpdate.GetName())
     self.assertTrue('name' in storyToUpdate.UPDATE_FIELDS)
예제 #22
0
 def test_itemConstructedWithDecoratedStoryWithJiraKeyGetsValidDescriptionWithHTTPS(
         self):
     story = Story()
     jiraUrl = "https://www.jira.com/TEST-pa1234"
     description = "this is a test\nwith\nmultiple\nlines"
     decoratedDescription = "https://www.jira.com/TEST-pa1234\n" + description
     story.SetDescription(decoratedDescription)
     item = PivotalTrackerItem(story)
     self.assertEqual(item.description(), description)
     self.assertEqual(item.jiraUrl(), jiraUrl)
예제 #23
0
 def test_summaryAndDescriptionValidForItemWhenSeededWithExistingValidStorySummaryAndDescription(
         self):
     story = Story()
     description = "Hello World"
     summary = "HW"
     story.description = description
     story.name = summary
     item = PivotalTrackerItem(story)
     self.assertEqual(item.summary(), summary)
     self.assertEqual(item.description(), description)
예제 #24
0
 def test_canSetTypeForStory(self):
     story = Story()
     defaultStoryType = "feature"
     story.SetStoryType(defaultStoryType)
     item = PivotalTrackerItem(story)
     self.assertEqual(defaultStoryType, item.type())
     type = "bug"
     item.withType(type)
     self.assertEqual(story.GetStoryType(), type)
     self.assertEqual(type, item.type())
     self.assertTrue('story_type' in item.decoratedStory().UPDATE_FIELDS)
 def test_previouslyExistingJiraInformationIsNotOverwritternBecauseDecoratedStoryDoesNotYetContainIt(self):
     story = Story()
     jiraId = "blah"
     jiraUrl = "blah2"
     story.jira_id = jiraId
     story.jira_url = jiraUrl
     story.SetName("name")
     story.SetDescription("description")
     item = PivotalTrackerItem(story)
     self.assertEqual(item.jiraKey(), jiraId)
     self.assertEqual(item.jiraUrl(), jiraUrl)
예제 #26
0
 def test_canUpdateJiraKeyOnStory(self):
     story = Story()
     story.jira_id = "TEST-pti1234"
     updateJiraId = "TEST-12345"
     item = PivotalTrackerItem(story)
     item.withJiraKey(updateJiraId)
     self.assertEqual(item.jiraKey(), updateJiraId)
     storyToUpdate = item.decoratedStory()
     self.assertEqual("[" + updateJiraId + "]: None",
                      storyToUpdate.GetName())
     self.assertTrue('name' in storyToUpdate.UPDATE_FIELDS)
예제 #27
0
 def test_canSetStatusForStory(self):
     story = Story()
     startingStatus = "unscheduled"
     story.SetCurrentState(startingStatus)
     accepted = "Accepted"
     item = PivotalTrackerItem(story)
     self.assertEqual(startingStatus, item.status().pivotal())
     status = mock()
     when(status).pivotal().thenReturn(accepted)
     item.withStatus(status)
     self.assertEqual(story.GetCurrentState(), accepted)
     self.assertEqual(status, item.status())
     self.assertTrue('current_state' in item.decoratedStory().UPDATE_FIELDS)
 def test_canDeleteAllItems(self):
     tracker = self.makeValidTracker()
     trackerInstance = self.trackerInstance_
     item1 = Story()
     item1.story_id = 1234
     item2 = Story()
     item2.story_id = 12345
     when(trackerInstance).GetStories(any()).thenReturn([item1,item2])
     when(trackerInstance).GetComments(any()).thenReturn([])
     tracker.deleteAllItems()
     verify(trackerInstance).DeleteStory(item1.story_id)
     verify(trackerInstance).DeleteStory(item2.story_id)
     pass
 def test_gettingItemAlsoGetsCommentsForItem(self):
     tracker = self.makeValidTracker()
     trackerInstance = self.trackerInstance_
     story1 = Story()
     story1.story_id = 1234
     story2 = Story()
     story2.story_id = 1235
     when(trackerInstance).GetStories(any()).thenReturn([story1,story2])
     when(trackerInstance).GetComments(any()).thenReturn([])
     itemIterator = tracker.items()
     next(itemIterator)
     next(itemIterator)
     inorder.verify(trackerInstance).GetStories(any())
     inorder.verify(trackerInstance).GetComments(story1.GetStoryId())
     inorder.verify(trackerInstance).GetComments(story2.GetStoryId())
예제 #30
0
 def test_itemWithoutJiraInfoDoesNotDecorate(self):
     item = PivotalTrackerItem(Story())
     description = "description"
     summary = "summary"
     item.withDescription(description)
     item.withSummary(summary)
     self.assertEqual(item.decoratedStory().GetDescription(), description)
     self.assertEqual(item.decoratedStory().GetName(), summary)
 def test_canAddStoryToPivotal(self):
     tracker = self.pivotal_
     name = "test_canAddStoryToPivotal"
     description = "this is a test"
     item = PivotalTrackerItem(
         Story()).withSummary(name).withDescription(description)
     tracker.update(item)
     item = next(tracker.items())
     self.assertEqual(item.summary(), name)
     self.assertEqual(item.description(), description)
 def test_gettingItemAlsoGetsCommentsForItem(self):
     tracker = self.makeValidTracker()
     trackerInstance = self.trackerInstance_
     story1 = Story()
     story1.story_id = 1234
     story2 = Story()
     story2.story_id = 1235
     when(trackerInstance).GetStories(any()).thenReturn([story1, story2])
     when(trackerInstance).GetComments(any()).thenReturn([])
     itemIterator = tracker.items()
     next(itemIterator)
     next(itemIterator)
     inorder.verify(trackerInstance).GetStories(any())
     inorder.verify(trackerInstance).GetComments(story1.GetStoryId())
     inorder.verify(trackerInstance).GetComments(story2.GetStoryId())
예제 #33
0
 def test_previouslyExistingJiraInformationIsNotOverwritternBecauseDecoratedStoryDoesNotYetContainIt(
         self):
     story = Story()
     jiraId = "blah"
     jiraUrl = "blah2"
     story.jira_id = jiraId
     story.jira_url = jiraUrl
     story.SetName("name")
     story.SetDescription("description")
     item = PivotalTrackerItem(story)
     self.assertEqual(item.jiraKey(), jiraId)
     self.assertEqual(item.jiraUrl(), jiraUrl)
 def test_canDeleteAllItems(self):
     tracker = self.makeValidTracker()
     trackerInstance = self.trackerInstance_
     item1 = Story()
     item1.story_id = 1234
     item2 = Story()
     item2.story_id = 12345
     when(trackerInstance).GetStories(any()).thenReturn([item1, item2])
     when(trackerInstance).GetComments(any()).thenReturn([])
     tracker.deleteAllItems()
     verify(trackerInstance).DeleteStory(item1.story_id)
     verify(trackerInstance).DeleteStory(item2.story_id)
     pass
 def itemWithComments(self, testing):
     issue = Story()
     issue.story_id = "1234"
     return testing.itemWithCommentsOfType(PivotalComment,
                                           PivotalTrackerItem, issue)
 def itemWithComments(self, testing):
     issue = Story()
     issue.story_id = "1234"
     return testing.itemWithCommentsOfType(PivotalComment, PivotalTrackerItem, issue)
 def decoratedStory(self):
     story = Story()
     if self.needToUpdate_:
         story = self._storyWithJiraInfo()        
     story.UPDATE_FIELDS = self.piecesToUpdate_
     return story
예제 #38
0
 def decoratedStory(self):
     story = Story()
     if self.needToUpdate_:
         story = self._storyWithJiraInfo()
     story.UPDATE_FIELDS = self.piecesToUpdate_
     return story
예제 #39
0
    def handle_message(self, campfire, room, message, speaker):
        project_name = room.data['name']
        tracker = Tracker(self.map, self.auth)
        body = message['body']

        if not body:
            return

        m = re.match(
            'pt story create "(?P<title>.*)" "(?P<description>.*)" (?P<type>.*)$',
            body)
        if m:
            story = Story()
            story.SetRequestedBy(speaker['user']['name'])
            story.SetName(m.group('title'))
            story.SetDescription(m.group('description'))
            story.SetStoryType(m.group('type'))
            new_story = tracker.AddNewStory(story)
            self.speak_new_story(room, new_story, speaker)
            return

        m = re.match(
            "pt getmine (?P<state>started|finished|delivered|accepted|rejected|unstarted|unscheduled)$",
            body)
        if m:
            stories = tracker.GetStories(
                'owner:"%s" state:%s' %
                (speaker['user']['name'], m.group('state')))
            if len(stories) > 0:
                speak_text = "%s: Here are your stories:\r\n" % speaker[
                    'user']['name']
                room.speak(speak_text)
                speak_text = ''
                for story in stories:
                    speak_text += '[#%i] "%s" (%s)\r\n\r\n' % (
                        story.GetStoryId(), story.GetName(), story.GetUrl())
                room.paste(speak_text)
            else:
                speak_text = "%s: You have no stories matching that query." % speaker[
                    'user']['name']
                room.speak(speak_text)
            return

        m = re.match("pt start #?(?P<id>\d+)$", body)
        if m:
            story = tracker.GetStory(int(m.group('id')))
            story.SetCurrentState('started')
            story.SetOwnedBy(speaker['user']['name'])
            tracker.UpdateStory(story)
            room.speak("%s: [#%i] started by you! Get to work!" %
                       (speaker['user']['name'], story.GetStoryId()))
            return

        m = re.match(
            "pt (?P<command>start|tell) next (?P<story_type>bug|feature|chore)(\s+)?(?P<mine>mine)?",
            body)
        if m:
            filter = "type:%s state:unstarted" % m.group('story_type')
            if m.group('mine') == 'mine':
                filter += ' owner:"%s"' % speaker['user']['name']
            try:
                next = tracker.GetStories(filter)[0]
            except IndexError:
                room.speak("%s: There were no stories matching your query." %
                           speaker['user']['name'])

            if m.group('command') == 'start':
                next.SetCurrentState('started')
                next.SetOwnedBy(speaker['user']['name'])
                tracker.UpdateStory(next)
                room.speak("%s: [#%i] started by you! Get to work!" %
                           (speaker['user']['name'], next.GetStoryId()))
            elif m.group('command') == 'tell':
                room.speak("%s: [#%i] %s (%s)" %
                           (speaker['user']['name'], next.GetStoryId(),
                            next.GetName(), next.GetUrl()))
            return
 def test_canGetId(self):
     story = Story()
     story.story_id = 1234
     item = PivotalTrackerItem(story)
     self.assertEqual(item.Id(), story.story_id)
     pass
예제 #41
0
 def test_canGetId(self):
     story = Story()
     story.story_id = 1234
     item = PivotalTrackerItem(story)
     self.assertEqual(item.Id(), story.story_id)
     pass