Files
DocumentService/DocumentOperator.API

DocumentOperator API - Manual Testing Guide

This guide contains manual test scenarios for validating the DocumentOperator API endpoints using Swagger UI or tools like Postman.


Prerequisites

  1. Start the API:

    dotnet run --project DocumentOperator.API
    

    Default URL: https://localhost:5001 (check console output for actual port)

  2. Open Swagger UI: Navigate to https://localhost:<port>/swagger

  3. Test PDFs:

    • Use PDFs from fake-pdf/ folder (form.pdf, multi-page.pdf, one-page.pdf, with-image.pdf)
    • Or use your own PDF files

Feature 1: Basic PDF Validation

Endpoint: POST /api/pdf/validation/validate

Test Case 1.1: Valid PDF (Multipart Upload)

Objective: Verify basic PDF validation works with file upload

Steps:

  1. Open Swagger UI → /api/pdf/validation/validate
  2. Click "Try it out"
  3. Select multipart/form-data from dropdown
  4. Click "Choose File" and select fake-pdf/one-page.pdf
  5. Click "Execute"

Expected Result:

  • Status Code: 200 OK
  • Response Body:
    {
      "pageCount": 1,
      "fileSizeBytes": 7168,
      "fileSizeMB": 0.01,
      "pdfVersion": "1.4",
      "hasAttachments": false,
      "attachmentCount": 0
    }
    

Test Case 1.2: Valid PDF (Base64 JSON)

Objective: Verify Base64 input works

Steps:

  1. Convert a PDF to Base64:
    $bytes = [System.IO.File]::ReadAllBytes("fake-pdf/one-page.pdf")
    $base64 = [Convert]::ToBase64String($bytes)
    Write-Output $base64
    
  2. Open Swagger UI → /api/pdf/validation/validate
  3. Click "Try it out"
  4. Select application/json from dropdown
  5. Paste into Request Body:
    {
      "base64Pdf": "<paste-your-base64-here>"
    }
    
  6. Click "Execute"

Expected Result:

  • Status Code: 200 OK
  • Same response as Test 1.1

Test Case 1.3: Invalid Base64 String

Objective: Verify validation rejects malformed Base64

Steps:

  1. Open Swagger UI → /api/pdf/validation/validate
  2. Select application/json
  3. Paste into Request Body:
    {
      "base64Pdf": "invalid-base64!!!"
    }
    
  4. Click "Execute"

Expected Result:

  • Status Code: 400 Bad Request
  • Error Message: Contains "Base64"

Test Case 1.4: Empty File Upload

Objective: Verify empty files are rejected

Steps:

  1. Create an empty file (empty.pdf)
  2. Upload via multipart/form-data

Expected Result:

  • Status Code: 400 Bad Request
  • Error Message: Contains "cannot be empty"

Test Case 1.5: Large Multi-Page PDF

Objective: Verify handling of larger PDFs

Steps:

  1. Upload fake-pdf/multi-page.pdf (49 KB)

Expected Result:

  • Status Code: 200 OK
  • Response:
    {
      "pageCount": 3,
      "fileSizeBytes": 49152,
      "fileSizeMB": 0.05,
      "pdfVersion": "1.7",
      "hasAttachments": false,
      "attachmentCount": 0
    }
    

Test Case 1.6: PDF with Images

Objective: Verify image-heavy PDFs are processed

Steps:

  1. Upload fake-pdf/with-image.pdf (256 KB)

Expected Result:

  • Status Code: 200 OK
  • Response:
    {
      "pageCount": 1,
      "fileSizeBytes": 262144,
      "fileSizeMB": 0.25,
      "pdfVersion": "1.6",
      "hasAttachments": false,
      "attachmentCount": 0
    }
    

Feature 3: PDF/A Validation

Endpoint: POST /api/pdf/validation/validate-pdfa

Test Case 3.1: PDF/A Compliant Document (Multipart)

Objective: Verify PDF/A validation detects conformance

Steps:

  1. Open Swagger UI → /api/pdf/validation/validate-pdfa
  2. Select multipart/form-data
  3. Upload a PDF/A-compliant PDF (if available)
  4. Click "Execute"

Expected Result (if PDF/A compliant):

  • Status Code: 200 OK
  • Response:
    {
      "isValid": true,
      "pdfVersion": "1.7",
      "pageCount": 1,
      "fileSize": 12345,
      "encrypted": false,
      "pdfAVersion": "PDF/A-3b",
      "pdfACompliant": true,
      "errors": [],
      "warnings": []
    }
    

Test Case 3.2: Non-PDF/A Document

Objective: Verify regular PDFs are detected as non-compliant

Steps:

  1. Upload fake-pdf/one-page.pdf (regular PDF, NOT PDF/A)

Expected Result:

  • Status Code: 200 OK
  • Response:
    {
      "isValid": true,
      "pdfVersion": "1.4",
      "pageCount": 1,
      "fileSize": 7168,
      "encrypted": false,
      "pdfAVersion": null,
      "pdfACompliant": false,
      "errors": [],
      "warnings": ["Manual verification recommended: PDF/A compliance requires all fonts to be embedded"]
    }
    

Test Case 3.3: Encrypted PDF

Objective: Verify encrypted PDFs are flagged

Steps:

  1. Create or obtain a password-protected PDF
  2. Upload via multipart/form-data

Expected Result:

  • Status Code: 200 OK
  • Response:
    {
      "isValid": true,
      "pdfVersion": "1.7",
      "pageCount": 1,
      "fileSize": 12345,
      "encrypted": true,
      "pdfAVersion": null,
      "pdfACompliant": false,
      "errors": ["Encrypted PDFs cannot be PDF/A compliant"],
      "warnings": []
    }
    

Test Case 3.4: Invalid Base64 (PDF/A Endpoint)

Objective: Verify validation works on PDF/A endpoint

Steps:

  1. Select application/json
  2. Paste:
    {
      "base64Pdf": "not-base64!!!"
    }
    

Expected Result:

  • Status Code: 400 Bad Request
  • Error Message: Contains "Base64"

Test Case 3.5: Empty Request

Objective: Verify both inputs missing is rejected

Steps:

  1. Select application/json
  2. Paste:
    {
      "pdfBytes": null,
      "base64Pdf": ""
    }
    

Expected Result:

  • Status Code: 400 Bad Request
  • Error Message: "Either PdfBytes or Base64Pdf must be provided, but not both"

Feature 2: Swiss QR Code Extraction

Endpoint: POST /api/swissqrcode/extract

Test Case 2.1: PDF with Swiss QR Code

Objective: Extract Swiss QR Bill from PDF

Steps:

  1. Open Swagger UI → /api/swissqrcode/extract
  2. Select multipart/form-data
  3. Upload a PDF containing Swiss QR Code on the last page
  4. Click "Execute"

Expected Result (if QR code present):

  • Status Code: 200 OK
  • Response: Contains Swiss QR Bill details (IBAN, amount, creditor, debtor, reference)

Test Case 2.2: PDF without QR Code

Objective: Verify graceful handling when no QR code exists

Steps:

  1. Upload fake-pdf/one-page.pdf (no QR code)

Expected Result:

  • Status Code: 404 Not Found
  • Error Message: "Swiss QR Code not found in PDF"

Common Error Scenarios

Test Case E1: Missing File in Multipart Request

Steps:

  1. Any multipart endpoint
  2. Don't select a file, click "Execute"

Expected Result:

  • Status Code: 400 Bad Request

Test Case E2: Both PdfBytes AND Base64Pdf Provided

Steps:

  1. Attempt to send JSON with both fields populated
    {
      "pdfBytes": [1,2,3],
      "base64Pdf": "dGVzdA=="
    }
    

Expected Result:

  • Status Code: 400 Bad Request
  • Error Message: "Either PdfBytes or Base64Pdf must be provided, but not both"

Test Case E3: Corrupted PDF File

Steps:

  1. Create a text file with .pdf extension containing "FAKE PDF CONTENT"
  2. Upload it

Expected Result:

  • Status Code: 500 Internal Server Error
  • Error Message: Contains "PDF processing error"

Test Coverage Summary

Feature Endpoint Test Cases
Basic PDF Validation POST /api/pdf/validation/validate 6
PDF/A Validation POST /api/pdf/validation/validate-pdfa 5
Swiss QR Code POST /api/swissqrcode/extract 2
Error Handling All endpoints 3
TOTAL 16 Manual Test Cases

Notes

  • All endpoints support BOTH multipart/form-data (file upload) AND application/json (Base64)
  • FluentValidation runs before handlers (400 errors indicate validation failures)
  • DevExpress evaluation warnings (DX1000/DX1001) are expected and can be ignored
  • Test PDFs in fake-pdf/ folder are small samples; use real-world PDFs for comprehensive testing

Quick PowerShell Helpers

Convert PDF to Base64:

$bytes = [System.IO.File]::ReadAllBytes("path\to\file.pdf")
$base64 = [Convert]::ToBase64String($bytes)
$base64 | Set-Clipboard  # Copies to clipboard

Create empty PDF for testing:

New-Item -Path "empty.pdf" -ItemType File -Force

Check if file is valid PDF:

$header = Get-Content -Path "file.pdf" -TotalCount 1 -Encoding Byte
# Should start with: 0x25 0x50 0x44 0x46 (%PDF)