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)
def test_cannotSetOwnerForStory(self): story = Story() owner = "me" story.SetOwnedBy(owner) item = PivotalTrackerItem(story) item.withOwner(PivotalUser(owner)) self.assertEqual([], item.decoratedStory().UPDATE_FIELDS)
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())
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)
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())
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_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)
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)
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)
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)
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)
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_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)
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())
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())
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 decoratedStory(self): story = Story() if self.needToUpdate_: story = self._storyWithJiraInfo() story.UPDATE_FIELDS = self.piecesToUpdate_ return story
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