public void Apply(SyncPlan syncPlan, bool isAgreed) { var source = Substitute.For <IExternalWorksheetRepository>(); var target = Substitute.For <IJiraRepository>(); var sut = new WorksheetSyncService(source, target) { AgreeToAdd = (items) => isAgreed, AgreeToUpdate = (items) => isAgreed, AgreeToDeleteDuplicates = (items) => isAgreed, AgreeToDeleteOrphaned = (items) => isAgreed }; var report = sut.Apply(syncPlan); //assert that appropriate operation took place only if agreed target.Received(isAgreed ? syncPlan.ToAdd.Count : 0).AddWorkLog(Arg.Any <WorkLogEntry>()); target.Received(isAgreed ? syncPlan.ToUpdate.Count : 0).UpdateWorkLog(Arg.Any <WorkLogEntry>()); target.Received(isAgreed ? syncPlan.ToDeleteDuplicates.Count + syncPlan.ToDeleteOrphaned.Count : 0).DeleteWorkLog(Arg.Any <WorkLogEntry>()); //sert report reflect the numbers Assert.AreEqual(report.AddedEntries.Count, isAgreed ? syncPlan.ToAdd.Count : 0); Assert.AreEqual(report.UpdatedEntries.Count, isAgreed ? syncPlan.ToUpdate.Count : 0); Assert.AreEqual(report.DeletedDuplicateEntries.Count, isAgreed ? syncPlan.ToDeleteDuplicates.Count : 0); Assert.AreEqual(report.DeletedOrphanedEntries.Count, isAgreed ? syncPlan.ToDeleteOrphaned.Count : 0); Assert.AreEqual(report.NoChanges.Count, syncPlan.NoChanges.Count); }
public void CanGetUniqueJiraIncidentsFromWorkLogEntries() { var source = Substitute.For <IWorksheetSourceService>(); source .GetEntries(new DateTime(2010, 01, 01), new DateTime(2010, 01, 14)) .Returns(new[] { new WorkLogEntry { Description = "KEY-123: This is some stuff I'm doing" } }); var target = Substitute.For <IWorksheetTargetService>(); target .LoadIssues(Arg.Any <IEnumerable <string> >()) .Returns(new[] { new Issue { Key = "KEY-123", Summary = "Create the new gizmo" } }); var service = new WorksheetSyncService(source, target, new[] { "KEY" }); var suggestions = service.GetSuggestions(new DateTime(2010, 01, 01), new DateTime(2010, 01, 14)).ToArray(); Assert.AreEqual(suggestions.Length, 1); Assert.AreEqual(suggestions[0].Key, "KEY-123"); Assert.AreEqual(suggestions[0].Summary, "Create the new gizmo"); Assert.AreEqual(suggestions[0].WorkLog.Count, 1); Assert.AreEqual(suggestions[0].WorkLog[0].Description, "This is some stuff I'm doing"); }
static void Main(string[] args) { var togglApiKey = ConfigurationHelper.GetEncryptedValueFromConfig("toggl-api-key", () => AskFor("Toggl API Key")); var toggl = new TogglService(togglApiKey); Console.WriteLine("Toggl: Connected as {0}", toggl.GetUserInformation()); var jiraInstance = ConfigurationHelper.GetValueFromConfig("jira-instance", () => AskFor("JIRA Instance")); var jiraUsername = ConfigurationHelper.GetValueFromConfig("jira-username", () => AskFor("JIRA Username")); var jiraPassword = ConfigurationHelper.GetEncryptedValueFromConfig("jira-password", () => AskFor("JIRA Password")); var jiraKeyPrefixes = ConfigurationHelper.GetValueFromConfig("jira-prefixes", () => AskFor("JIRA Prefixes without the hyphen (comma-separated)")); var jiraWorklogStrategy = ConfigurationHelper.GetValueFromConfig("jira-worklogStrategy", () => AskFor("JIRA Worklog strategy (AutoAdjustRemainingEstimate, RetainRemainingEstimate (default))")); var jira = new JiraRestService(jiraInstance, jiraUsername, jiraPassword, jiraWorklogStrategy); Console.WriteLine("JIRA: Connected as {0}", jira.GetUserInformation()); var syncDays = int.Parse(ConfigurationHelper.GetValueFromConfig("syncDays", () => AskFor("Sync how many days"))); var roundingToMinutes = int.Parse(ConfigurationHelper.GetValueFromConfig("roundingToMinutes", () => AskFor("Round duration to X minutes"))); var sync = new WorksheetSyncService(toggl, jira, jiraKeyPrefixes.Split(',')); var suggestions = sync.GetSuggestions(DateTime.Now.Date.AddDays(-syncDays), DateTime.Now.Date.AddDays(1)).ToList(); suggestions.ForEach(x => x.WorkLog.ForEach(y => y.Round(roundingToMinutes))); var entriesToSync = new List <WorkLogEntry>(); foreach (var issue in suggestions) { var issueTitle = issue.ToString(); Console.WriteLine(issueTitle); Console.WriteLine(new String('=', issueTitle.Length)); foreach (var entry in issue.WorkLog.Where(entry => entry.RoundedDuration.Ticks > 0)) { Console.Write(entry + " (y/n)"); if (Console.ReadKey(true).KeyChar == 'y') { entriesToSync.Add(entry); Console.Write(" Done"); } Console.WriteLine(); } Console.WriteLine(); } if (!entriesToSync.Any()) { return; } Console.WriteLine(); Console.Write("Send to Jira? (y/n)"); if (Console.ReadKey(true).KeyChar == 'y') { foreach (var entry in entriesToSync) { sync.AddWorkLog(entry); } } }
public static void Main(string[] args) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; var togglApiKey = ConfigurationHelper.GetEncryptedValueFromConfig("toggl-api-key", () => AskFor("Toggl API Key")); var jiraWorkItemDescriptionTemplate = ConfigurationHelper.GetValueFromConfig( "jira-decription-template", () => AskFor($"JIRA Description template (default: '{DefaultDescriptionTemplate}')"), DefaultDescriptionTemplate, v => { if (v.Contains("{{toggl:id}}")) { return(true); } Console.Error.WriteLine("Error: Template must contain placeholder for toggl time entry id: {{toggl:id}}"); return(false); }); //if number of dependencies grows, we will need to use a container var toggl = new TogglRepository( new TimeEntryService(togglApiKey), new UserService(togglApiKey), jiraWorkItemDescriptionTemplate); Console.WriteLine("Toggl: Connected as {0}", toggl.GetUserInformation()); var jiraInstance = ConfigurationHelper.GetValueFromConfig( "jira-instance", () => AskFor("JIRA Instance"), null, value => { Uri url; if (Uri.TryCreate(value, UriKind.Absolute, out url)) { return(true); } Console.Error.WriteLine("Error: The JIRA instance must be a valid HTTP address (e.g. https://(yourcompany).atlassian.net)"); return(false); }); var jiraUsername = ConfigurationHelper.GetValueFromConfig("jira-username", () => AskFor("JIRA Username")); var jiraPassword = ConfigurationHelper.GetEncryptedValueFromConfig("jira-password", () => AskFor("JIRA Password")); var jiraKeyPrefixes = ConfigurationHelper.GetValueFromConfig("jira-prefixes", () => AskFor("JIRA Prefixes without the hyphen (comma-separated)")); var doPurge = ConfigurationHelper.GetValueFromConfig( "jira-purge", () => AskFor("Purge JIRA from orphaned and out-of-sync work log items? (y/n)"), "n", value => value == "y" || value == "n" ); var jira = new JiraRestService(jiraInstance, jiraUsername, jiraPassword); Console.WriteLine("JIRA: Connected as {0}", jira.GetUserInformation()); var syncDays = int.Parse(ConfigurationHelper.GetValueFromConfig("syncDays", () => AskFor("Sync how many days"))); var roundingToMinutes = int.Parse(ConfigurationHelper.GetValueFromConfig("roundingToMinutes", () => AskFor("Round duration to X minutes"))); var sync = new WorksheetSyncService(toggl, jira); sync.AgreeToAdd = workLogEntries => ConsoleHelper.Confirm($"***NEW work log entries***\n{string.Join(Environment.NewLine, workLogEntries)}\nADD {workLogEntries.Count()} NEW work log entries?"); sync.AgreeToDeleteDuplicates = workLogEntries => ConsoleHelper.Confirm($"***DUPLICATE work log entries***\n{string.Join(Environment.NewLine, workLogEntries)}\nDELETE {workLogEntries.Count()} DUPLICATE work log entries?"); sync.AgreeToDeleteOrphaned = workLogEntries => ConsoleHelper.Confirm($"***ORPHANED work log entries***\n{string.Join(Environment.NewLine, workLogEntries)}\nDELETE {workLogEntries.Count()} ORPHANED work log entries?"); sync.AgreeToUpdate = workLogEntries => ConsoleHelper.Confirm($"***CHANGED work log entries***\n{string.Join(Environment.NewLine, workLogEntries)}\nUPDATE {workLogEntries.Count()} CHANGED work log entries?"); var syncReport = sync.Syncronize( DateTime.Now.Date.AddDays(-syncDays), DateTime.Now.Date.AddDays(1), jiraKeyPrefixes.Split(','), doPurge == "y", roundingToMinutes ); Console.WriteLine(); Console.WriteLine(); Console.WriteLine(syncReport.ToString()); Console.WriteLine("Press any key to exit."); Console.ReadKey(); }
public void CreateSyncPlan(WorkLogEntry[] sourceEntries, WorkLogEntry[] targetEntries, bool doPurge, SyncPlan expectedResult) { var result = WorksheetSyncService.CreateSyncPlan(sourceEntries, targetEntries, doPurge); result.ShouldBeEquivalentTo(expectedResult); }