Skip to content

Commit dd8ffeb

Browse files
Fixed parameters parsing and improved to handle web convert.
1 parent 9768b42 commit dd8ffeb

File tree

3 files changed

+82
-66
lines changed

3 files changed

+82
-66
lines changed

ConvertApi.Cli.Test/DirectCallTests.cs

Lines changed: 51 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -34,89 +34,108 @@ public async Task TestMergePdfs()
3434
var outputFile = Path.Combine(TestOutputDir, "simple.pdf");
3535
var inputFile1 = Path.Combine(Directory.GetCurrentDirectory(), "../../../../", "test_files", "simple.pdf");
3636
var inputFile2 = Path.Combine(Directory.GetCurrentDirectory(), "../../../../", "test_files", "invoice.pdf");
37-
37+
3838
await Program.Main([ApiToken, TestOutputDir, inputFile1, inputFile2, "pdf", "merge"]);
39-
39+
4040
Assert.IsTrue(File.Exists(outputFile), "Output file was not created.");
4141
}
42-
42+
4343
[Test]
4444
public async Task TestMergeMutiplePdfs()
4545
{
4646
var outputFile = Path.Combine(TestOutputDir, "simple.pdf");
4747
var inputFile1 = Path.Combine(Directory.GetCurrentDirectory(), "../../../../", "test_files", "simple.pdf");
4848
var inputFile2 = Path.Combine(Directory.GetCurrentDirectory(), "../../../../", "test_files", "invoice.pdf");
4949
var inputFile3 = Path.Combine(Directory.GetCurrentDirectory(), "../../../../", "test_files", "invoice.pdf");
50-
50+
5151
await Program.Main([ApiToken, TestOutputDir, inputFile1, inputFile2, inputFile3, "pdf", "merge"]);
52-
52+
5353
Assert.IsTrue(File.Exists(outputFile), "Output file was not created.");
5454
}
55-
55+
5656
[Test]
5757
public async Task TestAddWatermarkToPdf()
5858
{
5959
var outputFile = Path.Combine(TestOutputDir, "watermark.pdf");
6060
var inputFile = Path.Combine(Directory.GetCurrentDirectory(), "../../../../", "test_files", "simple.pdf");
61-
61+
6262
await Program.Main([ApiToken, TestOutputDir, inputFile, "pdf", "watermark", "Text=Confidential", "FileName=watermark"]);
63-
64-
63+
64+
6565
Assert.IsTrue(File.Exists(outputFile), "Output file was not created.");
6666
}
67-
67+
6868
[Test]
6969
public async Task TestProtectPdfWithPassword()
7070
{
7171
var outputFile = Path.Combine(TestOutputDir, "protected.pdf");
7272
var inputFile = Path.Combine(Directory.GetCurrentDirectory(), "../../../../", "test_files", "simple.pdf");
73-
73+
7474
await Program.Main([ApiToken, TestOutputDir, inputFile, "pdf", "protect", "UserPassword=1234", "OwnerPassword=abcd", "FileName=protected"]);
75-
75+
7676
Assert.IsTrue(File.Exists(outputFile), "Output file was not created.");
7777
}
78-
78+
7979
[Test]
8080
public async Task TestPdfToPngWithResolution()
8181
{
82-
var inputFile = Path.Combine(Directory.GetCurrentDirectory(), "../../../../", "test_files", "simple.pdf");
83-
82+
var inputFile = Path.Combine(Directory.GetCurrentDirectory(), "../../../../", "test_files", "22pages.pdf");
83+
8484
await Program.Main([ApiToken, TestOutputDir, inputFile, "pdf", "png", "Resolution=300"]);
8585

86-
Assert.IsTrue(File.Exists(outputFolder), "Output file was not created.");
86+
var outputFiles = Directory.GetFiles(TestOutputDir);
87+
Assert.That(outputFiles, Has.Length.EqualTo(22), "Output files were not created.");
8788
}
88-
89+
8990
[Test]
9091
public async Task TestPdfToExtractImages()
9192
{
9293
var inputFile = Path.Combine(Directory.GetCurrentDirectory(), "../../../../", "test_files", "simple.pdf");
93-
94+
9495
await Program.Main([ApiToken, TestOutputDir, inputFile, "pdf", "extract-images"]);
95-
96-
Assert.IsTrue(File.Exists(outputFolder), "Output file was not created.");
96+
97+
var outputFiles = Directory.GetFiles(TestOutputDir);
98+
Assert.That(outputFiles, Has.Length.EqualTo(1), "Output file was not created.");
9799
}
98-
100+
99101
[Test]
100102
public async Task TestPdfToExtractImagesError()
101103
{
102-
var outputFolder = Path.Combine(TestOutputDir, "watermark.pdf");
103-
var inputFile = Path.Combine(Directory.GetCurrentDirectory(), "../../../../", "test_files", "simple.pdf");
104-
104+
var inputFile = Path.Combine(Directory.GetCurrentDirectory(), "../../../../", "test_files", "22pages.pdf");
105+
105106
await Program.Main([ApiToken, TestOutputDir, inputFile, "pdf", "extract-images"]);
106-
107-
Should fail
108-
Assert.IsTrue(File.Exists(outputFolder), "Output file was not created.");
107+
108+
var outputFiles = Directory.GetFiles(TestOutputDir);
109+
Assert.That(outputFiles, Has.Length.EqualTo(0), "There should not be any converted files.");
109110
}
110-
111+
111112
[Test]
112-
public async Task TestWebToPdf()
113+
public async Task TestPdfToDocxWithMixedUpInputs()
113114
{
114-
var outputFolder = Path.Combine(TestOutputDir, "watermark.pdf");
115115
var inputFile = Path.Combine(Directory.GetCurrentDirectory(), "../../../../", "test_files", "simple.pdf");
116+
117+
// pdf and docx are mixed on purpose!
118+
await Program.Main([ApiToken, TestOutputDir, inputFile, "docx", "pdf"]);
119+
120+
var outputFiles = Directory.GetFiles(TestOutputDir);
121+
Assert.That(outputFiles, Has.Length.EqualTo(0), "There should not be any converted files.");
122+
}
116123

124+
[Test]
125+
public async Task TestWebToPdf()
126+
{
117127
await Program.Main([ApiToken, TestOutputDir, "", "web", "pdf", "url=https://www.google.com"]);
118-
119128

120-
Assert.IsTrue(File.Exists(outputFolder), "Output file was not created.");
129+
var outputFiles = Directory.GetFiles(TestOutputDir);
130+
Assert.That(outputFiles, Has.Length.EqualTo(1), "Output file was not created.");
131+
}
132+
133+
[Test]
134+
public async Task TestWebToPdfWithNullasInput()
135+
{
136+
await Program.Main([ApiToken, TestOutputDir, null, "web", "pdf", "url=https://www.google.com"]);
137+
138+
var outputFiles = Directory.GetFiles(TestOutputDir);
139+
Assert.That(outputFiles, Has.Length.EqualTo(1), "Output file was not created.");
121140
}
122141
}

ConvertApi.Cli/Program.cs

Lines changed: 31 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17,46 +17,51 @@ public static async Task Main(string[] args)
1717
DisplayHelp();
1818
return;
1919
}
20+
21+
// Replacing null values with empty string to avoid unexpected behaviour.
22+
args = args.Select(s => s ?? "").ToArray();
2023

2124
string apiToken = args[0];
2225
string outputFile = args[1];
2326

2427
// Extract input files, formats, and dynamic properties
25-
int inputFilesEndIndex = args.Length > 4 && !args[^2].Contains('=') && !args[^1].Contains('=')
26-
? args.Length - 2 // Exclude [from-format] and [to-format]
27-
: args.Length;
28+
var parametersCount = args.Count(x => x.Contains('='));
29+
int inputFilesEndIndex = args.Length > 4
30+
? args.Length - parametersCount - 2 // Exclude [from-format] and [to-format]
31+
: args.Length - parametersCount;
2832

2933
string[] inputFiles = args.Skip(2).Take(inputFilesEndIndex - 2).ToArray();
30-
31-
// Validate input files
32-
if (inputFiles.Length == 0)
33-
{
34-
Console.WriteLine("Error: At least one input file is required.");
35-
return;
36-
}
37-
38-
foreach (var file in inputFiles)
39-
{
40-
if (!File.Exists(file))
41-
{
42-
Console.WriteLine($"Error: Input file not found: {file}");
43-
return;
44-
}
45-
}
46-
34+
4735
string fromFormat = args.Length > inputFilesEndIndex
48-
? args[^2] // Second-to-last argument
36+
? args[^(2 + parametersCount)] // Second-to-last argument - parameters with '='
4937
: Path.GetExtension(inputFiles[0]).Trim('.').ToLower(); // Infer from first input file
5038

5139
string toFormat = args.Length > inputFilesEndIndex + 1
52-
? args[^1] // Last argument
40+
? args[^(1 + parametersCount)] // Last argument - parameters with '='
5341
: Path.GetExtension(outputFile).Trim('.').ToLower(); // Infer from output file
42+
43+
ValidateInputFiles(inputFiles, fromFormat);
5444

45+
// Extract dynamic properties
46+
var dynamicProperties = args.Skip(2 + inputFiles.Length).Where(arg => arg.Contains('=')).ToDictionary(
47+
arg => arg.Split('=')[0],
48+
arg => arg.Split('=')[1]
49+
);
5550

56-
// Second to last argument
57-
// Last argument
51+
await ConvertFiles(apiToken, fromFormat, toFormat, inputFiles, outputFile, dynamicProperties);
52+
}
5853

59-
// Validate input files
54+
private static void ValidateInputFiles(string[] inputFiles, string fromFormat)
55+
{
56+
if (fromFormat == "web")
57+
return;
58+
59+
if (inputFiles.Length == 0)
60+
{
61+
Console.WriteLine("Error: At least one input file is required.");
62+
return;
63+
}
64+
6065
foreach (var file in inputFiles)
6166
{
6267
if (!File.Exists(file))
@@ -65,14 +70,6 @@ public static async Task Main(string[] args)
6570
return;
6671
}
6772
}
68-
69-
// Extract dynamic properties
70-
var dynamicProperties = args.Skip(2 + inputFiles.Length).Where(arg => arg.Contains('=')).ToDictionary(
71-
arg => arg.Split('=')[0],
72-
arg => arg.Split('=')[1]
73-
);
74-
75-
await ConvertFiles(apiToken, fromFormat, toFormat, inputFiles, outputFile, dynamicProperties);
7673
}
7774

7875
static void DisplayHelp()
@@ -115,7 +112,7 @@ static async Task ConvertFiles(string apiToken, string fromFormat, string toForm
115112
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiToken);
116113
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("multipart/mixed"));
117114

118-
if (inputFiles.Any())
115+
if (inputFiles.Any(x => !string.IsNullOrEmpty(x)))
119116
{
120117
if (inputFiles.Length == 1)
121118
{

test_files/22pages.pdf

52 KB
Binary file not shown.

0 commit comments

Comments
 (0)