synthra 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +4 -0
- data/.rubocop.yml +40 -0
- data/.yardopts +18 -0
- data/ACCESS_DOCS.md +116 -0
- data/ADVANCED_FEATURES_SUMMARY.md +245 -0
- data/CHANGELOG.md +498 -0
- data/CODE_OF_CONDUCT.md +122 -0
- data/CONTRIBUTING.md +307 -0
- data/DOCUMENTATION.md +204 -0
- data/DOCUMENTATION_GUIDE.md +194 -0
- data/LICENSE +22 -0
- data/README.md +1458 -0
- data/Rakefile +128 -0
- data/benchmark/README.md +591 -0
- data/benchmark/batch_generation.rb +63 -0
- data/benchmark/engine_comparison.rb +295 -0
- data/benchmark/single_record.rb +108 -0
- data/benchmark/streaming.rb +74 -0
- data/docs/ACTIVERECORD_INFERENCE.md +524 -0
- data/docs/API_SERVER.md +278 -0
- data/docs/CONFIG_FILE.md +315 -0
- data/docs/DATA_CONTRACTS.md +312 -0
- data/docs/ENHANCED_REPL.md +304 -0
- data/docs/FACTORY_BOT.md +271 -0
- data/docs/GITHUB_ACTION.md +420 -0
- data/docs/GRAPHQL_EXPORT.md +303 -0
- data/docs/GRAPHQL_FEDERATION.md +651 -0
- data/docs/HOW_TO_GENERATE_DOCS.md +252 -0
- data/docs/LSP.md +189 -0
- data/docs/MIGRATION_GENERATOR.md +547 -0
- data/docs/MOCK_SERVER.md +280 -0
- data/docs/NATIVE_ENGINE.md +298 -0
- data/docs/OPENAPI_EXPORT.md +252 -0
- data/docs/PERFORMANCE_MODE.md +228 -0
- data/docs/PERSONAS.md +547 -0
- data/docs/PROPERTY_TESTING.md +284 -0
- data/docs/PROTOBUF_EXPORT.md +276 -0
- data/docs/QUALITY_METRICS.md +555 -0
- data/docs/QUICK_REFERENCE.md +88 -0
- data/docs/RAILS_ENGINE.md +404 -0
- data/docs/RAILS_INTEGRATION.md +454 -0
- data/docs/README.md +175 -0
- data/docs/REPL_QUICK_REFERENCE.md +149 -0
- data/docs/RUST_INTEGRATION_GUIDE.md +1376 -0
- data/docs/SCENARIOS.md +576 -0
- data/docs/SECURITY_TESTING.md +318 -0
- data/docs/SNAPSHOT_TESTING.md +308 -0
- data/docs/STRING_TEXT_TYPES_REFERENCE.md +512 -0
- data/docs/TERRAFORM_EXPORT.md +447 -0
- data/docs/TIME_TRAVEL.md +507 -0
- data/docs/USAGE_GUIDE.md +980 -0
- data/docs/WEBHOOK_SIMULATOR.md +579 -0
- data/docs/advanced_features.md +183 -0
- data/docs/api_reference.md +153 -0
- data/docs/behaviors.md +138 -0
- data/docs/best_practices.md +191 -0
- data/docs/dsl_reference.md +172 -0
- data/docs/examples.md +162 -0
- data/docs/generation_modes.md +125 -0
- data/docs/getting_started.md +92 -0
- data/docs/index.html +177 -0
- data/docs/strategic/CLOUD_REGISTRY_ARCHITECTURE.md +268 -0
- data/docs/strategic/SIMD_OPTIMIZATION_STRATEGY.md +153 -0
- data/docs/troubleshooting.md +215 -0
- data/docs/type_reference.md +224 -0
- data/examples/hostile_mode_demo.rb +64 -0
- data/exe/synthra +6 -0
- data/ext/synthra_native/Cargo.lock +972 -0
- data/ext/synthra_native/Cargo.toml +46 -0
- data/ext/synthra_native/extconf.rb +41 -0
- data/ext/synthra_native/src/generator.rs +397 -0
- data/ext/synthra_native/src/lib.rs +229 -0
- data/ext/synthra_native/src/types.rs +1485 -0
- data/lib/generators/synthra/install_generator.rb +86 -0
- data/lib/generators/synthra/templates/api_response.dsl +15 -0
- data/lib/generators/synthra/templates/fake_data.rake +116 -0
- data/lib/generators/synthra/templates/synthra.yml +31 -0
- data/lib/generators/synthra/templates/synthra_support.rb +19 -0
- data/lib/generators/synthra/templates/user.dsl +11 -0
- data/lib/synthra/activerecord_inference.rb +394 -0
- data/lib/synthra/api.rb +381 -0
- data/lib/synthra/api_server.rb +718 -0
- data/lib/synthra/behaviors/applicator.rb +165 -0
- data/lib/synthra/behaviors/base.rb +155 -0
- data/lib/synthra/behaviors/close_connection.rb +60 -0
- data/lib/synthra/behaviors/deprecated.rb +100 -0
- data/lib/synthra/behaviors/failure.rb +69 -0
- data/lib/synthra/behaviors/latency.rb +103 -0
- data/lib/synthra/behaviors/partial_data.rb +83 -0
- data/lib/synthra/behaviors/randomize_order.rb +74 -0
- data/lib/synthra/behaviors/registry.rb +238 -0
- data/lib/synthra/behaviors/simulate_error.rb +79 -0
- data/lib/synthra/cli/commands/base.rb +105 -0
- data/lib/synthra/cli/commands/diff.rb +227 -0
- data/lib/synthra/cli/commands/docs.rb +67 -0
- data/lib/synthra/cli/commands/export.rb +150 -0
- data/lib/synthra/cli/commands/generate.rb +72 -0
- data/lib/synthra/cli/commands/import.rb +80 -0
- data/lib/synthra/cli/commands/lint.rb +53 -0
- data/lib/synthra/cli/commands/live.rb +57 -0
- data/lib/synthra/cli/commands/seed.rb +99 -0
- data/lib/synthra/cli/commands/validate.rb +28 -0
- data/lib/synthra/cli.rb +2471 -0
- data/lib/synthra/config_file.rb +129 -0
- data/lib/synthra/configuration.rb +281 -0
- data/lib/synthra/contracts_registry.rb +408 -0
- data/lib/synthra/database_seeder.rb +268 -0
- data/lib/synthra/deterministic_ids.rb +218 -0
- data/lib/synthra/documentation_generator.rb +414 -0
- data/lib/synthra/engine.rb +251 -0
- data/lib/synthra/errors.rb +1169 -0
- data/lib/synthra/export/base.rb +85 -0
- data/lib/synthra/export/csv.rb +101 -0
- data/lib/synthra/export/graphql.rb +266 -0
- data/lib/synthra/export/graphql_federation.rb +377 -0
- data/lib/synthra/export/graphviz.rb +258 -0
- data/lib/synthra/export/javascript.rb +327 -0
- data/lib/synthra/export/json_data.rb +61 -0
- data/lib/synthra/export/json_schema.rb +290 -0
- data/lib/synthra/export/openapi.rb +514 -0
- data/lib/synthra/export/protobuf.rb +483 -0
- data/lib/synthra/export/python.rb +560 -0
- data/lib/synthra/export/sql.rb +381 -0
- data/lib/synthra/export/sql_insert.rb +152 -0
- data/lib/synthra/export/terraform.rb +501 -0
- data/lib/synthra/export/type_mapping.rb +389 -0
- data/lib/synthra/export/typescript.rb +300 -0
- data/lib/synthra/export/xml_data.rb +104 -0
- data/lib/synthra/export/yaml_data.rb +56 -0
- data/lib/synthra/export.rb +404 -0
- data/lib/synthra/factory_bot_integration.rb +157 -0
- data/lib/synthra/field.rb +440 -0
- data/lib/synthra/functions/registry.rb +104 -0
- data/lib/synthra/generator/context.rb +372 -0
- data/lib/synthra/generator/engine.rb +336 -0
- data/lib/synthra/generator/faker_adapter.rb +425 -0
- data/lib/synthra/generator/modes.rb +444 -0
- data/lib/synthra/generator/resolver.rb +256 -0
- data/lib/synthra/generator/rng.rb +273 -0
- data/lib/synthra/generator/streamer.rb +63 -0
- data/lib/synthra/generator/uniqueness.rb +118 -0
- data/lib/synthra/initializer.rb +97 -0
- data/lib/synthra/limits.rb +279 -0
- data/lib/synthra/live_preview.rb +518 -0
- data/lib/synthra/loader_config.rb +78 -0
- data/lib/synthra/lsp/server.rb +689 -0
- data/lib/synthra/migration_generator.rb +301 -0
- data/lib/synthra/mixin.rb +174 -0
- data/lib/synthra/mock_server.rb +458 -0
- data/lib/synthra/native_engine.rb +304 -0
- data/lib/synthra/openapi_importer.rb +228 -0
- data/lib/synthra/output/json_formatter.rb +40 -0
- data/lib/synthra/output/ndjson_formatter.rb +55 -0
- data/lib/synthra/parser/ast.rb +1287 -0
- data/lib/synthra/parser/lexer.rb +1152 -0
- data/lib/synthra/parser/parser.rb +1664 -0
- data/lib/synthra/parser/tokens.rb +461 -0
- data/lib/synthra/performance_mode.rb +364 -0
- data/lib/synthra/personas.rb +397 -0
- data/lib/synthra/property_testing.rb +172 -0
- data/lib/synthra/quality_metrics.rb +405 -0
- data/lib/synthra/rails_test_helper.rb +248 -0
- data/lib/synthra/registry.rb +533 -0
- data/lib/synthra/relationships.rb +193 -0
- data/lib/synthra/repl/enhanced_repl.rb +607 -0
- data/lib/synthra/repl/formatter.rb +191 -0
- data/lib/synthra/scenarios.rb +423 -0
- data/lib/synthra/schema.rb +605 -0
- data/lib/synthra/schema_inheritance.rb +104 -0
- data/lib/synthra/schema_versioning.rb +212 -0
- data/lib/synthra/snapshot_testing.rb +199 -0
- data/lib/synthra/time_travel.rb +338 -0
- data/lib/synthra/type_definitions.rb +274 -0
- data/lib/synthra/types/address_location/addresses.rb +125 -0
- data/lib/synthra/types/address_location/airports.rb +200 -0
- data/lib/synthra/types/address_location/banks_hospitals.rb +207 -0
- data/lib/synthra/types/address_location/locations.rb +406 -0
- data/lib/synthra/types/base.rb +48 -0
- data/lib/synthra/types/commerce_products/commerce.rb +119 -0
- data/lib/synthra/types/commerce_products/companies.rb +71 -0
- data/lib/synthra/types/commerce_products/construction.rb +126 -0
- data/lib/synthra/types/commerce_products/products.rb +205 -0
- data/lib/synthra/types/core/collections.rb +513 -0
- data/lib/synthra/types/core/defaults.rb +76 -0
- data/lib/synthra/types/core/enums.rb +102 -0
- data/lib/synthra/types/core/identifiers.rb +445 -0
- data/lib/synthra/types/core/primitives.rb +586 -0
- data/lib/synthra/types/core/references.rb +466 -0
- data/lib/synthra/types/core/sequences.rb +304 -0
- data/lib/synthra/types/crypto/crypto.rb +162 -0
- data/lib/synthra/types/date_time/dates.rb +387 -0
- data/lib/synthra/types/finance_banking/banking.rb +424 -0
- data/lib/synthra/types/finance_banking/credit_cards.rb +24 -0
- data/lib/synthra/types/finance_banking/identifiers.rb +93 -0
- data/lib/synthra/types/formula.rb +184 -0
- data/lib/synthra/types/health_medical/medical.rb +150 -0
- data/lib/synthra/types/hostile_payloads.rb +122 -0
- data/lib/synthra/types/json_array.rb +51 -0
- data/lib/synthra/types/media_entertainment/media.rb +62 -0
- data/lib/synthra/types/naughty_string.rb +30 -0
- data/lib/synthra/types/personal_names/chinese.rb +41 -0
- data/lib/synthra/types/personal_names/identifiers.rb +187 -0
- data/lib/synthra/types/personal_names/names.rb +246 -0
- data/lib/synthra/types/personal_names/national_id.rb +89 -0
- data/lib/synthra/types/personal_names/titles_suffixes.rb +41 -0
- data/lib/synthra/types/regex.rb +248 -0
- data/lib/synthra/types/registry.rb +182 -0
- data/lib/synthra/types/repeating_element.rb +50 -0
- data/lib/synthra/types/scenario.rb +29 -0
- data/lib/synthra/types/technology_internet/apps.rb +67 -0
- data/lib/synthra/types/technology_internet/communication.rb +162 -0
- data/lib/synthra/types/technology_internet/devices.rb +80 -0
- data/lib/synthra/types/technology_internet/formats.rb +139 -0
- data/lib/synthra/types/technology_internet/networking.rb +143 -0
- data/lib/synthra/types/template.rb +92 -0
- data/lib/synthra/types/text_content/business.rb +128 -0
- data/lib/synthra/types/text_content/colors.rb +70 -0
- data/lib/synthra/types/text_content/misc.rb +237 -0
- data/lib/synthra/types/text_content/security.rb +130 -0
- data/lib/synthra/types/text_content/text_generation.rb +532 -0
- data/lib/synthra/types/travel/travel.rb +150 -0
- data/lib/synthra/utils/string_distance.rb +133 -0
- data/lib/synthra/validator/dsl_validator.rb +339 -0
- data/lib/synthra/validator/path_validator.rb +615 -0
- data/lib/synthra/version.rb +35 -0
- data/lib/synthra/webhook_simulator.rb +341 -0
- data/lib/synthra.rb +259 -0
- data/schemas/address.dsl +16 -0
- data/schemas/api_response.dsl +8 -0
- data/schemas/error_payload.dsl +9 -0
- data/schemas/order.dsl +10 -0
- data/schemas/order_item.dsl +8 -0
- data/schemas/payment.dsl +11 -0
- data/schemas/social_post.dsl +13 -0
- data/schemas/user.dsl +10 -0
- data/scripts/batch_fix_all.rb +96 -0
- data/scripts/delete_old_files.rb +32 -0
- data/scripts/fix_all_grouped_files.rb +137 -0
- data/scripts/fix_all_indentation.rb +48 -0
- data/scripts/fix_all_syntax.rb +124 -0
- data/scripts/fix_grouped_files.rb +184 -0
- data/scripts/fix_syntax_errors.rb +108 -0
- data/scripts/group_domain_types.rb +112 -0
- data/scripts/group_domain_types_fixed.rb +150 -0
- data/scripts/merge_domains_to_one_file.rb +68 -0
- data/scripts/move_existing_types.rb +130 -0
- data/scripts/split_grouped_types.rb +142 -0
- data/tech_docs/README.md +134 -0
- data/tech_docs/advanced/streaming.md +405 -0
- data/tech_docs/advanced/thread_safety.md +253 -0
- data/tech_docs/api/overview.md +485 -0
- data/tech_docs/appendices/type_chart.md +193 -0
- data/tech_docs/basic_concepts.md +383 -0
- data/tech_docs/behaviors/overview.md +346 -0
- data/tech_docs/dsl/complex_types.md +790 -0
- data/tech_docs/dsl/core_types.md +464 -0
- data/tech_docs/dsl/datetime_types.md +325 -0
- data/tech_docs/dsl/field_modifiers.md +414 -0
- data/tech_docs/dsl/grammar.md +431 -0
- data/tech_docs/dsl/schema_definition.md +399 -0
- data/tech_docs/export/README.md +276 -0
- data/tech_docs/installation.md +273 -0
- data/tech_docs/integration/ci_cd.md +707 -0
- data/tech_docs/integration/ci_cd_guide.md +579 -0
- data/tech_docs/integration/factory_bot.md +485 -0
- data/tech_docs/integration/rails.md +630 -0
- data/tech_docs/integration/rspec.md +449 -0
- data/tech_docs/modes/overview.md +350 -0
- data/tech_docs/performance/NATIVE_RUST_EXTENSION.md +1270 -0
- data/tech_docs/performance/OPTIMIZATION_GUIDE.md +901 -0
- data/tech_docs/quick_start.md +256 -0
- data/tech_docs/templates/README.md +805 -0
- data/tech_docs/tutorials/advanced.md +371 -0
- data/tech_docs/tutorials/getting_started.md +189 -0
- data/tech_docs/tutorials/intermediate.md +231 -0
- data/tech_docs/tutorials/template_gallery.md +569 -0
- data/tech_example/01_basic_usage.rb +238 -0
- data/tech_example/02_types_demo.rb +336 -0
- data/tech_example/04_cli_usage.md +429 -0
- data/tech_example/05_database_seeding.rb +283 -0
- data/tech_example/07_rspec_integration.rb +359 -0
- data/tech_example/10_custom_types.rb +387 -0
- data/tech_example/12_behaviors.rb +372 -0
- data/tech_example/13_twitter_dm_example.rb +120 -0
- data/tech_example/14_exact_json_structure.rb +253 -0
- data/tech_example/16_lsp_server.rb +56 -0
- data/tech_example/17_property_testing.rb +92 -0
- data/tech_example/18_enhanced_repl.rb +120 -0
- data/tech_example/19_security_fuzzing.rb +145 -0
- data/tech_example/NEW_FEATURES.md +169 -0
- data/tech_example/README.md +118 -0
- data/tech_example/schemas/api_response.dsl +123 -0
- data/tech_example/schemas/ecommerce.dsl +121 -0
- data/tech_example/schemas/twitter_dm.dsl +109 -0
- data/tech_example/schemas/user.dsl +36 -0
- data/vscode-extension/README.md +246 -0
- data/vscode-extension/language-configuration.json +31 -0
- data/vscode-extension/package.json +55 -0
- data/vscode-extension/snippets/fakedatadsl.json +198 -0
- data/vscode-extension/syntaxes/fakedatadsl.tmLanguage.json +128 -0
- metadata +478 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
# Generation Modes Overview
|
|
2
|
+
|
|
3
|
+
Understanding and using different generation modes for comprehensive testing.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [What are Generation Modes?](#what-are-generation-modes)
|
|
8
|
+
- [Available Modes](#available-modes)
|
|
9
|
+
- [Using Modes](#using-modes)
|
|
10
|
+
- [Mode Details](#mode-details)
|
|
11
|
+
- [Choosing the Right Mode](#choosing-the-right-mode)
|
|
12
|
+
- [Custom Mode Handling](#custom-mode-handling)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## What are Generation Modes?
|
|
17
|
+
|
|
18
|
+
Generation modes control what KIND of data is generated:
|
|
19
|
+
|
|
20
|
+
| Mode | Purpose | Output |
|
|
21
|
+
|------|---------|--------|
|
|
22
|
+
| `:random` | Typical testing | Realistic values |
|
|
23
|
+
| `:edge` | Boundary testing | Edge cases |
|
|
24
|
+
| `:invalid` | Validation testing | Invalid data |
|
|
25
|
+
| `:mixed` | Comprehensive testing | Mix of all |
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Available Modes
|
|
30
|
+
|
|
31
|
+
### Random Mode (Default)
|
|
32
|
+
|
|
33
|
+
Generates typical, realistic data:
|
|
34
|
+
|
|
35
|
+
```ruby
|
|
36
|
+
schema.generate(mode: :random)
|
|
37
|
+
# => { "age" => 34, "name" => "John Smith", "email" => "john@example.com" }
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Edge Mode
|
|
41
|
+
|
|
42
|
+
Generates boundary values and edge cases:
|
|
43
|
+
|
|
44
|
+
```ruby
|
|
45
|
+
schema.generate(mode: :edge)
|
|
46
|
+
# => { "age" => 0, "name" => "", "email" => "a@b.c" }
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Invalid Mode
|
|
50
|
+
|
|
51
|
+
Generates invalid data for validation testing:
|
|
52
|
+
|
|
53
|
+
```ruby
|
|
54
|
+
schema.generate(mode: :invalid)
|
|
55
|
+
# => { "age" => "not_a_number", "name" => nil, "email" => "not-an-email" }
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Mixed Mode
|
|
59
|
+
|
|
60
|
+
Randomly combines all modes:
|
|
61
|
+
|
|
62
|
+
```ruby
|
|
63
|
+
schema.generate(mode: :mixed)
|
|
64
|
+
# 80% random, 15% edge, 5% invalid
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Using Modes
|
|
70
|
+
|
|
71
|
+
### Single Record
|
|
72
|
+
|
|
73
|
+
```ruby
|
|
74
|
+
# Default (random)
|
|
75
|
+
user = schema.generate
|
|
76
|
+
|
|
77
|
+
# Explicit mode
|
|
78
|
+
user = schema.generate(mode: :random)
|
|
79
|
+
user = schema.generate(mode: :edge)
|
|
80
|
+
user = schema.generate(mode: :invalid)
|
|
81
|
+
user = schema.generate(mode: :mixed)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Multiple Records
|
|
85
|
+
|
|
86
|
+
```ruby
|
|
87
|
+
# All same mode
|
|
88
|
+
users = schema.generate_many(100, mode: :edge)
|
|
89
|
+
|
|
90
|
+
# Mixed naturally varies per-record
|
|
91
|
+
users = schema.generate_many(100, mode: :mixed)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Streaming
|
|
95
|
+
|
|
96
|
+
```ruby
|
|
97
|
+
schema.generate_stream(count: 1000, mode: :edge).each do |user|
|
|
98
|
+
test_edge_case(user)
|
|
99
|
+
end
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### CLI
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
fake_data_dsl generate User --mode random
|
|
106
|
+
fake_data_dsl generate User --mode edge
|
|
107
|
+
fake_data_dsl generate User --mode invalid
|
|
108
|
+
fake_data_dsl generate User --mode mixed
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Mode Details
|
|
114
|
+
|
|
115
|
+
### Random Mode
|
|
116
|
+
|
|
117
|
+
Generates typical values:
|
|
118
|
+
|
|
119
|
+
| Type | Random Output |
|
|
120
|
+
|------|---------------|
|
|
121
|
+
| `uuid` | `"550e8400-e29b-41d4-a716-446655440000"` |
|
|
122
|
+
| `name` | `"John Smith"` |
|
|
123
|
+
| `email` | `"john.smith@example.com"` |
|
|
124
|
+
| `number(0..100)` | `42` |
|
|
125
|
+
| `text(10..50)` | `"Lorem ipsum dolor sit amet"` |
|
|
126
|
+
| `boolean` | `true` or `false` |
|
|
127
|
+
| `date` | `"2024-06-15"` |
|
|
128
|
+
|
|
129
|
+
### Edge Mode
|
|
130
|
+
|
|
131
|
+
Generates boundary values:
|
|
132
|
+
|
|
133
|
+
| Type | Edge Cases |
|
|
134
|
+
|------|------------|
|
|
135
|
+
| `uuid` | All zeros, all ones, version variants |
|
|
136
|
+
| `name` | Empty, single char, very long, unicode |
|
|
137
|
+
| `email` | Minimal (`a@b.c`), special chars, long |
|
|
138
|
+
| `number(0..100)` | `0`, `100`, `-1`, `101` |
|
|
139
|
+
| `text(10..50)` | Empty, min length, max length |
|
|
140
|
+
| `boolean` | `true`, `false` |
|
|
141
|
+
| `date` | Min date, max date, leap year |
|
|
142
|
+
|
|
143
|
+
#### Edge Case Examples
|
|
144
|
+
|
|
145
|
+
```ruby
|
|
146
|
+
# Numbers
|
|
147
|
+
{ "age" => 0 } # Minimum
|
|
148
|
+
{ "age" => 100 } # Maximum
|
|
149
|
+
{ "score" => -1 } # Below minimum
|
|
150
|
+
{ "score" => 101 } # Above maximum
|
|
151
|
+
|
|
152
|
+
# Strings
|
|
153
|
+
{ "name" => "" } # Empty
|
|
154
|
+
{ "name" => "X" } # Single character
|
|
155
|
+
{ "name" => "X" * 1000 } # Very long
|
|
156
|
+
|
|
157
|
+
# Dates
|
|
158
|
+
{ "date" => "1970-01-01" } # Unix epoch
|
|
159
|
+
{ "date" => "2038-01-19" } # Y2038
|
|
160
|
+
{ "date" => "2024-02-29" } # Leap day
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Invalid Mode
|
|
164
|
+
|
|
165
|
+
Generates invalid data:
|
|
166
|
+
|
|
167
|
+
| Type | Invalid Values |
|
|
168
|
+
|------|----------------|
|
|
169
|
+
| `uuid` | `nil`, `"not-a-uuid"`, `123` |
|
|
170
|
+
| `name` | `nil`, `123`, `[]` |
|
|
171
|
+
| `email` | `"not-email"`, `"@invalid"`, `nil` |
|
|
172
|
+
| `number` | `"string"`, `nil`, `NaN` |
|
|
173
|
+
| `text` | `nil`, `123`, `[]` |
|
|
174
|
+
| `boolean` | `nil`, `"maybe"`, `1` |
|
|
175
|
+
| `date` | `"not-date"`, `nil`, `"2024-13-45"` |
|
|
176
|
+
|
|
177
|
+
#### Invalid Value Examples
|
|
178
|
+
|
|
179
|
+
```ruby
|
|
180
|
+
# Wrong types
|
|
181
|
+
{ "age" => "thirty-four" } # String instead of number
|
|
182
|
+
{ "active" => "yes" } # String instead of boolean
|
|
183
|
+
{ "email" => 12345 } # Number instead of string
|
|
184
|
+
|
|
185
|
+
# Null values
|
|
186
|
+
{ "name" => nil }
|
|
187
|
+
{ "required_field" => nil }
|
|
188
|
+
|
|
189
|
+
# Malformed formats
|
|
190
|
+
{ "email" => "not-an-email" }
|
|
191
|
+
{ "date" => "yesterday" }
|
|
192
|
+
{ "uuid" => "12345" }
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Mixed Mode
|
|
196
|
+
|
|
197
|
+
Distributes modes across generation:
|
|
198
|
+
|
|
199
|
+
```ruby
|
|
200
|
+
# Distribution (approximate)
|
|
201
|
+
# - 80% random
|
|
202
|
+
# - 15% edge
|
|
203
|
+
# - 5% invalid
|
|
204
|
+
|
|
205
|
+
users = schema.generate_many(1000, mode: :mixed)
|
|
206
|
+
|
|
207
|
+
# Result distribution:
|
|
208
|
+
# ~800 with realistic values
|
|
209
|
+
# ~150 with edge cases
|
|
210
|
+
# ~50 with invalid values
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## Choosing the Right Mode
|
|
216
|
+
|
|
217
|
+
### Testing Scenarios
|
|
218
|
+
|
|
219
|
+
| Scenario | Recommended Mode |
|
|
220
|
+
|----------|------------------|
|
|
221
|
+
| Happy path testing | `:random` |
|
|
222
|
+
| Boundary testing | `:edge` |
|
|
223
|
+
| Input validation | `:invalid` |
|
|
224
|
+
| Integration testing | `:mixed` |
|
|
225
|
+
| Load testing | `:random` |
|
|
226
|
+
| Security testing | `:edge` + `:invalid` |
|
|
227
|
+
| UI testing | `:random` |
|
|
228
|
+
| API contract testing | `:mixed` |
|
|
229
|
+
|
|
230
|
+
### RSpec Examples
|
|
231
|
+
|
|
232
|
+
```ruby
|
|
233
|
+
RSpec.describe User do
|
|
234
|
+
describe "validations" do
|
|
235
|
+
context "with valid data" do
|
|
236
|
+
let(:user) { schema.generate(mode: :random) }
|
|
237
|
+
|
|
238
|
+
it "is valid" do
|
|
239
|
+
expect(User.new(user)).to be_valid
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
context "with edge cases" do
|
|
244
|
+
let(:user) { schema.generate(mode: :edge) }
|
|
245
|
+
|
|
246
|
+
it "handles edge cases" do
|
|
247
|
+
user_obj = User.new(user)
|
|
248
|
+
# May or may not be valid depending on constraints
|
|
249
|
+
expect { user_obj.validate! }.not_to raise_error(StandardError)
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
context "with invalid data" do
|
|
254
|
+
let(:user) { schema.generate(mode: :invalid) }
|
|
255
|
+
|
|
256
|
+
it "rejects invalid data" do
|
|
257
|
+
expect(User.new(user)).not_to be_valid
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### Comprehensive Testing
|
|
265
|
+
|
|
266
|
+
```ruby
|
|
267
|
+
# Test all modes
|
|
268
|
+
[:random, :edge, :invalid, :mixed].each do |mode|
|
|
269
|
+
context "with #{mode} data" do
|
|
270
|
+
let(:data) { schema.generate(mode: mode) }
|
|
271
|
+
|
|
272
|
+
it "handles #{mode} data gracefully" do
|
|
273
|
+
expect { process(data) }.not_to raise_error
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## Custom Mode Handling
|
|
282
|
+
|
|
283
|
+
### In Custom Types
|
|
284
|
+
|
|
285
|
+
```ruby
|
|
286
|
+
class CustomType < FakeDataDSL::Types::Base
|
|
287
|
+
def generate_random(rng, args)
|
|
288
|
+
# Typical value
|
|
289
|
+
"normal-value-#{rng.int(1, 100)}"
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
def generate_edge(rng, args)
|
|
293
|
+
# Boundary cases
|
|
294
|
+
["", "x", "x" * 1000, "特殊字符", "\x00\x00"].sample
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def generate_invalid(rng, args)
|
|
298
|
+
# Invalid values
|
|
299
|
+
[nil, 123, [], {}, false].sample
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### In Custom Functions
|
|
305
|
+
|
|
306
|
+
```ruby
|
|
307
|
+
FakeDataDSL.register_function(:computed_field) do |context|
|
|
308
|
+
mode = context[:__mode__]
|
|
309
|
+
|
|
310
|
+
case mode
|
|
311
|
+
when :random
|
|
312
|
+
calculate_normal_value(context)
|
|
313
|
+
when :edge
|
|
314
|
+
calculate_edge_value(context)
|
|
315
|
+
when :invalid
|
|
316
|
+
generate_invalid_value
|
|
317
|
+
else
|
|
318
|
+
calculate_normal_value(context)
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Mode-Specific Type Output
|
|
326
|
+
|
|
327
|
+
### Complete Reference Table
|
|
328
|
+
|
|
329
|
+
| Type | Random | Edge | Invalid |
|
|
330
|
+
|------|--------|------|---------|
|
|
331
|
+
| `uuid` | Valid v4 UUID | All zeros | `nil`, string |
|
|
332
|
+
| `ulid` | Valid ULID | Min/max time | `nil`, number |
|
|
333
|
+
| `name` | "John Smith" | "", unicode | `nil`, `123` |
|
|
334
|
+
| `email` | Valid email | "a@b.c" | "invalid" |
|
|
335
|
+
| `url` | Valid URL | Long URL | "not-url" |
|
|
336
|
+
| `number(0..100)` | 42 | 0, 100 | "string" |
|
|
337
|
+
| `boolean` | true/false | true, false | `nil`, "yes" |
|
|
338
|
+
| `date` | Recent date | Epoch, Y2038 | "invalid" |
|
|
339
|
+
| `text(10..50)` | Lorem ipsum | Empty, max | `nil`, `123` |
|
|
340
|
+
| `enum(a,b,c)` | "a", "b", "c" | First, last | `nil`, "invalid" |
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Next Steps
|
|
345
|
+
|
|
346
|
+
- [Random Mode](random.md) - Detailed random generation
|
|
347
|
+
- [Edge Mode](edge.md) - Boundary value testing
|
|
348
|
+
- [Invalid Mode](invalid.md) - Validation testing
|
|
349
|
+
- [Mixed Mode](mixed.md) - Comprehensive testing
|
|
350
|
+
|