diff --git a/src/TableauSharp/Common/Models/ErrorResponse.cs b/src/TableauSharp/Common/Models/ErrorResponse.cs index bde5431..9d645fd 100644 --- a/src/TableauSharp/Common/Models/ErrorResponse.cs +++ b/src/TableauSharp/Common/Models/ErrorResponse.cs @@ -5,11 +5,11 @@ namespace TableauSharp.Common.Models; public class ErrorResponse { [JsonPropertyName("code")] - public string Code { get; set; } + public string Code { get; set; } = string.Empty; [JsonPropertyName("summary")] - public string Summary { get; set; } + public string Summary { get; set; } = string.Empty; [JsonPropertyName("detail")] - public string Detail { get; set; } -} \ No newline at end of file + public string Detail { get; set; } = string.Empty; +} diff --git a/src/TableauSharp/Embedding/Models/TrustedTicketRequest.cs b/src/TableauSharp/Embedding/Models/TrustedTicketRequest.cs index 1e19dc8..f0350a3 100644 --- a/src/TableauSharp/Embedding/Models/TrustedTicketRequest.cs +++ b/src/TableauSharp/Embedding/Models/TrustedTicketRequest.cs @@ -2,7 +2,7 @@ namespace TableauSharp.Embedding.Models; public class TrustedTicketRequest { - public string Username { get; set; } - public string ClientIp { get; set; } - public string TargetSite { get; set; } -} \ No newline at end of file + public string Username { get; set; } = string.Empty; + public string? ClientIp { get; set; } + public string? TargetSite { get; set; } +} diff --git a/src/TableauSharp/Embedding/Models/TrustedTicketResponse.cs b/src/TableauSharp/Embedding/Models/TrustedTicketResponse.cs index 4733ee5..cb231c2 100644 --- a/src/TableauSharp/Embedding/Models/TrustedTicketResponse.cs +++ b/src/TableauSharp/Embedding/Models/TrustedTicketResponse.cs @@ -2,6 +2,6 @@ namespace TableauSharp.Embedding.Models; public class TrustedTicketResponse { - public string TicketId { get; set; } - public string EmbedUrl { get; set; } -} \ No newline at end of file + public string TicketId { get; set; } = string.Empty; + public string EmbedUrl { get; set; } = string.Empty; +} diff --git a/src/TableauSharp/Embedding/Services/EmbeddingService.cs b/src/TableauSharp/Embedding/Services/EmbeddingService.cs index 75269b0..b06ab0c 100644 --- a/src/TableauSharp/Embedding/Services/EmbeddingService.cs +++ b/src/TableauSharp/Embedding/Services/EmbeddingService.cs @@ -40,10 +40,14 @@ public async Task GetTrustedTicketAsync(TrustedTicketRequ var form = new Dictionary { - { "username", request.Username }, - { "target_site", request.TargetSite } + { "username", request.Username } }; + if (!string.IsNullOrEmpty(request.TargetSite)) + { + form.Add("target_site", request.TargetSite); + } + if (!string.IsNullOrEmpty(request.ClientIp)) { form.Add("client_ip", request.ClientIp); diff --git a/src/TableauSharp/Permissions/Models/PermissionCapabilityAssignment.cs b/src/TableauSharp/Permissions/Models/PermissionCapabilityAssignment.cs index b91493a..72f5c30 100644 --- a/src/TableauSharp/Permissions/Models/PermissionCapabilityAssignment.cs +++ b/src/TableauSharp/Permissions/Models/PermissionCapabilityAssignment.cs @@ -9,5 +9,5 @@ public class PermissionCapabilityAssignment public PermissionCapability Capability { get; set; } [JsonPropertyName("mode")] - public string Mode { get; set; } // "Allow" or "Deny" -} \ No newline at end of file + public string Mode { get; set; } = string.Empty; // "Allow" or "Deny" +} diff --git a/src/TableauSharp/Permissions/Models/PermissionSyncRequest.cs b/src/TableauSharp/Permissions/Models/PermissionSyncRequest.cs index b876c1a..21f1a59 100644 --- a/src/TableauSharp/Permissions/Models/PermissionSyncRequest.cs +++ b/src/TableauSharp/Permissions/Models/PermissionSyncRequest.cs @@ -2,6 +2,6 @@ namespace TableauSharp.Permissions.Models; public class PermissionSyncRequest { - public string TargetId { get; set; } + public string TargetId { get; set; } = string.Empty; public List Permissions { get; set; } = new(); -} \ No newline at end of file +} diff --git a/src/TableauSharp/Permissions/Models/TableauPermission.cs b/src/TableauSharp/Permissions/Models/TableauPermission.cs index 99788a6..51e598c 100644 --- a/src/TableauSharp/Permissions/Models/TableauPermission.cs +++ b/src/TableauSharp/Permissions/Models/TableauPermission.cs @@ -5,11 +5,11 @@ namespace TableauSharp.Permissions.Models; public class TableauPermission { [JsonPropertyName("granteeId")] - public string GranteeId { get; set; } + public string GranteeId { get; set; } = string.Empty; [JsonPropertyName("granteeType")] - public string GranteeType { get; set; } // "User" or "Group" + public string GranteeType { get; set; } = string.Empty; // "User" or "Group" [JsonPropertyName("capabilities")] public List Capabilities { get; set; } = new(); -} \ No newline at end of file +} diff --git a/src/TableauSharp/Projects/Models/ProjectCreateRequest.cs b/src/TableauSharp/Projects/Models/ProjectCreateRequest.cs index d1a52fd..5f0193d 100644 --- a/src/TableauSharp/Projects/Models/ProjectCreateRequest.cs +++ b/src/TableauSharp/Projects/Models/ProjectCreateRequest.cs @@ -2,7 +2,7 @@ namespace TableauSharp.Projects.Models; public class ProjectCreateRequest { - public string Name { get; set; } - public string Description { get; set; } - public string ParentProjectId { get; set; } -} \ No newline at end of file + public string Name { get; set; } = string.Empty; + public string? Description { get; set; } + public string? ParentProjectId { get; set; } +} diff --git a/src/TableauSharp/Projects/Models/ProjectUpdateRequest.cs b/src/TableauSharp/Projects/Models/ProjectUpdateRequest.cs index 55638ff..e26e1c2 100644 --- a/src/TableauSharp/Projects/Models/ProjectUpdateRequest.cs +++ b/src/TableauSharp/Projects/Models/ProjectUpdateRequest.cs @@ -2,6 +2,6 @@ namespace TableauSharp.Projects.Models; public class ProjectUpdateRequest { - public string Name { get; set; } - public string Description { get; set; } -} \ No newline at end of file + public string? Name { get; set; } + public string? Description { get; set; } +} diff --git a/src/TableauSharp/Projects/Models/TableauProject.cs b/src/TableauSharp/Projects/Models/TableauProject.cs index 3c8fa35..a664c8d 100644 --- a/src/TableauSharp/Projects/Models/TableauProject.cs +++ b/src/TableauSharp/Projects/Models/TableauProject.cs @@ -5,17 +5,17 @@ namespace TableauSharp.Projects.Models; public class TableauProject { [JsonPropertyName("id")] - public string Id { get; set; } + public string Id { get; set; } = string.Empty; [JsonPropertyName("name")] - public string Name { get; set; } + public string Name { get; set; } = string.Empty; [JsonPropertyName("description")] - public string Description { get; set; } + public string? Description { get; set; } [JsonPropertyName("parentProjectId")] - public string ParentProjectId { get; set; } + public string? ParentProjectId { get; set; } [JsonPropertyName("ownerId")] - public string OwnerId { get; set; } -} \ No newline at end of file + public string? OwnerId { get; set; } +} diff --git a/src/TableauSharp/Projects/Services/ProjectService.cs b/src/TableauSharp/Projects/Services/ProjectService.cs index a651d2e..ec0c103 100644 --- a/src/TableauSharp/Projects/Services/ProjectService.cs +++ b/src/TableauSharp/Projects/Services/ProjectService.cs @@ -31,9 +31,9 @@ public async Task> GetAllAsync(CancellationToken can { projects.Add(new TableauProject { - Id = p.GetProperty("id").GetString(), - Name = p.GetProperty("name").GetString(), - Description = p.GetProperty("description").GetString(), + Id = p.GetProperty("id").GetString() ?? string.Empty, + Name = p.GetProperty("name").GetString() ?? string.Empty, + Description = p.TryGetProperty("description", out var description) ? description.GetString() : null, ParentProjectId = p.TryGetProperty("parentProjectId", out var parent) ? parent.GetString() : null, OwnerId = p.GetProperty("owner").GetProperty("id").GetString() }); @@ -55,9 +55,9 @@ public async Task GetByIdAsync(string projectId, CancellationTok return new TableauProject { - Id = p.GetProperty("id").GetString(), - Name = p.GetProperty("name").GetString(), - Description = p.GetProperty("description").GetString(), + Id = p.GetProperty("id").GetString() ?? string.Empty, + Name = p.GetProperty("name").GetString() ?? string.Empty, + Description = p.TryGetProperty("description", out var description) ? description.GetString() : null, ParentProjectId = p.TryGetProperty("parentProjectId", out var parent) ? parent.GetString() : null, OwnerId = p.GetProperty("owner").GetProperty("id").GetString() }; @@ -80,9 +80,9 @@ public async Task CreateAsync(ProjectCreateRequest request, Canc return new TableauProject { - Id = p.GetProperty("id").GetString(), - Name = p.GetProperty("name").GetString(), - Description = p.GetProperty("description").GetString(), + Id = p.GetProperty("id").GetString() ?? string.Empty, + Name = p.GetProperty("name").GetString() ?? string.Empty, + Description = p.TryGetProperty("description", out var description) ? description.GetString() : null, ParentProjectId = p.TryGetProperty("parentProjectId", out var parent) ? parent.GetString() : null, OwnerId = p.GetProperty("owner").GetProperty("id").GetString() }; @@ -105,9 +105,9 @@ public async Task UpdateAsync(string projectId, ProjectUpdateReq return new TableauProject { - Id = p.GetProperty("id").GetString(), - Name = p.GetProperty("name").GetString(), - Description = p.GetProperty("description").GetString(), + Id = p.GetProperty("id").GetString() ?? string.Empty, + Name = p.GetProperty("name").GetString() ?? string.Empty, + Description = p.TryGetProperty("description", out var description) ? description.GetString() : null, ParentProjectId = p.TryGetProperty("parentProjectId", out var parent) ? parent.GetString() : null, OwnerId = p.GetProperty("owner").GetProperty("id").GetString() }; diff --git a/src/TableauSharp/TableauSharp.csproj b/src/TableauSharp/TableauSharp.csproj index 3eac46d..30958c0 100644 --- a/src/TableauSharp/TableauSharp.csproj +++ b/src/TableauSharp/TableauSharp.csproj @@ -4,6 +4,7 @@ net8.0 enable enable + true TableauSharp diff --git a/src/TableauSharp/Users/Models/GroupCreateRequest.cs b/src/TableauSharp/Users/Models/GroupCreateRequest.cs index c5c62de..36ba500 100644 --- a/src/TableauSharp/Users/Models/GroupCreateRequest.cs +++ b/src/TableauSharp/Users/Models/GroupCreateRequest.cs @@ -2,5 +2,5 @@ namespace TableauSharp.Users.Models; public class GroupCreateRequest { - public string Name { get; set; } -} \ No newline at end of file + public string Name { get; set; } = string.Empty; +} diff --git a/src/TableauSharp/Users/Models/TableauGroup.cs b/src/TableauSharp/Users/Models/TableauGroup.cs index d92bf86..4307705 100644 --- a/src/TableauSharp/Users/Models/TableauGroup.cs +++ b/src/TableauSharp/Users/Models/TableauGroup.cs @@ -5,11 +5,11 @@ namespace TableauSharp.Users.Models; public class TableauGroup { [JsonPropertyName("id")] - public string Id { get; set; } + public string Id { get; set; } = string.Empty; [JsonPropertyName("name")] - public string Name { get; set; } + public string Name { get; set; } = string.Empty; [JsonPropertyName("users")] public List Users { get; set; } = new(); -} \ No newline at end of file +} diff --git a/src/TableauSharp/Users/Models/TableauUser.cs b/src/TableauSharp/Users/Models/TableauUser.cs index fad0fc3..2581ff3 100644 --- a/src/TableauSharp/Users/Models/TableauUser.cs +++ b/src/TableauSharp/Users/Models/TableauUser.cs @@ -5,20 +5,20 @@ namespace TableauSharp.Users.Models; public class TableauUser { [JsonPropertyName("id")] - public string Id { get; set; } + public string Id { get; set; } = string.Empty; [JsonPropertyName("name")] - public string Name { get; set; } + public string Name { get; set; } = string.Empty; [JsonPropertyName("fullName")] - public string FullName { get; set; } + public string? FullName { get; set; } [JsonPropertyName("email")] - public string Email { get; set; } + public string? Email { get; set; } [JsonPropertyName("siteRole")] - public string SiteRole { get; set; } + public string SiteRole { get; set; } = string.Empty; [JsonPropertyName("isActive")] public bool IsActive { get; set; } -} \ No newline at end of file +} diff --git a/src/TableauSharp/Users/Models/UserCreateRequest.cs b/src/TableauSharp/Users/Models/UserCreateRequest.cs index 71176c2..0ee02b4 100644 --- a/src/TableauSharp/Users/Models/UserCreateRequest.cs +++ b/src/TableauSharp/Users/Models/UserCreateRequest.cs @@ -2,7 +2,7 @@ namespace TableauSharp.Users.Models; public class UserCreateRequest { - public string Name { get; set; } - public string Email { get; set; } - public string SiteRole { get; set; } -} \ No newline at end of file + public string Name { get; set; } = string.Empty; + public string? Email { get; set; } + public string SiteRole { get; set; } = string.Empty; +} diff --git a/src/TableauSharp/Users/Models/UserUpdateRequest.cs b/src/TableauSharp/Users/Models/UserUpdateRequest.cs index 0677bad..72b5601 100644 --- a/src/TableauSharp/Users/Models/UserUpdateRequest.cs +++ b/src/TableauSharp/Users/Models/UserUpdateRequest.cs @@ -2,6 +2,6 @@ namespace TableauSharp.Users.Models; public class UserUpdateRequest { - public string SiteRole { get; set; } + public string SiteRole { get; set; } = string.Empty; public bool IsActive { get; set; } -} \ No newline at end of file +} diff --git a/src/TableauSharp/Users/Services/GroupService.cs b/src/TableauSharp/Users/Services/GroupService.cs index 0330b7e..c871bb2 100644 --- a/src/TableauSharp/Users/Services/GroupService.cs +++ b/src/TableauSharp/Users/Services/GroupService.cs @@ -31,8 +31,8 @@ public async Task> GetAllAsync(CancellationToken cance { groups.Add(new TableauGroup { - Id = g.GetProperty("id").GetString(), - Name = g.GetProperty("name").GetString() + Id = g.GetProperty("id").GetString() ?? string.Empty, + Name = g.GetProperty("name").GetString() ?? string.Empty }); } @@ -52,8 +52,8 @@ public async Task GetByIdAsync(string groupId, CancellationToken c return new TableauGroup { - Id = g.GetProperty("id").GetString(), - Name = g.GetProperty("name").GetString() + Id = g.GetProperty("id").GetString() ?? string.Empty, + Name = g.GetProperty("name").GetString() ?? string.Empty }; } @@ -74,8 +74,8 @@ public async Task CreateAsync(GroupCreateRequest request, Cancella return new TableauGroup { - Id = g.GetProperty("id").GetString(), - Name = g.GetProperty("name").GetString() + Id = g.GetProperty("id").GetString() ?? string.Empty, + Name = g.GetProperty("name").GetString() ?? string.Empty }; } diff --git a/src/TableauSharp/Users/Services/UserService.cs b/src/TableauSharp/Users/Services/UserService.cs index 2d7bae5..5b5074c 100644 --- a/src/TableauSharp/Users/Services/UserService.cs +++ b/src/TableauSharp/Users/Services/UserService.cs @@ -31,10 +31,10 @@ public async Task> GetAllAsync(CancellationToken cancel { users.Add(new TableauUser { - Id = u.GetProperty("id").GetString(), - Name = u.GetProperty("name").GetString(), - Email = u.GetProperty("email").GetString(), - SiteRole = u.GetProperty("siteRole").GetString() + Id = u.GetProperty("id").GetString() ?? string.Empty, + Name = u.GetProperty("name").GetString() ?? string.Empty, + Email = u.TryGetProperty("email", out var email) ? email.GetString() : null, + SiteRole = u.GetProperty("siteRole").GetString() ?? string.Empty }); } @@ -54,10 +54,10 @@ public async Task GetByIdAsync(string userId, CancellationToken can return new TableauUser { - Id = u.GetProperty("id").GetString(), - Name = u.GetProperty("name").GetString(), - Email = u.GetProperty("email").GetString(), - SiteRole = u.GetProperty("siteRole").GetString() + Id = u.GetProperty("id").GetString() ?? string.Empty, + Name = u.GetProperty("name").GetString() ?? string.Empty, + Email = u.TryGetProperty("email", out var email) ? email.GetString() : null, + SiteRole = u.GetProperty("siteRole").GetString() ?? string.Empty }; } @@ -78,10 +78,10 @@ public async Task CreateAsync(UserCreateRequest request, Cancellati return new TableauUser { - Id = u.GetProperty("id").GetString(), - Name = u.GetProperty("name").GetString(), - Email = u.GetProperty("email").GetString(), - SiteRole = u.GetProperty("siteRole").GetString() + Id = u.GetProperty("id").GetString() ?? string.Empty, + Name = u.GetProperty("name").GetString() ?? string.Empty, + Email = u.TryGetProperty("email", out var email) ? email.GetString() : null, + SiteRole = u.GetProperty("siteRole").GetString() ?? string.Empty }; } @@ -102,10 +102,10 @@ public async Task UpdateAsync(string userId, UserUpdateRequest requ return new TableauUser { - Id = u.GetProperty("id").GetString(), - Name = u.GetProperty("name").GetString(), - Email = u.GetProperty("email").GetString(), - SiteRole = u.GetProperty("siteRole").GetString() + Id = u.GetProperty("id").GetString() ?? string.Empty, + Name = u.GetProperty("name").GetString() ?? string.Empty, + Email = u.TryGetProperty("email", out var email) ? email.GetString() : null, + SiteRole = u.GetProperty("siteRole").GetString() ?? string.Empty }; } diff --git a/src/TableauSharp/Workbooks/Models/ExportRequest.cs b/src/TableauSharp/Workbooks/Models/ExportRequest.cs index 3e8dce7..1b394df 100644 --- a/src/TableauSharp/Workbooks/Models/ExportRequest.cs +++ b/src/TableauSharp/Workbooks/Models/ExportRequest.cs @@ -2,9 +2,9 @@ namespace TableauSharp.Workbooks.Models; public class ExportRequest { - public string WorkbookId { get; set; } - public string ViewId { get; set; } - public string Format { get; set; } // "PDF", "PNG", "CSV" + public string? WorkbookId { get; set; } + public string ViewId { get; set; } = string.Empty; + public string Format { get; set; } = string.Empty; // "PDF", "PNG", "CSV" public int? MaxWidth { get; set; } public int? MaxHeight { get; set; } -} \ No newline at end of file +} diff --git a/src/TableauSharp/Workbooks/Models/ExportResponse.cs b/src/TableauSharp/Workbooks/Models/ExportResponse.cs index 3d6bd2f..60f2411 100644 --- a/src/TableauSharp/Workbooks/Models/ExportResponse.cs +++ b/src/TableauSharp/Workbooks/Models/ExportResponse.cs @@ -2,7 +2,7 @@ namespace TableauSharp.Workbooks.Models; public class ExportResponse { - public byte[] FileContent { get; set; } - public string ContentType { get; set; } - public string FileName { get; set; } -} \ No newline at end of file + public byte[] FileContent { get; set; } = []; + public string ContentType { get; set; } = string.Empty; + public string FileName { get; set; } = string.Empty; +} diff --git a/src/TableauSharp/Workbooks/Models/TableauView.cs b/src/TableauSharp/Workbooks/Models/TableauView.cs index b4e1cd7..f4115bb 100644 --- a/src/TableauSharp/Workbooks/Models/TableauView.cs +++ b/src/TableauSharp/Workbooks/Models/TableauView.cs @@ -5,23 +5,23 @@ namespace TableauSharp.Workbooks.Models; public class TableauView { [JsonPropertyName("id")] - public string Id { get; set; } + public string Id { get; set; } = string.Empty; [JsonPropertyName("name")] - public string Name { get; set; } + public string Name { get; set; } = string.Empty; [JsonPropertyName("contentUrl")] - public string ContentUrl { get; set; } + public string ContentUrl { get; set; } = string.Empty; [JsonPropertyName("workbookId")] - public string WorkbookId { get; set; } + public string WorkbookId { get; set; } = string.Empty; [JsonPropertyName("ownerId")] - public string OwnerId { get; set; } + public string? OwnerId { get; set; } [JsonPropertyName("totalViews")] public int TotalViews { get; set; } [JsonPropertyName("lastViewedAt")] - public DateTime LastViewedAt { get; set; } -} \ No newline at end of file + public DateTime? LastViewedAt { get; set; } +} diff --git a/src/TableauSharp/Workbooks/Models/TableauWorkbook.cs b/src/TableauSharp/Workbooks/Models/TableauWorkbook.cs index bd2ea6f..3274089 100644 --- a/src/TableauSharp/Workbooks/Models/TableauWorkbook.cs +++ b/src/TableauSharp/Workbooks/Models/TableauWorkbook.cs @@ -5,16 +5,16 @@ namespace TableauSharp.Workbooks.Models; public class TableauWorkbook { [JsonPropertyName("id")] - public string Id { get; set; } + public string Id { get; set; } = string.Empty; [JsonPropertyName("name")] - public string Name { get; set; } + public string Name { get; set; } = string.Empty; [JsonPropertyName("projectId")] - public string ProjectId { get; set; } + public string ProjectId { get; set; } = string.Empty; [JsonPropertyName("ownerId")] - public string OwnerId { get; set; } + public string? OwnerId { get; set; } [JsonPropertyName("createdAt")] public DateTime CreatedAt { get; set; } @@ -24,4 +24,4 @@ public class TableauWorkbook [JsonPropertyName("views")] public List Views { get; set; } = new(); -} \ No newline at end of file +} diff --git a/src/TableauSharp/Workbooks/Models/WorkbookPublishRequest.cs b/src/TableauSharp/Workbooks/Models/WorkbookPublishRequest.cs index aabd7a1..5a39972 100644 --- a/src/TableauSharp/Workbooks/Models/WorkbookPublishRequest.cs +++ b/src/TableauSharp/Workbooks/Models/WorkbookPublishRequest.cs @@ -2,8 +2,8 @@ namespace TableauSharp.Workbooks.Models; public class WorkbookPublishRequest { - public string Name { get; set; } - public string ProjectId { get; set; } - public string FilePath { get; set; } + public string Name { get; set; } = string.Empty; + public string ProjectId { get; set; } = string.Empty; + public string FilePath { get; set; } = string.Empty; public bool Overwrite { get; set; } -} \ No newline at end of file +} diff --git a/src/TableauSharp/Workbooks/Services/ViewService.cs b/src/TableauSharp/Workbooks/Services/ViewService.cs index 6f12c6d..0ab466a 100644 --- a/src/TableauSharp/Workbooks/Services/ViewService.cs +++ b/src/TableauSharp/Workbooks/Services/ViewService.cs @@ -33,14 +33,14 @@ public async Task> GetViewsByWorkbookIdAsync(string wor { views.Add(new TableauView { - Id = v.GetProperty("id").GetString(), - Name = v.GetProperty("name").GetString(), - ContentUrl = v.GetProperty("contentUrl").GetString(), + Id = v.GetProperty("id").GetString() ?? string.Empty, + Name = v.GetProperty("name").GetString() ?? string.Empty, + ContentUrl = v.GetProperty("contentUrl").GetString() ?? string.Empty, WorkbookId = workbookId, TotalViews = v.GetProperty("totalViews").GetInt32(), LastViewedAt = v.TryGetProperty("lastViewedAt", out var lastViewed) ? lastViewed.GetDateTime() - : default + : null }); } diff --git a/src/TableauSharp/Workbooks/Services/WorkbookService.cs b/src/TableauSharp/Workbooks/Services/WorkbookService.cs index 6cfb602..c26a5e1 100644 --- a/src/TableauSharp/Workbooks/Services/WorkbookService.cs +++ b/src/TableauSharp/Workbooks/Services/WorkbookService.cs @@ -32,9 +32,9 @@ public async Task> GetAllAsync(CancellationToken ca { workbooks.Add(new TableauWorkbook { - Id = w.GetProperty("id").GetString(), - Name = w.GetProperty("name").GetString(), - ProjectId = w.GetProperty("project").GetProperty("id").GetString(), + Id = w.GetProperty("id").GetString() ?? string.Empty, + Name = w.GetProperty("name").GetString() ?? string.Empty, + ProjectId = w.GetProperty("project").GetProperty("id").GetString() ?? string.Empty, OwnerId = w.GetProperty("owner").GetProperty("id").GetString(), CreatedAt = w.GetProperty("createdAt").GetDateTime(), UpdatedAt = w.GetProperty("updatedAt").GetDateTime() @@ -58,9 +58,9 @@ public async Task GetByIdAsync(string workbookId, CancellationT return new TableauWorkbook { - Id = w.GetProperty("id").GetString(), - Name = w.GetProperty("name").GetString(), - ProjectId = w.GetProperty("project").GetProperty("id").GetString(), + Id = w.GetProperty("id").GetString() ?? string.Empty, + Name = w.GetProperty("name").GetString() ?? string.Empty, + ProjectId = w.GetProperty("project").GetProperty("id").GetString() ?? string.Empty, OwnerId = w.GetProperty("owner").GetProperty("id").GetString(), CreatedAt = w.GetProperty("createdAt").GetDateTime(), UpdatedAt = w.GetProperty("updatedAt").GetDateTime() @@ -92,9 +92,9 @@ public async Task PublishAsync(WorkbookPublishRequest request, return new TableauWorkbook { - Id = w.GetProperty("id").GetString(), - Name = w.GetProperty("name").GetString(), - ProjectId = w.GetProperty("project").GetProperty("id").GetString(), + Id = w.GetProperty("id").GetString() ?? string.Empty, + Name = w.GetProperty("name").GetString() ?? string.Empty, + ProjectId = w.GetProperty("project").GetProperty("id").GetString() ?? string.Empty, OwnerId = w.GetProperty("owner").GetProperty("id").GetString(), CreatedAt = w.GetProperty("createdAt").GetDateTime(), UpdatedAt = w.GetProperty("updatedAt").GetDateTime() diff --git a/test/TableauSharp.Tests/Projects/ProjectServiceTests.cs b/test/TableauSharp.Tests/Projects/ProjectServiceTests.cs index d103d3c..e4de118 100644 --- a/test/TableauSharp.Tests/Projects/ProjectServiceTests.cs +++ b/test/TableauSharp.Tests/Projects/ProjectServiceTests.cs @@ -37,6 +37,22 @@ public async Task GetAllAsync_UsesSignedInSiteIdAndAuthHeader() }); } + [Test] + public async Task GetAllAsync_WhenOptionalFieldsAreMissing_ReturnsNullOptionalValues() + { + _context.MockHttp.When(HttpMethod.Get, $"{_context.SiteBase}projects") + .Respond("application/json", ProjectWithoutOptionalFieldsJson); + + var result = (await _service.GetAllAsync()).Single(); + + Assert.Multiple(() => + { + Assert.That(result.Id, Is.EqualTo("proj-002")); + Assert.That(result.Description, Is.Null); + Assert.That(result.ParentProjectId, Is.Null); + }); + } + [Test] public async Task UpdateAsync_UsesSignedInSiteIdAndAuthHeader() { @@ -76,4 +92,16 @@ public async Task UpdateAsync_UsesSignedInSiteIdAndAuthHeader() } } """; + + private static string ProjectWithoutOptionalFieldsJson => """ + { + "projects": [ + { + "id": "proj-002", + "name": "No optional fields", + "owner": { "id": "user-001" } + } + ] + } + """; } diff --git a/test/TableauSharp.Tests/Users/UserServiceTests.cs b/test/TableauSharp.Tests/Users/UserServiceTests.cs index c44a8db..47a5305 100644 --- a/test/TableauSharp.Tests/Users/UserServiceTests.cs +++ b/test/TableauSharp.Tests/Users/UserServiceTests.cs @@ -37,6 +37,21 @@ public async Task GetAllAsync_UsesSignedInSiteIdAndAuthHeader() }); } + [Test] + public async Task GetAllAsync_WhenEmailIsMissing_ReturnsNullEmail() + { + _context.MockHttp.When(HttpMethod.Get, $"{_context.SiteBase}users") + .Respond("application/json", UserWithoutEmailJson); + + var result = (await _service.GetAllAsync()).Single(); + + Assert.Multiple(() => + { + Assert.That(result.Id, Is.EqualTo("user-002")); + Assert.That(result.Email, Is.Null); + }); + } + [Test] public async Task UpdateAsync_UsesSignedInSiteIdAndAuthHeader() { @@ -72,4 +87,16 @@ public async Task UpdateAsync_UsesSignedInSiteIdAndAuthHeader() } } """; + + private static string UserWithoutEmailJson => """ + { + "users": [ + { + "id": "user-002", + "name": "bob", + "siteRole": "Viewer" + } + ] + } + """; } diff --git a/test/TableauSharp.Tests/Workbooks/ViewServiceTests.cs b/test/TableauSharp.Tests/Workbooks/ViewServiceTests.cs index ab6e504..1f84604 100644 --- a/test/TableauSharp.Tests/Workbooks/ViewServiceTests.cs +++ b/test/TableauSharp.Tests/Workbooks/ViewServiceTests.cs @@ -105,6 +105,21 @@ public async Task ExportViewAsync_ReturnsFileContentFromSignedInSite() }); } + [Test] + public async Task GetViewsByWorkbookIdAsync_WhenLastViewedAtIsMissing_ReturnsNullLastViewedAt() + { + _mockHttp.When(HttpMethod.Get, $"{SiteBase}workbooks/wb-001/views") + .Respond("application/json", ViewWithoutLastViewedAtJson); + + var result = (await _service.GetViewsByWorkbookIdAsync("wb-001")).Single(); + + Assert.Multiple(() => + { + Assert.That(result.Id, Is.EqualTo("view-002")); + Assert.That(result.LastViewedAt, Is.Null); + }); + } + [Test] public void GetViewsByWorkbookIdAsync_WhenCancellationRequested_ThrowsTaskCanceledException() { @@ -130,4 +145,17 @@ public void GetViewsByWorkbookIdAsync_WhenCancellationRequested_ThrowsTaskCancel ] } """; + + private static string ViewWithoutLastViewedAtJson => """ + { + "views": [ + { + "id": "view-002", + "name": "Inventory View", + "contentUrl": "inventory-view", + "totalViews": 0 + } + ] + } + """; }