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,346 @@
|
|
|
1
|
+
# Behaviors Overview
|
|
2
|
+
|
|
3
|
+
Simulate real-world conditions for testing with behaviors.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [What are Behaviors?](#what-are-behaviors)
|
|
8
|
+
- [Why Use Behaviors?](#why-use-behaviors)
|
|
9
|
+
- [Available Behaviors](#available-behaviors)
|
|
10
|
+
- [Schema-Level vs Field-Level](#schema-level-vs-field-level)
|
|
11
|
+
- [Combining Behaviors](#combining-behaviors)
|
|
12
|
+
- [Error Handling](#error-handling)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## What are Behaviors?
|
|
17
|
+
|
|
18
|
+
Behaviors are modifiers that simulate real-world conditions:
|
|
19
|
+
|
|
20
|
+
- Network latency
|
|
21
|
+
- Service failures
|
|
22
|
+
- Incomplete responses
|
|
23
|
+
- Connection drops
|
|
24
|
+
- HTTP errors
|
|
25
|
+
|
|
26
|
+
They help you test how your application handles imperfect conditions.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Why Use Behaviors?
|
|
31
|
+
|
|
32
|
+
### Testing Scenarios
|
|
33
|
+
|
|
34
|
+
| Scenario | Behavior |
|
|
35
|
+
|----------|----------|
|
|
36
|
+
| Slow API responses | `@latency` |
|
|
37
|
+
| Service outages | `@failure` |
|
|
38
|
+
| Incomplete data | `@partial_data` |
|
|
39
|
+
| Network issues | `@close_connection` |
|
|
40
|
+
| HTTP error codes | `@simulate_error` |
|
|
41
|
+
|
|
42
|
+
### Benefits
|
|
43
|
+
|
|
44
|
+
1. **Resilience Testing**: Find bugs before production
|
|
45
|
+
2. **Timeout Handling**: Verify timeout logic works
|
|
46
|
+
3. **Error Recovery**: Test error handling paths
|
|
47
|
+
4. **UI/UX Testing**: See loading states and error messages
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Available Behaviors
|
|
52
|
+
|
|
53
|
+
### @latency
|
|
54
|
+
|
|
55
|
+
Adds artificial delay to generation.
|
|
56
|
+
|
|
57
|
+
```dsl
|
|
58
|
+
SlowAPI:
|
|
59
|
+
@latency 100ms # Fixed 100ms delay
|
|
60
|
+
@latency 100..500ms # Random 100-500ms delay
|
|
61
|
+
|
|
62
|
+
data: object
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Arguments:**
|
|
66
|
+
- Fixed: `Nms` (e.g., `100ms`)
|
|
67
|
+
- Range: `N..Mms` (e.g., `100..500ms`)
|
|
68
|
+
|
|
69
|
+
### @failure
|
|
70
|
+
|
|
71
|
+
Throws an error with specified probability.
|
|
72
|
+
|
|
73
|
+
```dsl
|
|
74
|
+
FlakyService:
|
|
75
|
+
@failure 5% # 5% chance of failure
|
|
76
|
+
|
|
77
|
+
data: object
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Throws:** `FakeDataDSL::Errors::SimulatedFailure`
|
|
81
|
+
|
|
82
|
+
### @partial_data
|
|
83
|
+
|
|
84
|
+
Randomly omits fields from output.
|
|
85
|
+
|
|
86
|
+
```dsl
|
|
87
|
+
IncompleteResponse:
|
|
88
|
+
@partial_data 20% # 20% chance each field is missing
|
|
89
|
+
|
|
90
|
+
id: uuid
|
|
91
|
+
name: name
|
|
92
|
+
email: email
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### @close_connection
|
|
96
|
+
|
|
97
|
+
Simulates connection drop.
|
|
98
|
+
|
|
99
|
+
```dsl
|
|
100
|
+
UnstableConnection:
|
|
101
|
+
@close_connection 2% # 2% chance of connection drop
|
|
102
|
+
|
|
103
|
+
data: object
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Throws:** `FakeDataDSL::Errors::SimulatedConnectionDrop`
|
|
107
|
+
|
|
108
|
+
### @simulate_error
|
|
109
|
+
|
|
110
|
+
Returns HTTP error status codes.
|
|
111
|
+
|
|
112
|
+
```dsl
|
|
113
|
+
ErrorProne:
|
|
114
|
+
@simulate_error 500 5% # 5% chance of 500 error
|
|
115
|
+
@simulate_error 503 2% # 2% chance of 503 error
|
|
116
|
+
|
|
117
|
+
data: object
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Throws:** `FakeDataDSL::Errors::SimulatedError` with status code
|
|
121
|
+
|
|
122
|
+
### @randomize_order
|
|
123
|
+
|
|
124
|
+
Shuffles array fields randomly.
|
|
125
|
+
|
|
126
|
+
```dsl
|
|
127
|
+
SearchResults:
|
|
128
|
+
@randomize_order
|
|
129
|
+
|
|
130
|
+
results: array(Result, 1..20)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Schema-Level vs Field-Level
|
|
136
|
+
|
|
137
|
+
### Schema-Level Behaviors
|
|
138
|
+
|
|
139
|
+
Apply to the entire schema generation:
|
|
140
|
+
|
|
141
|
+
```dsl
|
|
142
|
+
APIResponse:
|
|
143
|
+
@latency 100..500ms # Delay entire response
|
|
144
|
+
@failure 5% # May fail entirely
|
|
145
|
+
|
|
146
|
+
id: uuid
|
|
147
|
+
data: object
|
|
148
|
+
meta: object
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Field-Level Behaviors
|
|
152
|
+
|
|
153
|
+
Apply to specific fields only:
|
|
154
|
+
|
|
155
|
+
```dsl
|
|
156
|
+
User:
|
|
157
|
+
id: uuid
|
|
158
|
+
name: name
|
|
159
|
+
|
|
160
|
+
# This specific field may be missing
|
|
161
|
+
avatar: url @partial_data 30%
|
|
162
|
+
|
|
163
|
+
# This field has extra latency
|
|
164
|
+
external_data: object @latency 200ms
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Combining Both
|
|
168
|
+
|
|
169
|
+
```dsl
|
|
170
|
+
UserAPI:
|
|
171
|
+
@latency 50..100ms # Base latency for all
|
|
172
|
+
@failure 2% # 2% total failure rate
|
|
173
|
+
|
|
174
|
+
id: uuid
|
|
175
|
+
name: name
|
|
176
|
+
|
|
177
|
+
# Additional field-specific behaviors
|
|
178
|
+
avatar: url @partial_data 40%
|
|
179
|
+
profile: object @latency 100..300ms
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Combining Behaviors
|
|
185
|
+
|
|
186
|
+
### Multiple Schema Behaviors
|
|
187
|
+
|
|
188
|
+
```dsl
|
|
189
|
+
RealWorldAPI:
|
|
190
|
+
@latency 100..1000ms # Network latency
|
|
191
|
+
@failure 3% # Random failures
|
|
192
|
+
@simulate_error 500 1% # Server errors
|
|
193
|
+
@simulate_error 503 1% # Service unavailable
|
|
194
|
+
@partial_data 10% # Missing fields
|
|
195
|
+
|
|
196
|
+
data: object
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Behavior Order
|
|
200
|
+
|
|
201
|
+
Behaviors are applied in order:
|
|
202
|
+
1. `@latency` - Delay happens first
|
|
203
|
+
2. `@failure` - May throw before generating
|
|
204
|
+
3. `@partial_data` - Applied after generation
|
|
205
|
+
4. `@randomize_order` - Applied last
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Error Handling
|
|
210
|
+
|
|
211
|
+
### Handling Behavior Errors
|
|
212
|
+
|
|
213
|
+
```ruby
|
|
214
|
+
schema = FakeDataDSL.load('flaky_api.dsl')
|
|
215
|
+
|
|
216
|
+
begin
|
|
217
|
+
data = schema.generate
|
|
218
|
+
process(data)
|
|
219
|
+
|
|
220
|
+
rescue FakeDataDSL::Errors::SimulatedFailure
|
|
221
|
+
# Handle @failure behavior
|
|
222
|
+
puts "Service temporarily unavailable"
|
|
223
|
+
|
|
224
|
+
rescue FakeDataDSL::Errors::SimulatedConnectionDrop
|
|
225
|
+
# Handle @close_connection behavior
|
|
226
|
+
puts "Connection lost"
|
|
227
|
+
|
|
228
|
+
rescue FakeDataDSL::Errors::SimulatedError => e
|
|
229
|
+
# Handle @simulate_error behavior
|
|
230
|
+
puts "HTTP #{e.status_code}: #{e.message}"
|
|
231
|
+
|
|
232
|
+
rescue FakeDataDSL::Errors::LatencyLimitError => e
|
|
233
|
+
# Handle latency exceeding limits
|
|
234
|
+
puts "Request timed out"
|
|
235
|
+
end
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Error Types
|
|
239
|
+
|
|
240
|
+
| Behavior | Error Class |
|
|
241
|
+
|----------|-------------|
|
|
242
|
+
| `@failure` | `SimulatedFailure` |
|
|
243
|
+
| `@close_connection` | `SimulatedConnectionDrop` |
|
|
244
|
+
| `@simulate_error` | `SimulatedError` |
|
|
245
|
+
| `@latency` (over limit) | `LatencyLimitError` |
|
|
246
|
+
|
|
247
|
+
### Testing with Errors
|
|
248
|
+
|
|
249
|
+
```ruby
|
|
250
|
+
RSpec.describe "API Client" do
|
|
251
|
+
let(:schema) { FakeDataDSL.load('flaky_api.dsl') }
|
|
252
|
+
|
|
253
|
+
it "handles failures gracefully" do
|
|
254
|
+
# Force failure mode
|
|
255
|
+
allow_any_instance_of(FakeDataDSL::Behaviors::Failure)
|
|
256
|
+
.to receive(:should_apply?).and_return(true)
|
|
257
|
+
|
|
258
|
+
expect { schema.generate }
|
|
259
|
+
.to raise_error(FakeDataDSL::Errors::SimulatedFailure)
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
it "retries on connection drops" do
|
|
263
|
+
client = APIClient.new
|
|
264
|
+
allow(client).to receive(:fetch)
|
|
265
|
+
.and_raise(FakeDataDSL::Errors::SimulatedConnectionDrop)
|
|
266
|
+
.once
|
|
267
|
+
.and_call_original
|
|
268
|
+
|
|
269
|
+
result = client.fetch_with_retry
|
|
270
|
+
expect(result).to be_present
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Behavior Configuration
|
|
278
|
+
|
|
279
|
+
### Global Settings
|
|
280
|
+
|
|
281
|
+
```ruby
|
|
282
|
+
FakeDataDSL.configure do |config|
|
|
283
|
+
# Maximum allowed latency
|
|
284
|
+
config.limits.max_latency_ms = 5000 # 5 seconds
|
|
285
|
+
|
|
286
|
+
# Disable all behaviors (for certain tests)
|
|
287
|
+
config.behaviors_enabled = false
|
|
288
|
+
end
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Disabling Behaviors
|
|
292
|
+
|
|
293
|
+
```ruby
|
|
294
|
+
# Globally
|
|
295
|
+
FakeDataDSL.configure { |c| c.behaviors_enabled = false }
|
|
296
|
+
|
|
297
|
+
# Per generation
|
|
298
|
+
schema.generate(behaviors: false)
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Use Cases
|
|
304
|
+
|
|
305
|
+
### Load Testing
|
|
306
|
+
|
|
307
|
+
```dsl
|
|
308
|
+
LoadTestAPI:
|
|
309
|
+
@latency 50..2000ms # Variable latency
|
|
310
|
+
|
|
311
|
+
data: array(Item, 10..100)
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### Chaos Engineering
|
|
315
|
+
|
|
316
|
+
```dsl
|
|
317
|
+
ChaosAPI:
|
|
318
|
+
@latency 100..5000ms
|
|
319
|
+
@failure 10%
|
|
320
|
+
@close_connection 5%
|
|
321
|
+
@simulate_error 500 3%
|
|
322
|
+
@simulate_error 503 2%
|
|
323
|
+
@partial_data 15%
|
|
324
|
+
|
|
325
|
+
data: object
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### Integration Testing
|
|
329
|
+
|
|
330
|
+
```dsl
|
|
331
|
+
ThirdPartyAPI:
|
|
332
|
+
@latency 200..1000ms # Realistic external API latency
|
|
333
|
+
@failure 1% # Occasional failures
|
|
334
|
+
@simulate_error 429 5% # Rate limiting
|
|
335
|
+
|
|
336
|
+
data: object
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## Next Steps
|
|
342
|
+
|
|
343
|
+
- [Latency Simulation](latency.md) - Detailed latency guide
|
|
344
|
+
- [Failure Simulation](failure.md) - Failure testing guide
|
|
345
|
+
- [Custom Behaviors](custom.md) - Creating your own behaviors
|
|
346
|
+
|