100% found this document useful (10 votes)
25 views

PDF (Ebook) Test-Driven Development with Python. Obey the Testing Goat. Using Django, Selenium, and JavaScript by Harry J. W. Percival ISBN 9781491958674, 9781491958704, 1491958677, 1491958707 download

The document provides information about various ebooks available for download, including 'Test-Driven Development with Python' by Harry J.W. Percival, which focuses on using Django, Selenium, and JavaScript for effective testing practices. It includes details such as ISBN numbers, links for downloading, and praise from notable figures in the Python community. Additionally, it outlines the content structure of the book, emphasizing its practical approach to test-driven development and web application development with Python.

Uploaded by

coutondulmer
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (10 votes)
25 views

PDF (Ebook) Test-Driven Development with Python. Obey the Testing Goat. Using Django, Selenium, and JavaScript by Harry J. W. Percival ISBN 9781491958674, 9781491958704, 1491958677, 1491958707 download

The document provides information about various ebooks available for download, including 'Test-Driven Development with Python' by Harry J.W. Percival, which focuses on using Django, Selenium, and JavaScript for effective testing practices. It includes details such as ISBN numbers, links for downloading, and praise from notable figures in the Python community. Additionally, it outlines the content structure of the book, emphasizing its practical approach to test-driven development and web application development with Python.

Uploaded by

coutondulmer
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 65

Download Full Version ebook - Visit ebooknice.

com

(Ebook) Test-Driven Development with Python. Obey


the Testing Goat. Using Django, Selenium, and
JavaScript by Harry J. W. Percival ISBN
9781491958674, 9781491958704, 1491958677,
1491958707
https://ebooknice.com/product/test-driven-development-with-
python-obey-the-testing-goat-using-django-selenium-and-
javascript-6712714

Click the button below to download

DOWLOAD EBOOK

Discover More Ebook - Explore Now at ebooknice.com


Instant digital products (PDF, ePub, MOBI) ready for you
Download now and discover formats that fit your needs...

Start reading on any device today!

(Ebook) Biota Grow 2C gather 2C cook by Loucas, Jason;


Viles, James ISBN 9781459699816, 9781743365571,
9781925268492, 1459699815, 1743365578, 1925268497
https://ebooknice.com/product/biota-grow-2c-gather-2c-cook-6661374

ebooknice.com

(Ebook) Matematik 5000+ Kurs 2c Lärobok by Lena


Alfredsson, Hans Heikne, Sanna Bodemyr ISBN 9789127456600,
9127456609
https://ebooknice.com/product/matematik-5000-kurs-2c-larobok-23848312

ebooknice.com

(Ebook) SAT II Success MATH 1C and 2C 2002 (Peterson's SAT


II Success) by Peterson's ISBN 9780768906677, 0768906679

https://ebooknice.com/product/sat-ii-success-
math-1c-and-2c-2002-peterson-s-sat-ii-success-1722018

ebooknice.com

(Ebook) Master SAT II Math 1c and 2c 4th ed (Arco Master


the SAT Subject Test: Math Levels 1 & 2) by Arco ISBN
9780768923049, 0768923042
https://ebooknice.com/product/master-sat-ii-math-1c-and-2c-4th-ed-
arco-master-the-sat-subject-test-math-levels-1-2-2326094

ebooknice.com
(Ebook) Test-Driven Development with Python by Harry J. W.
Percival ISBN 9781449364823, 1449364829

https://ebooknice.com/product/test-driven-development-with-
python-4911642

ebooknice.com

(Ebook) Test-Driven Development with Python by Harry J.W.


Percival

https://ebooknice.com/product/test-driven-development-with-
python-50194730

ebooknice.com

(Ebook) Cambridge IGCSE and O Level History Workbook 2C -


Depth Study: the United States, 1919-41 2nd Edition by
Benjamin Harrison ISBN 9781398375147, 9781398375048,
1398375144, 1398375047
https://ebooknice.com/product/cambridge-igcse-and-o-level-history-
workbook-2c-depth-study-the-united-states-1919-41-2nd-edition-53538044

ebooknice.com

(Ebook) Python Testing Cookbook: Easy solutions to test


your Python projects using test-driven development and
Selenium, 2nd Edition by Greg L. Turnquist & Bhaskar N.
Das ISBN 9781787122529, 1787122522
https://ebooknice.com/product/python-testing-cookbook-easy-solutions-
to-test-your-python-projects-using-test-driven-development-and-
selenium-2nd-edition-10806786
ebooknice.com

(Ebook) Python Testing with Selenium: Learn to Implement


Different Testing Techniques Using the Selenium WebDriver
by Sujay Raghavendra ISBN 9781484262481, 9781484262498,
1484262484, 1484262492
https://ebooknice.com/product/python-testing-with-selenium-learn-to-
implement-different-testing-techniques-using-the-selenium-
webdriver-22474650
ebooknice.com
2n
d
Ed
iti
on
Test-Driven
Development
with Python
OBEY THE TESTING GOAT:
USING DJANGO, SELENIUM & JAVASCRIPT

Fewer Bugs and Less Stress with Selenium,


Django, and JavaScript

Harry J.W. Percival


WOW! eBook
www.wowebook.org
WOW! eBook
www.wowebook.org
Praise for Test-Driven Development with Python

In this book, Harry takes us on an adventure of discovery with Python and testing.
It’s an excellent book, fun to read and full of vital information. It has my highest
recommendations for anyone interested in testing with Python, learning Django, or
wanting to use Selenium. Testing is essential for developer sanity and it’s a notoriously
difficult field, full of trade-offs. Harry does a fantastic job of holding our attention whilst
exploring real-world testing practices.
—Michael Foord, Python Core Developer and Maintainer
of unittest

This book is far more than an introduction to test-driven development—it’s a complete


best-practices crash course, from start to finish, into modern web application
development with Python. Every web developer needs this book.
—Kenneth Reitz, Fellow at Python Software Foundation

Harry’s book is what we wish existed when we were learning Django. At a pace that’s
achievable and yet delightfully challenging, it provides excellent instruction for Django
and various test practices. The material on Selenium alone makes the book worth
purchasing, but there’s so much more!
—Daniel and Audrey Roy Greenfeld, authors of Two Scoops of
Django (Two Scoops Press)

WOW! eBook
www.wowebook.org
WOW! eBook
www.wowebook.org
SECOND EDITION

Test-Driven Development
with Python
Obey the Testing Goat: Using Django,
Selenium, and JavaScript

Harry J.W. Percival

Beijing Boston Farnham Sebastopol Tokyo

WOW! eBook
www.wowebook.org
Test-Driven Development with Python
by Harry J.W. Percival
Copyright © 2017 Harry Percival. All rights reserved.
Printed in the United States of America.
Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472.
O’Reilly books may be purchased for educational, business, or sales promotional use. Online editions are
also available for most titles (http://oreilly.com/safari). For more information, contact our corporate/insti‐
tutional sales department: 800-998-9938 or [email protected].

Editor: Nan Barber Indexer: Judith McConville


Production Editor: Kristen Brown Interior Designer: David Futato
Copyeditor: Kim Cofer Cover Designer: Karen Montgomery
Proofreader: Rachel Monaghan Illustrator: Rebecca Demarest

August 2017: Second Edition

Revision History for the Second Edition


2017-08-02: First Release

See http://oreilly.com/catalog/errata.csp?isbn=9781491958704 for release details.

The O’Reilly logo is a registered trademark of O’Reilly Media, Inc. Test-Driven Development with Python,
the cover image, and related trade dress are trademarks of O’Reilly Media, Inc.
While the publisher and the author have used good faith efforts to ensure that the information and
instructions contained in this work are accurate, the publisher and the author disclaim all responsibility
for errors or omissions, including without limitation responsibility for damages resulting from the use of
or reliance on this work. Use of the information and instructions contained in this work is at your own
risk. If any code samples or other technology this work contains or describes is subject to open source
licenses or the intellectual property rights of others, it is your responsibility to ensure that your use
thereof complies with such licenses and/or rights.

978-1-491-95870-4
[LSI]

WOW! eBook
www.wowebook.org
Table of Contents

Preface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv

Prerequisites and Assumptions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi

Companion Video. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi

Acknowledgments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii

Part I. The Basics of TDD and Django


1. Getting Django Set Up Using a Functional Test. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Obey the Testing Goat! Do Nothing Until You Have a Test 3
Getting Django Up and Running 6
Starting a Git Repository 8

2. Extending Our Functional Test Using the unittest Module. . . . . . . . . . . . . . . . . . . . . . . 13


Using a Functional Test to Scope Out a Minimum Viable App 14
The Python Standard Library’s unittest Module 16
Commit 19

3. Testing a Simple Home Page with Unit Tests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21


Our First Django App, and Our First Unit Test 22
Unit Tests, and How They Differ from Functional Tests 22
Unit Testing in Django 23
Django’s MVC, URLs, and View Functions 24
At Last! We Actually Write Some Application Code! 26
urls.py 28

WOW! eBook
www.wowebook.org
Unit Testing a View 30
The Unit-Test/Code Cycle 32

4. What Are We Doing with All These Tests? (And, Refactoring). . . . . . . . . . . . . . . . . . . . . 37


Programming Is Like Pulling a Bucket of Water Up from a Well 38
Using Selenium to Test User Interactions 40
The “Don’t Test Constants” Rule, and Templates to the Rescue 43
Refactoring to Use a Template 43
The Django Test Client 47
On Refactoring 49
A Little More of Our Front Page 50
Recap: The TDD Process 52

5. Saving User Input: Testing the Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55


Wiring Up Our Form to Send a POST Request 55
Processing a POST Request on the Server 59
Passing Python Variables to Be Rendered in the Template 60
Three Strikes and Refactor 64
The Django ORM and Our First Model 66
Our First Database Migration 68
The Test Gets Surprisingly Far 68
A New Field Means a New Migration 69
Saving the POST to the Database 70
Redirect After a POST 73
Better Unit Testing Practice: Each Test Should Test One Thing 74
Rendering Items in the Template 75
Creating Our Production Database with migrate 78
Recap 80

6. Improving Functional Tests: Ensuring Isolation and Removing Voodoo Sleeps. . . . . . 83


Ensuring Test Isolation in Functional Tests 83
Running Just the Unit Tests 87
Aside: Upgrading Selenium and Geckodriver 88
On Implicit and Explicit Waits, and Voodoo time.sleeps 89

7. Working Incrementally. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Small Design When Necessary 95
Not Big Design Up Front 95
YAGNI! 96
REST (ish) 96
Implementing the New Design Incrementally Using TDD 97
Ensuring We Have a Regression Test 99

vi | Table of Contents

WOW! eBook
www.wowebook.org
Iterating Towards the New Design 101
Taking a First, Self-Contained Step: One New URL 103
A New URL 103
A New View Function 104
Green? Refactor 106
Another Small Step: A Separate Template for Viewing Lists 107
A Third Small Step: A URL for Adding List Items 109
A Test Class for New List Creation 109
A URL and View for New List Creation 110
Removing Now-Redundant Code and Tests 111
A Regression! Pointing Our Forms at the New URL 112
Biting the Bullet: Adjusting Our Models 113
A Foreign Key Relationship 115
Adjusting the Rest of the World to Our New Models 117
Each List Should Have Its Own URL 119
Capturing Parameters from URLs 120
Adjusting new_list to the New World 121
The Functional Tests Detect Another Regression 123
One More View to Handle Adding Items to an Existing List 124
Beware of Greedy Regular Expressions! 125
The Last New URL 125
The Last New View 126
Testing the Response Context Objects Directly 127
A Final Refactor Using URL includes 129

Part II. Web Development Sine Qua Nons


8. Prettification: Layout and Styling, and What to Test About It. . . . . . . . . . . . . . . . . . . 135
What to Functionally Test About Layout and Style 135
Prettification: Using a CSS Framework 139
Django Template Inheritance 141
Integrating Bootstrap 142
Rows and Columns 143
Static Files in Django 144
Switching to StaticLiveServerTestCase 145
Using Bootstrap Components to Improve the Look of the Site 146
Jumbotron! 146
Large Inputs 147
Table Styling 147
Using Our Own CSS 147
What We Glossed Over: collectstatic and Other Static Directories 149

Table of Contents | vii

WOW! eBook
www.wowebook.org
A Few Things That Didn’t Make It 152

9. Testing Deployment Using a Staging Site. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155


TDD and the Danger Areas of Deployment 156
As Always, Start with a Test 157
Getting a Domain Name 160
Manually Provisioning a Server to Host Our Site 160
Choosing Where to Host Our Site 160
Spinning Up a Server 161
User Accounts, SSH, and Privileges 162
Installing Nginx 162
Installing Python 3.6 163
Configuring Domains for Staging and Live 163
Using the FT to Confirm the Domain Works and Nginx Is Running 164
Deploying Our Code Manually 164
Adjusting the Database Location 165
Creating a Virtualenv Manually, and Using requirements.txt 167
Simple Nginx Configuration 168
Creating the Database with migrate 171
Success! Our Hack Deployment Works 173

10. Getting to a Production-Ready Deployment. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175


Switching to Gunicorn 175
Getting Nginx to Serve Static Files 177
Switching to Using Unix Sockets 177
Switching DEBUG to False and Setting ALLOWED_HOSTS 178
Using Systemd to Make Sure Gunicorn Starts on Boot 179
Saving Our Changes: Adding Gunicorn to Our requirements.txt 180
Thinking About Automating 181
Saving Templates for Our Provisioning Config Files 181
Saving Our Progress 184

11. Automating Deployment with Fabric. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187


Breakdown of a Fabric Script for Our Deployment 188
Creating the Directory Structure 189
Pulling Down Our Source Code with Git 189
Updating settings.py 190
Updating the Virtualenv 192
Migrating the Database If Necessary 192
Trying It Out 193
Deploying to Live 194
Nginx and Gunicorn Config Using sed 196

viii | Table of Contents

WOW! eBook
www.wowebook.org
Git Tag the Release 199
Further Reading 199

12. Splitting Our Tests into Multiple Files, and a Generic Wait Helper. . . . . . . . . . . . . . . . 201
Start on a Validation FT: Preventing Blank Items 201
Skipping a Test 202
Splitting Functional Tests Out into Many Files 203
Running a Single Test File 206
A New Functional Test Tool: A Generic Explicit Wait Helper 207
Finishing Off the FT 211
Refactoring Unit Tests into Several Files 213

13. Validation at the Database Layer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217


Model-Layer Validation 218
The self.assertRaises Context Manager 218
A Django Quirk: Model Save Doesn’t Run Validation 219
Surfacing Model Validation Errors in the View 220
Checking That Invalid Input Isn’t Saved to the Database 223
Django Pattern: Processing POST Requests in the Same View as Renders the
Form 225
Refactor: Transferring the new_item Functionality into view_list 226
Enforcing Model Validation in view_list 229
Refactor: Removing Hardcoded URLs 231
The {% url %} Template Tag 231
Using get_absolute_url for Redirects 232

14. A Simple Form. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235


Moving Validation Logic into a Form 235
Exploring the Forms API with a Unit Test 236
Switching to a Django ModelForm 238
Testing and Customising Form Validation 239
Using the Form in Our Views 241
Using the Form in a View with a GET Request 241
A Big Find and Replace 242
Using the Form in a View That Takes POST Requests 245
Adapting the Unit Tests for the new_list View 245
Using the Form in the View 246
Using the Form to Display Errors in the Template 247
Using the Form in the Other View 248
A Helper Method for Several Short Tests 248
An Unexpected Benefit: Free Client-Side Validation from HTML5 251
A Pat on the Back 253

Table of Contents | ix

WOW! eBook
www.wowebook.org
But Have We Wasted a Lot of Time? 254
Using the Form’s Own Save Method 254

15. More Advanced Forms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259


Another FT for Duplicate Items 259
Preventing Duplicates at the Model Layer 260
A Little Digression on Queryset Ordering and String Representations 263
Rewriting the Old Model Test 265
Some Integrity Errors Do Show Up on Save 267
Experimenting with Duplicate Item Validation at the Views Layer 268
A More Complex Form to Handle Uniqueness Validation 269
Using the Existing List Item Form in the List View 271
Wrapping Up: What We’ve Learned About Testing Django 273

16. Dipping Our Toes, Very Tentatively, into JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . 277


Starting with an FT 277
Setting Up a Basic JavaScript Test Runner 279
Using jQuery and the Fixtures Div 281
Building a JavaScript Unit Test for Our Desired Functionality 285
Fixtures, Execution Order, and Global State: Key Challenges of JS Testing 287
console.log for Debug Printing 287
Using an Initialize Function for More Control Over Execution Time 289
Columbo Says: Onload Boilerplate and Namespacing 291
JavaScript Testing in the TDD Cycle 292
A Few Things That Didn’t Make It 293

17. Deploying Our New Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295


Staging Deploy 295
Live Deploy 296
What to Do If You See a Database Error 296
Wrap-Up: git tag the New Release 296

Part III. More Advanced Topics in Testing


18. User Authentication, Spiking, and De-Spiking. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Passwordless Auth 302
Exploratory Coding, aka “Spiking” 302
Starting a Branch for the Spike 303
Frontend Log in UI 303
Sending Emails from Django 304
Using Environment Variables to Avoid Secrets in Source Code 306

x | Table of Contents

WOW! eBook
www.wowebook.org
Storing Tokens in the Database 307
Custom Authentication Models 307
Finishing the Custom Django Auth 309
De-spiking 313
Reverting Our Spiked Code 315
A Minimal Custom User Model 316
Tests as Documentation 319
A Token Model to Link Emails with a Unique ID 320

19. Using Mocks to Test External Dependencies or Reduce Duplication. . . . . . . . . . . . . . 323


Before We Start: Getting the Basic Plumbing In 323
Mocking Manually, aka Monkeypatching 324
The Python Mock Library 328
Using unittest.patch 328
Getting the FT a Little Further Along 331
Testing the Django Messages Framework 331
Adding Messages to Our HTML 333
Starting on the Login URL 334
Checking That We Send the User a Link with a Token 335
De-spiking Our Custom Authentication Backend 337
1 if = 1 More Test 338
The get_user Method 341
Using Our Auth Backend in the Login View 343
An Alternative Reason to Use Mocks: Reducing Duplication 344
Using mock.return_value 347
Patching at the Class Level 349
The Moment of Truth: Will the FT Pass? 351
It Works in Theory! Does It Work in Practice? 353
Finishing Off Our FT, Testing Logout 354

20. Test Fixtures and a Decorator for Explicit Waits. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359


Skipping the Login Process by Pre-creating a Session 360
Checking That It Works 362
Our Final Explicit Wait Helper: A Wait Decorator 364

21. Server-Side Debugging. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369


The Proof Is in the Pudding: Using Staging to Catch Final Bugs 369
Setting Up Logging 370
Setting Secret Environment Variables on the Server 372
Adapting Our FT to Be Able to Test Real Emails via POP3 372
Managing the Test Database on Staging 376
A Django Management Command to Create Sessions 376

Table of Contents | xi

WOW! eBook
www.wowebook.org
Getting the FT to Run the Management Command on the Server 378
Using Fabric Directly from Python 379
Recap: Creating Sessions Locally Versus Staging 380
Baking In Our Logging Code 382
Wrap-Up 382

22. Finishing “My Lists”: Outside-In TDD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385


The Alternative: “Inside-Out” 385
Why Prefer “Outside-In”? 386
The FT for “My Lists” 386
The Outside Layer: Presentation and Templates 389
Moving Down One Layer to View Functions (the Controller) 390
Another Pass, Outside-In 391
A Quick Restructure of the Template Inheritance Hierarchy 391
Designing Our API Using the Template 392
Moving Down to the Next Layer: What the View Passes to the Template 393
The Next “Requirement” from the Views Layer: New Lists Should Record
Owner 394
A Decision Point: Whether to Proceed to the Next Layer with a Failing
Test 395
Moving Down to the Model Layer 396
Final Step: Feeding Through the .name API from the Template 398

23. Test Isolation, and “Listening to Your Tests”. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401


Revisiting Our Decision Point: The Views Layer Depends on Unwritten
Models Code 401
A First Attempt at Using Mocks for Isolation 402
Using Mock side_effects to Check the Sequence of Events 404
Listen to Your Tests: Ugly Tests Signal a Need to Refactor 406
Rewriting Our Tests for the View to Be Fully Isolated 406
Keep the Old Integrated Test Suite Around as a Sanity Check 406
A New Test Suite with Full Isolation 407
Thinking in Terms of Collaborators 407
Moving Down to the Forms Layer 412
Keep Listening to Your Tests: Removing ORM Code from Our Application 413
Finally, Moving Down to the Models Layer 416
Back to Views 419
The Moment of Truth (and the Risks of Mocking) 420
Thinking of Interactions Between Layers as “Contracts” 421
Identifying Implicit Contracts 422
Fixing the Oversight 424
One More Test 425

xii | Table of Contents

WOW! eBook
www.wowebook.org
Tidy Up: What to Keep from Our Integrated Test Suite 426
Removing Redundant Code at the Forms Layer 426
Removing the Old Implementation of the View 427
Removing Redundant Code at the Forms Layer 429
Conclusions: When to Write Isolated Versus Integrated Tests 429
Let Complexity Be Your Guide 430
Should You Do Both? 431
Onwards! 431

24. Continuous Integration (CI). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433


Installing Jenkins 433
Configuring Jenkins 434
Initial Unlock 435
Suggested Plugins for Now 435
Configuring the Admin User 435
Adding Plugins 437
Telling Jenkins Where to Find Python 3 and Xvfb 437
Finishing Off with HTTPS 438
Setting Up Our Project 438
First Build! 439
Setting Up a Virtual Display So the FTs Can Run Headless 441
Taking Screenshots 443
If in Doubt, Try Bumping the Timeout! 447
Running Our QUnit JavaScript Tests in Jenkins with PhantomJS 448
Installing node 448
Adding the Build Steps to Jenkins 449
More Things to Do with a CI Server 451

25. The Token Social Bit, the Page Pattern, and an Exercise for the Reader. . . . . . . . . . . 453
An FT with Multiple Users, and addCleanup 453
The Page Pattern 455
Extend the FT to a Second User, and the “My Lists” Page 458
An Exercise for the Reader 459

26. Fast Tests, Slow Tests, and Hot Lava. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463


Thesis: Unit Tests Are Superfast and Good Besides That 464
Faster Tests Mean Faster Development 465
The Holy Flow State 465
Slow Tests Don’t Get Run as Often, Which Causes Bad Code 465
We’re Fine Now, but Integrated Tests Get Slower Over Time 465
Don’t Take It from Me 466
And Unit Tests Drive Good Design 466

Table of Contents | xiii

WOW! eBook
www.wowebook.org
The Problems with “Pure” Unit Tests 466
Isolated Tests Can Be Harder to Read and Write 466
Isolated Tests Don’t Automatically Test Integration 466
Unit Tests Seldom Catch Unexpected Bugs 466
Mocky Tests Can Become Closely Tied to Implementation 467
But All These Problems Can Be Overcome 467
Synthesis: What Do We Want from Our Tests, Anyway? 467
Correctness 467
Clean, Maintainable Code 467
Productive Workflow 468
Evaluate Your Tests Against the Benefits You Want from Them 468
Architectural Solutions 469
Ports and Adapters/Hexagonal/Clean Architecture 469
Functional Core, Imperative Shell 469
Conclusion 470
Further Reading 470

Obey the Testing Goat!. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473

A. PythonAnywhere. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475

B. Django Class-Based Views. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479

C. Provisioning with Ansible. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491

D. Testing Database Migrations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497

E. Behaviour-Driven Development (BDD). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503

F. Building a REST API: JSON, Ajax, and Mocking with JavaScript. . . . . . . . . . . . . . . . . . . . 519

G. Django-Rest-Framework. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541

H. Cheat Sheet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553

I. What to Do Next. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557

J. Source Code Examples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561

Bibliography. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565

Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567

xiv | Table of Contents

WOW! eBook
www.wowebook.org
Preface

This book is my attempt to share with the world the journey I’ve taken from “hack‐
ing” to “software engineering”. It’s mainly about testing, but there’s a lot more to it, as
you’ll soon see.
I want to thank you for reading it.
If you bought a copy, then I’m very grateful. If you’re reading the free online version,
then I’m still grateful that you’ve decided it’s worth spending some of your time on.
Who knows, perhaps once you get to the end, you’ll decide it’s good enough to buy a
real copy for yourself or for a friend.
If you have any comments, questions, or suggestions, I’d love to hear from you. You
can reach me directly via [email protected], or on Twitter @hjwp. You
can also check out the website and my blog, and there’s a mailing list.
I hope you’ll enjoy reading this book as much as I enjoyed writing it.

Why I Wrote a Book About Test-Driven Development


“Who are you, why are you writing this book, and why should I read it?” I hear you ask.
I’m still quite early on in my programming career. They say that in any discipline, you
go from apprentice, to journeyman, and eventually, sometimes, on to master. I’d say
that I’m—at best—a journeyman programmer. But I was lucky enough, early on in
my career, to fall in with a bunch of TDD fanatics, and it made such a big impact on
my programming that I’m burning to share it with everyone. You might say I have the
enthusiasm of a recent convert, and the learning experience is still a recent memory
for me, so I hope I can still empathise with beginners.
When I first learned Python (from Mark Pilgrim’s excellent Dive Into Python), I came
across the concept of TDD, and thought “Yes. I can definitely see the sense in that.”
Perhaps you had a similar reaction when you first heard about TDD? It sounds like a

xv

WOW! eBook
www.wowebook.org
really sensible approach, a really good habit to get into—like regularly flossing your
teeth.
Then came my first big project, and you can guess what happened—there was a cli‐
ent, there were deadlines, there was lots to do, and any good intentions about TDD
went straight out of the window.
And, actually, it was fine. I was fine.
At first.
At first I knew I didn’t really need TDD because it was a small website, and I could
easily test whether things worked by just manually checking it out. Click this link
here, choose that drop-down item there, and this should happen. Easy. This whole
writing tests thing sounded like it would have taken ages, and besides, I fancied
myself, from the full height of my three weeks of adult coding experience, as being a
pretty good programmer. I could handle it. Easy.
Then came the fearful goddess Complexity. She soon showed me the limits of my
experience.
The project grew. Parts of the system started to depend on other parts. I did my best
to follow good principles like DRY (Don’t Repeat Yourself), but that just led to some
pretty dangerous territory. Soon I was playing with multiple inheritance. Class hierar‐
chies eight levels deep. eval statements.
I became scared of making changes to my code. I was no longer sure what depended
on what, and what might happen if I changed this code over here, oh gosh, I think that
bit over there inherits from it—no, it doesn’t, it’s overriden. Oh, but it depends on
that class variable. Right, well, as long as I override the override it should be fine. I’ll
just check—but checking was getting much harder. There were lots of sections to the
site now, and clicking through them all manually was starting to get impractical. Bet‐
ter to leave well enough alone, forget refactoring, just make do.
Soon I had a hideous, ugly mess of code. New development became painful.
Not too long after this, I was lucky enough to get a job with a company called
Resolver Systems (now PythonAnywhere), where Extreme Programming (XP) was
the norm. They introduced me to rigorous TDD.
Although my previous experience had certainly opened my mind to the possible ben‐
efits of automated testing, I still dragged my feet at every stage. “I mean, testing in
general might be a good idea, but really? All these tests? Some of them seem like a
total waste of time… What? Functional tests as well as unit tests? Come on, that’s
overdoing it! And this TDD test/minimal-code-change/test cycle? This is just silly!
We don’t need all these baby steps! Come on, we can see what the right answer is, why
don’t we just skip to the end?”

xvi | Preface

WOW! eBook
www.wowebook.org
Believe me, I second-guessed every rule, I suggested every shortcut, I demanded justi‐
fications for every seemingly pointless aspect of TDD, and I came out seeing the wis‐
dom of it all. I’ve lost count of the number of times I’ve thought “Thanks, tests”, as a
functional test uncovers a regression we would never have predicted, or a unit test
saves me from making a really silly logic error. Psychologically, it’s made development
a much less stressful process. It produces code that’s a pleasure to work with.
So, let me tell you all about it!

Aims of This Book


My main aim is to impart a methodology—a way of doing web development, which I
think makes for better web apps and happier developers. There’s not much point in a
book that just covers material you could find by Googling, so this book isn’t a guide
to Python syntax, or a tutorial on web development per se. Instead, I hope to teach
you how to use TDD to get more reliably to our shared, holy goal: clean code that
works.
With that said: I will constantly refer to a real practical example, by building a web
app from scratch using tools like Django, Selenium, jQuery, and Mock. I’m not
assuming any prior knowledge of any of these, so you should come out of the other
end of this book with a decent introduction to those tools, as well as the discipline of
TDD.
In Extreme Programming we always pair-program, so I’ve imagined writing this book
as if I was pairing with my previous self, having to explain how the tools work and
answer questions about why we code in this particular way. So, if I ever take a bit of a
patronising tone, it’s because I’m not all that smart, and I have to be very patient with
myself. And if I ever sound defensive, it’s because I’m the kind of annoying person
that systematically disagrees with whatever anyone else says, so sometimes it takes a
lot of justifying to convince myself of anything.

Outline
I’ve split this book into three parts.
Part I (Chapters 1–7): The basics
Dives straight into building a simple web app using TDD. We start by writing a
functional test (with Selenium), and then we go through the basics of Django—
models, views, templates—with rigorous unit testing at every stage. I also intro‐
duce the Testing Goat.

Preface | xvii

WOW! eBook
www.wowebook.org
Part II (Chapters 8–17): Web development essentials
Covers some of the trickier but unavoidable aspects of web development, and
shows how testing can help us with them: static files, deployment to production,
form data validation, database migrations, and the dreaded JavaScript.
Part III (Chapters 18–26): More advanced testing topics
Mocking, integrating a third-party system, test fixtures, Outside-In TDD, and
Continuous Integration (CI).
On to a little housekeeping…

Conventions Used in This Book


The following typographical conventions are used in this book:
Italic
Indicates new terms, URLs, email addresses, filenames, and file extensions.
Constant width
Used for program listings, as well as within paragraphs to refer to program ele‐
ments such as variable or function names, databases, data types, environment
variables, statements, and keywords.
Constant width bold
Shows commands or other text that should be typed literally by the user.
Occasionally I will use the symbol:
[...]
to signify that some of the content has been skipped, to shorten long bits of output, or
to skip down to a relevant section.

This element signifies a tip or suggestion.

This element signifies a general note or aside.

xviii | Preface

WOW! eBook
www.wowebook.org
This element indicates a warning or caution.

Submitting Errata
Spotted a mistake or a typo? The sources for this book are available on GitHub, and
I’m always very happy to receive issues and pull requests: https://github.com/hjwp/
Book-TDD-Web-Dev-Python/.

Using Code Examples


Code examples are available at https://github.com/hjwp/book-example/; you’ll find
branches for each chapter there (e.g., https://github.com/hjwp/book-example/tree/chap
ter_unit_test_first_view). You’ll find a full list, and some suggestions on ways of work‐
ing with this repository, in Appendix J.
This book is here to help you get your job done. In general, if example code is offered
with this book, you may use it in your programs and documentation. You do not
need to contact us for permission unless you’re reproducing a significant portion of
the code. For example, writing a program that uses several chunks of code from this
book does not require permission. Selling or distributing a CD-ROM of examples
from O’Reilly books does require permission. Answering a question by citing this
book and quoting example code does not require permission. Incorporating a signifi‐
cant amount of example code from this book into your product’s documentation does
require permission.
We appreciate, but do not require, attribution. An attribution usually includes the
title, author, publisher, and ISBN. For example: “Test-Driven Development with
Python, 2nd edition, by Harry J.W. Percival (O’Reilly). Copyright 2017 Harry Percival,
978-1-491-95870-4.”
If you feel your use of code examples falls outside fair use or the permission given
above, feel free to contact us at [email protected].

O’Reilly Safari
Safari (formerly Safari Books Online) is a membership-based
training and reference platform for enterprise, government,
educators, and individuals.

Preface | xix

WOW! eBook
www.wowebook.org
Members have access to thousands of books, training videos, Learning Paths, interac‐
tive tutorials, and curated playlists from over 250 publishers, including O’Reilly
Media, Harvard Business Review, Prentice Hall Professional, Addison-Wesley Profes‐
sional, Microsoft Press, Sams, Que, Peachpit Press, Adobe, Focal Press, Cisco Press,
John Wiley & Sons, Syngress, Morgan Kaufmann, IBM Redbooks, Packt, Adobe
Press, FT Press, Apress, Manning, New Riders, McGraw-Hill, Jones & Bartlett, and
Course Technology, among others.
For more information, please visit http://oreilly.com/safari.

Contacting O’Reilly
If you’d like to get in touch with my beloved publisher with any questions about this
book, contact details follow:

O’Reilly Media, Inc.


1005 Gravenstein Highway North
Sebastopol, CA 95472
800-998-9938 (in the United States or Canada)
707-829-0515 (international or local)
707-829-0104 (fax)

We have a web page for this book, where we list errata, examples, and any additional
information. You can access this page at http://bit.ly/tdd_py_2e.
To comment or ask technical questions about this book, send email to bookques‐
[email protected].
For more information about books, courses, conferences, and news, see O’Reilly’s
website at http://www.oreilly.com.
Facebook: http://facebook.com/oreilly
Twitter: http://twitter.com/oreillymedia
YouTube: http://www.youtube.com/oreillymedia

xx | Preface

WOW! eBook
www.wowebook.org
Prerequisites and Assumptions

Here’s an outline of what I’m assuming about you and what you already know, as well
as what software you’ll need ready and installed on your computer.

Python 3 and Programming


I’ve tried to write this book with beginners in mind, but if you’re new to program‐
ming, I’m assuming that you’ve already learned the basics of Python. So if you haven’t
already, do run through a Python beginner’s tutorial or get an introductory book like
Dive Into Python or Learn Python the Hard Way, or, just for fun, Invent Your Own
Computer Games with Python, all of which are excellent introductions.
If you’re an experienced programmer but new to Python, you should get along just
fine. Python is joyously simple to understand.
I’m using Python 3 for this book. When I wrote the first edition in 2013–14, Python 3
had been around for several years, and the world was just about on the tipping point
at which it was the preferred choice. You should be able to follow this book on Mac,
Windows, or Linux. Detailed installation instructions for each OS follow.

This book was tested against Python 3.6. If you’re on an earlier ver‐
sion, you will find minor differences (the f-string syntax, for exam‐
ple), so you’re best off upgrading if you can.

I wouldn’t recommend trying to use Python 2, as the differences are more substantial.
You’ll still be able to carry across all the lessons you learn in this book if your next
project happens to be in Python 2. But spending time figuring out whether the reason
your program output looks different from mine is because of Python 2, or because
you made an actual mistake, won’t be time spent productively.

xxi

WOW! eBook
www.wowebook.org
If you are thinking of using PythonAnywhere (the PaaS startup I work for), rather
than a locally installed Python, you should go and take a quick look at Appendix A
before you get started.
In any case, I expect you to have access to Python, to know how to launch it from a
command line, and to know how to edit a Python file and run it. Again, have a look
at the three books I recommended previously if you’re in any doubt.

If you already have Python 2 installed, and you’re worried that


installing Python 3 will break it in some way, don’t! Python 3 and 2
can coexist peacefully on the same system, particularly if you’re
using a virtualenv, which we will be.

How HTML Works


I’m also assuming you have a basic grasp of how the web works—what HTML is,
what a POST request is, and so on. If you’re not sure about those, you’ll need to find a
basic HTML tutorial; there are a few at http://www.webplatform.org/. If you can figure
out how to create an HTML page on your PC and look at it in your browser, and
understand what a form is and how it might work, then you’re probably OK.

Django
The book uses the Django framework, which is (probably) the most well-established
web framework in the Python world. I’ve written the book assuming that the reader
has no prior knowledge of Django, but if you’re new to Python and new to web devel‐
opment and new to testing, you may occasionally find that there’s just one too many
topics and sets of concepts to try and take on board. If that’s the case, I recommend
taking a break from the book, and taking a look at a Django tutorial. DjangoGirls is
the best, most beginner-friendly tutorial I know of. The official tutorial is also excel‐
lent for more experienced programmers.
Read on for instructions on installing Django.

JavaScript
There’s a little bit of JavaScript in the second half of the book. If you don’t know Java‐
Script, don’t worry about it until then, and if you find yourself a little confused, I’ll
recommend a couple of guides at that point.

xxii | Prerequisites and Assumptions

WOW! eBook
www.wowebook.org
A Note on IDEs
If you’ve come from the world of Java or .NET, you may be keen to use an IDE for
your Python coding. They have all sorts of useful tools, including VCS integration,
and there are some excellent ones out there for Python. I used one myself when I was
starting out, and I found it very useful for my first couple of projects.
Can I suggest (and it’s only a suggestion) that you don’t use an IDE, at least for the
duration of this tutorial? IDEs are much less necessary in the Python world, and I’ve
written this whole book with the assumption that you’re just using a basic text editor
and a command line. Sometimes, that’s all you have—when you’re working on a
server, for example—so it’s always worth learning how to use the basic tools first and
understanding how they work. It’ll be something you always have, even if you decide
to go back to your IDE and all its helpful tools, after you’ve finished this book.

Required Software Installations


Aside from Python, you’ll need:
The Firefox web browser
Selenium can actually drive any of the major browsers, but Firefox is the best to
use as an example because it’s reliably cross-platform and, as a bonus, is less sold
out to corporate interests.
The Git version control system
This is available for any platform, at http://git-scm.com/. On Windows, this comes
with the Bash command line, which is needed for the book.
A virtualenv with Python 3, Django 1.11, and Selenium 3 in it
Python’s virtualenv and pip tools now come bundled with Python 3.4+ (they
didn’t always used to, so this is a big hooray). Detailed instructions for preparing
your virtualenv follow.
Geckodriver
This is the driver that will let us remotely control Firefox via Selenium. I’ll point
to a download link in “Installing Firefox and Geckodriver” on page xxvi.

Prerequisites and Assumptions | xxiii

WOW! eBook
www.wowebook.org
Windows Notes
Windows users can sometimes feel a little neglected in the open source world, since
macOS and Linux are so prevalent, making it easy to forget there’s a world outside the
Unix paradigm. Backslashes as directory separators? Drive letters? What? Still, it is
absolutely possible to follow along with this book on Windows. Here are a few tips:

1. When you install Git for Windows, make sure you choose “Run Git and
included Unix tools from the Windows command prompt”. You’ll then get
access to a program called “Git Bash”. Use this as your main command prompt
and you’ll get all the useful GNU command-line tools like ls, touch, and grep,
plus forward-slash directory separators.
2. Also in the Git installer, choose “Use Windows’ default console”; otherwise,
Python won’t work properly in the Git-Bash window.
3. When you install Python 3, unless you already have Python 2 and want to keep it
as your default, tick the option that says “Add Python 3.6 to PATH” as in
Figure P-1, so that you can easily run Python from the command line.

Figure P-1. Add Python to the system path from the installer

xxiv | Prerequisites and Assumptions

WOW! eBook
www.wowebook.org
The test for all this is that you should be able to go to a Git-
Bash command prompt and just run python or pip from any
folder.

MacOS Notes
MacOS is a bit more sane than Windows, although getting pip installed was still fairly
challenging up until recently. Since the arrival of 3.4, things are now quite
straightforward:

• Python 3.6 should install without a fuss from its downloadable installer. It will
automatically install pip, too.
• Git’s installer should also “just work”.

Similarly to Windows, the test for all this is that you should be able to open a terminal
and just run git, python3, or pip from anywhere. If you run into any trouble, the
search terms “system path” and “command not found” should provide good trouble‐
shooting resources.

You might also want to check out Homebrew. It used to be the


only reliable way of installing lots of Unixy tools (including
Python 3) on a Mac.1 Although the normal Python installer is
now fine, you may find Homebrew useful in future. It does
require you to download all 1.1 GB of Xcode, but that also
gives you a C compiler, which is a useful side effect.

Git’s Default Editor, and Other Basic Git Config


I’ll provide step-by-step instructions for Git, but it may be a good idea to get a bit of
configuration done now. For example, when you do your first commit, by default vi
will pop up, at which point you may have no idea what to do with it. Well, much as vi
has two modes, you then have two choices. One is to learn some minimal vi com‐
mands (press the i key to go into insert mode, type your text, press <Esc> to go back to

1 I wouldn’t recommend installing Firefox via Homebrew though: brew puts the Firefox binary in a strange
location, and it confuses Selenium. You can work around it, but it’s simpler to just install Firefox in the nor‐
mal way.

Prerequisites and Assumptions | xxv

WOW! eBook
www.wowebook.org
normal mode, then write the file and quit with :wq<Enter>). You’ll then have joined
the great fraternity of people who know this ancient, revered text editor.
Or you can point-blank refuse to be involved in such a ridiculous throwback to the
1970s, and configure Git to use an editor of your choice. Quit vi using <Esc> followed
by :q!, then change your Git default editor. See the Git documentation on basic Git
configuration.

Installing Firefox and Geckodriver


Firefox is available as a download for Windows and macOS from https://
www.mozilla.org/firefox/. On Linux, you probably already have it installed, but other‐
wise your package manager will have it.
Geckodriver is available from https://github.com/mozilla/geckodriver/releases. You
need to download and extract it and put it somewhere on your system path.

• For macOS or Linux, one convenient place to put it is ~/.local/bin


• For Windows, put it in your Python Scripts folder

To test that you’ve got this working, open up a Bash console and you should be able
to run:
geckodriver --version
geckodriver 0.17.0

The source code of this program is available at


https://github.com/mozilla/geckodriver.

This program is subject to the terms of the Mozilla Public License 2.0.
You can obtain a copy of the license at https://mozilla.org/MPL/2.0/.

If it doesn’t work, it may be that ~/.local/bin isn’t on your PATH (this would apply to
some Mac and Linux systems). It’s a good idea to have this folder on your path
because it’s where Python will install things when you use pip install --user.
Here’s how to add it in your .bashrc:2
echo 'PATH=~/.local/bin:$PATH' >> ~/.bashrc

Close your terminal and re-open it and see if the geckodriver --version works
now.

2 .bashrc is an initialization file for Bash that lives in your home folder. It gets run every time you start Bash.

xxvi | Prerequisites and Assumptions

WOW! eBook
www.wowebook.org
Setting Up Your Virtualenv
A Python virtualenv (short for virtual environment) is how you set up your environ‐
ment for different Python projects. It allows you to use different packages (e.g., differ‐
ent versions of Django, and even different versions of Python) in each project. And
because you’re not installing things system-wide, it means you don’t need root
permissions.
Virtualenv has been included in Python since version 3.4, but I always recommend a
helper tool called “virtualenvwrapper”. Let’s install that first (it doesn’t matter which
version of Python you install it for):
# on Windows
pip install virtualenvwrapper
# on macOS / Linux
pip install --user virtualenvwrapper
# then make Bash load virtualenvwrapper automatically
echo "source virtualenvwrapper.sh" >> ~/.bashrc
source ~/.bashrc

On Windows, virtualenvwrapper will only work inside the “Git-


Bash” shell, not from the normal command line.

virtualenvwrapper keeps all your virtualenvs in one place, and provides convenient
tools for activating and deactivating them.
Let’s create a virtualenv called “superlists”3 that has Python 3 installed:
# on macOS/Linux:
mkvirtualenv --python=python3.6 superlists
# on Windows
mkvirtualenv --python=`py -3.6 -c"import sys; print(sys.executable)"` superlists
# (a little hack to make sure we get a python 3.6 virtualenv)

Activating and Deactivating the Virtualenv


Whenever you work on the book, you’ll want to make sure your virtualenv is “active”.
You can usually tell because you’ll see (superlists) in parentheses, in your prompt.
Something like this:
$
(superlists) $

3 Why superlists, I hear you ask? No spoilers! You’ll find out in the next chapter.

Prerequisites and Assumptions | xxvii

WOW! eBook
www.wowebook.org
Exploring the Variety of Random
Documents with Different Content
Florița, cum privì la ea, așa privì, încât ochii amândoi și cel de-a
dreapta, și cel de-a stânga, îi săriră din cap și căzură la Florița în
poale.
Baba Boanța mulțumì lui Dumnezeu, cumcă nu e silită să facă un
păcat mare, luă ochii cei de căprioară și-i duse, ca să spuie
cârciumăriței, cumcă i-a scos dela Florița din cap.
Florița rămase singură și părăsită… Ce să facă? – pornì, încotro o
duseră ochii și norocul.
Multe zile și multe nopți a pribegit Florița, așa singură, prin
codru, fără s’audă graiu pământesc, fără să vadă ființă omenească.
Numai din când în când i se ivià câte o fiară sălbatică în cale și asta
rămâneà însă privind din depărtare, îi urmà o bucățică de cale și apoi
se ascundeà în tufele dese. Florița mergeà cântând mai departe…
Unde, – nici ea singură nu știà… Mergeà… mergeà…
Intr’atâtea ș’atâtea zi, tocmai în revărsatul zorilor, pe când se
desveleà ziua din noapte, văzù cum că vede ceva, – așa ca ș’o casă,
zărindu-se printre frunzele copacilor. – Inaintea casei lucră un om
ghebos ceva, – nu știu ce – aplecat la pământ, dar lucrà, încât nici
cu trăsnetul n’ai fi putut să-l trezești dela lucru… Dar cum lucrà? –
nu ca altă lume – Toate le făceà întoarse și sucite, ca și omul adecă,
care nu pricepe lucrul, de care s’a prins. El lucrà la un puiu… Mai
înainte îl ciupelì și numai după aceea îl opărì cu apă feartă – mai
înainte îl drese și numai după aceea îl ciupelì și opărì…
Când Florița văzù, cât de necioplit mi se mișcà ghebosul, ea nu
se putù răbdà – ca să nu meargă să-l învețe și să-i ajute…
«Bun lucru, bădiță!» grăì Florița blând ca totdeauna.
Ghebosul privì îndărăt, când auzì, așa ca prin vis, vorba cea dulce
a Floriței, și când privì și văzù ce vede… poate acuma fiecare să știe,
ce trebue să fie atunci, când un ghebos privește în fața Floriței! –
Ghebosul scăpă și cuțitul, și puiul, și toate le scăpă din mână, – și
stà înaintea Floriței, încât i se păreà c’acuma nici nu e ghebos mai
mult… Dar nici Florița nu stà la flori și frunze! Ghebosul erà atât de
hîd, cât Florița de frumoasă: cu gura ca grapa, cu ochii ca ceapa, cu
nasul cârlig, cu părul pârlit…
«Ce ai de gând cu puiul?» – întrebă Florița – după ce-i mai trecù
amețeala.
«Am să-l frig pentru tovarăși» – răspunse ghebosul cam cu
jumătate de gură, ca omul, din care scoți vorba cu frică.
«Ce tovarăși? – îl întrebă Florica.
Ghebosul privi lung la Florica, ca un om care ar vreà să zică ceva
și nu știe, cum s’o scoață mai nimerit. «Vezi casa asta? – zise el dela
o vreme, mai cu inimă. – Asta e casa celor doisprezece hoți de
codru. Ei s’au dus la hoțit, și eu am rămas ca să le fac demâncat».
Așa e, doisprezece hoți, – hoți de codru și grozavi, cu căpitanul
lor cel înfricoșat au locuit în astă casă… Și știe toată lumea, cum că
hoții de codru se spală în toată dimineața cu sânge de copil
nebotezat, și sânge de fete mari, iar în față de om nu pot să
privească pentrucă simțesc junghi în spete, și’n cap și pe toate
laturile… Nu e minune dar, dacă Florița a cam tresărit, când a auzit
vorbe atât de mari:… Hei! dar Florița nu s’a înfricoșat – zău! nu s’a
înfricoșat, ci cu vorbă veselă și râs pe buze a zis către Ghebos:
«Un puiu pentru doisprezece hoți? Nici pe-o măsea n’are să le
ajungă».
«Vezi bine, că doară nu am eu atâta pricepere, răspunse
ghebosul făcându-se și el înțelept. Eri le-am fript un juncan, și ei
m’au bătut pentru c’a fost prea mult: astăzi știu că nu m’or bate».
«Iar azi te-or bate, pentrucă le-ai fript prea puțin… Aide ca să te
învăț eu ce, cum și cât să faci – zise Florița sărind sprintenă, cum erà
ea, peste pragul casei.
Acuma tăie patru pui și-i fierse, tăie doi purcei și-i fripse, făcù o
zămuță bună și caldă, și arătă ghebosului, cum are să facă de aici
înainte. «Eacă așa, dragul meu, și așa… și așa,» – îl învățà adecă
precum învață o maică bună și îngrijitoare.
Ca nu cumva să se întâmple ceva cu hoții, ghebosul spuse
Floriței, cumcă să-i spuie lui pe când are să fie gata cu mâncările, să
fugă cât o duc picioarele ca să nu cază în mânile hoților, – căci el
numai atunci va cântà din fluerașul cel mic, care chiamă pre hoți la
prânz.
Florița găti mâncarea, puse vasele pe masă, mai curățì, mai
netezì, făcù casa, încât numai de-un drag să șezi în ea, apoi se puse
la vorbă cu ghebosul, și vorbiră… vorbiră până ce uitară de hoți, de
flueriță, de toate.
In adâncul codrului hoții începură să flămânzească, să se supere
și, care de care mai cu greu gând la inimă, să pornească către casă…
Hei! ghebosule, ghebosule – mare necaz ți-ai făcut!
«Ce se simte aici?» întrebă Florița simțind ceva, ca și când ar fi
sânge, sau așa ceva…
«Vai! sărmanul de mine! strigă ghebosul înspăimântat, – vin
hoții! Fugi! – Ba nu fugì, căci n’ai vreme de fugă… Ascunde-te sub
pat.
Florița, – de frică ce să facă? – se ascunse sub pat. Iar cei
doisprezece hoți de codru veneau tot unul după altul, și încă din
depărtare s’auzeà, cum ziceau, că au să-l ucidă, să-l turtească, să-l
taie bucățele pre ghebosul… Cum nu? – când ei răbdau la foame…
ei… hoți ca dânșii!
Ghebosul le eșì în cale, ca să-i roage de ertare și să le spună,
cumcă le-a făcut mâncări bune.
«Să taci de loc – grăì căpitanul. – Nu-mi priește mâncarea până
ce nu mă spăl cu sângele tău, – după aceea intră în casă pentru ca
s’aducă cuțitul cel mare; iară ceilalți prinseră pe ghebos și-l făcură
nod.
Când căpitanul intră pe prag, el rămase stând uimit în loc: i se
părea că astă casă netedă și curată nu e a lui. «Măi oameni! grăì
către cei de afară, veniți încoace!»
«Ce-e?» întrebară cei deafară.
«Veniți, când zic!»
Când hoții pășiră pe prag, ei priviră încă mai uimiți decât
căpitanul la casa lor… Așà privind, le trecù de mânie, și iarăș le venì
foamea; se așezară unul după altul la masă.
Ghebosul, ca și omul care erà s’o pățească, se făcù sprinten, fugì
la vatră și intră cu mâncările în casă.
«Când căpitanul simțì mirosul aburilor din zeamă, «Măi! grăì către
ghebos, pentrucă mi-ai curățit casa, te lăsăm până după prânz»,
după aceea luă lingura, gustă din zeamă și o purtă prin gură.
«Ce mâncare e asta?» întreabă dupà aceea.
«Zeamă, cu cinste să fie zis, zeamă călduță, – răspunse
ghebosul.
«Bună mâncare! – grăì căpitanul… Luă după aceea lingura, dete
la fiecare hoț câte trei linguri și ce rămase își ținù sie.
Hoții își mâncară părticica și după aceea priviră, lingându-se pe
buze, la părticica căpitanului.
Ghebosul intră cu carnea cea de puiu.
«Ce-e aceasta? întrebă căpitanul.
«Puiu, puiu fript», răspunse ghebosul.
Căpitanul își tăie o bucățică, gustă și apoi grăì către ghebos:
«Măi! asta s’o fi adus tu mai înainte! – Pentrucă ne-ai făcut atât
de bune mâncări, noi cu toții te iertăm!» – După aceea luă cuțitul,
tăie la fiecare hoț câte o bucățică și ce rămase își ținù sie.
Hoții își mâncară bucățelele, după aceea începură să privească la
bucățile căpitanului lingându-se pe degete… Iară căpitanul dela o
vreme începù să resufle cu greu și să mănânce cu țârîita, numai de
ici de colea câte o bucățică, câte un fir, ca și omul, care ar mâncà și
nu poate mâncà de sătul ce e săracul.
«Frate căpitane – grăì unul dintre hoții cei flămănzi, – tu te-ai
săturat: dă-ne nouă, ce a rămas!»
«Ce? îi zise căpitanul, sau n’ați avut și voi: asta o țin pentru mine
– pentru ca s’o mănânc desară».
«Să nu fie supărare, grăì ghebosul, mai sunt încă și alte
mâncări».
«Auziți voi? zise căpitanul, celelalte sunt ale voastre».
«Ba nu! grăiră hoții, noi vrem să mâncăm din asta, căci asta e
bună!…
Vorbă din vorbă: hoții începură a se certà… Unii că asta, alții că
ceea; treaba stà rău, și dacă ghebosul n’ar fi intrat cu purceii cei
fripți în casă, zău nu cred că nu s’ar fi întâmplat un lucru nesfârșit.
Când însă mirosul fripturei le intră în nas, îndată se stâmpărară.
«Ce e aceea?» întreabă căpitanul.
«Purcel, purceluș fript!» răspunse ghebosul. Căpitanul gustă…
Așa ceva până acuma nici în vis n’a gustat.
«Măi prostule! – grăì către ghebos, acuma trebue să-l aduci tu pe
acesta? Să mi-l pui mie pe sară» – și dete puii la ceilalți hoți.
«Să ne dai purcel! grăiră hoții, ai zis că ce vine e al nostru».
«Ce? – sau n’ați zis voi, că puii să vi-i dau? zise căpitanul
mâniindu-se urât.
O vorbă nu zic mai mult!… Hm! aceea nu e glumă, când căpitanul
zice așa vorbe către tovarășii săi flămânzi… Poate acuma fiecare să
știe ce e aceea, când unsprezece hoți se bat cu căpitanul lor…
Sărmana de Floriță! dacă ar fi știut ea, cum că asta are să fie din
mâncările cele bune… Sburau, Doamne, săbiile, cuțitele și fel de fel
de lucruri, și se băteau hoții precum se bat nourii în capete și se
prăpădesc… Așa lucru n’a fost încă de când e lumea!
Și Florița?… Bun e sufletul bun! Doamne bun e!… bun ca și darul
și mâna lui Dumnezeu! Când hoții se băteau, sfărmau și prăpădeau
mai a perire, Florița nu se mai putù răbdà, ci eșì de sub pat și se
puse tocmai în mijlocul lor, și cum s’a pus, a stat acolo între ei, între
hoții cei înfricoșați, bătăuși și hoți de codru.
Ce-a fost după aceea, cum s’a făcut, cum s’a sfârșit; aceea e
acuma treaba lor… Oare Doamne… când vede cineva pe Florița, s’ar
mai puteà bate și supărà, iar mai puteà venì gând rău și
neîmpăcat?… Hoții steteră toți încremeniți și amuțiră, și scăpară
săbiile, cuțitele și fel de fel de lucruri ce aveau în mână: li se păreà
cum că a venit pedeapsa lui Dumnezeu asupra capetelor lor, ca să-i
tragă la socoteală pentru păcatele lor cele multe în răutatea lor cea
mare și înfricoșată și hoțească… Eară Florița le grăì în graiul ei cel
blând: «Nu vă supărați, bădișorilor, că, dacă doriți, iarăși vă fac
mâncările încă mai bune și mai călduțe decât cum au fost cele de
astăzi».
Hoților li se păreà, că cerul s’a dărâmat asupra lor și munții și
codrii, când auziră vorba Floriței.

De aici înainte Florița rămase la casa hoților; îi îngrijì, îi curățì, le


făcù mâncări bune, îi ținù la povești frumoase și la vorbe blânde; iar
hoții nu se mai mișcară de-acasă. Le părea, că de aici înainte nici
n’au ce să cerce în lume… Așa merse asta până ce li se sfârșiră
mâncările: ajunseră că abea mai aveau bucate pentru trei zile și trei
nopți. Apoi nici unul nu voea să se urnească de acasă pentru ca să
câștige; fiecare voià să taie lemne, să facă foc, să spele, să măture,
să văruească, să îngrijească grădina cea cu flori, să facă adecă după
placul și dorința Floriței.
Într’o zi Florița merse în grădina cea cu flori, ca să vadă cum și
ce, și află, că un porc sălbatec a făcut mare zgudulire printre straturi
și, aflând, tare și mult s’a întristat. Hoții, cum auziră, toți cu toții
săriră la puștile cele ruginite și merseră și goniră și nu se opriră până
ce nu-l împușcară pe porcul cel sălbatec. Când căpitanul, care erà cel
mai sprinten dintre toți, veneà cu el în spate, așa pășeà de fălos, așa
priveà de mândru, în cât erai să crezi c’a stat de vorbă cu Sf. Petru…
De aici înainte fiecare hoț voea să fie cel mai harnic, mai de treabă și
mai voinic. Ghebosul, cel mai înțelept dintre dânșii, îi împărți în
două: șase inși trebueau să meargă în toată ziua la câștig, iar alți
șase aveau să rămână acasă, pentru ca să lucreze după porunca
ghebosului și dorința Floriței.
Cei mai isteți dintre hoți se duseră în cetatea împăratului și
cumpărară cu mulți bani fel de fel de lucruri frumoase și le aduseră,
ca să le pună la căpătâiul Floriței așa, ca nimeni să nu știe cine le-a
pus… Și apoi li se nebuneau mințile, când vedeau, cum că Floriței îi
sare inima de bucurie, când dimineața își aflà cărpele cele frumoase
la căpătâiul patului.
Așa curgeà traiul hoților de când ei au dat de Florița, și așa traiul
Floriței, de când ea a dat de hoți. Iți râde inima, când îți aduci
aminte!
Hei! dar lumea e rea! Bag samă nici Dumnezeu nu vreà, ca în
lume să fie numai bine!…
Crâșmărița după multă vreme iarăși privì în căutătoare, iarăși
întrebă, căutătoarea iarăși îi răspunse și iarăși făcù vorbă cu baba
Boanța… Ce-ți e muierea vicleană! nici în fundul lumei nu-ți lasă
pace și traiu bun…
Baba Boanța își făcù trebile, află cum și ce e cu Florița și unde se
află ea, pornì apoi în cale către codrul cel vestit… Când ea erà
s’ajungă la casa hoților, află că vede niște oameni vorbind: erau cei
șase hoți ce stau cu ghebosul la sfat. Ea luă șapte frunze verzi de pe
creanga unui stejar, grăì asupra lor câteva cuvinte ce sunau a vrajă,
suflă apoi de trei ori asupra lor. Baba n’a suflat bine, până ce
frunzele se veștejiră și hoții adormiră toți șepte unul după altul.
Acuma baba Boanța intră la Florița în casă, spuse cum că-i aduce
«sănătate și voe bună» de la maica sa cea bună; îi dete apoi un inel
de aur, frumos și rotund.
Florița – dar de unde să poată gândì rău prin capul ei! – ea trase
inelul pe degetul cel mijlociu, și nici nu-l trase cum se trage, până ce
și căzù la pământ.
După ce Boanța își făcù treaba, ea își luă cârja de după cuptor și
o șterse din cale. Nu-i veneà la socoteală ca să steà încă mult fiindcă
știà, cum că multă vreme n’are să treacă până ce hoții se vor trezì
din somn. Și hoții cei din codru, zău! nici pentru o Boanță nu sunt
lucru de glumă.
Când hoții intrară în casă, și când ceilalți sosiră: știe acuma
fiecare ce e aceea, când doisprezece hoți de codru plâng din ruptul
sufletului, în cât pietrele se mișcă… numai Florița nu se mișcà, căci
ea erà moartă, moartă… ca și moartă. În durerea lor cea mare
n’avură în cotro: hotărâră să îmbrace frumos pe Florița, să-i facă un
mormânt, și… vai ș’amar când vine până într’atâta! Cum steteau ei
însă așa lângă mort, văzură ceva ce încă n’au văzut: inelul Boanței…
Cât ce traseră inelut de pe deget, Florița își deschise ochii și se făcù
mai vie decât ce a fost cândva.
In bucuria lor cea mare hoții merseră în cealaltă zi în satul
împăratului și cumpărară toate inelele și tot aurul ce se află în târg
și-l deteră Floriței, pentru ca să nu mai primească dela alții. – Și apoi
grijeau, Doamne! – cum pot numai hoții să grijească, pe Floriță,
când se tem că o vor perde.
Peste șapte luni, șapte săptămâni și șapte zile crâșmărița earăși
privì în căutătoare, earăși auzì vorbele supărătoare, iarăș chemă la
sine pe baba Boanța și iarăș trimise primejdia asupra Floriței.
Boanța făcù ca și în celălalt rând, și după ce adormiră hoții iarăși
intră la Florița, îi zise sănătate și voie bună și îi dete o rochie de
mătase, grăind: «Eaca, ți-a trimis-o maica-ta cea bună, ca să te
împodobești cu ea».
Florița de bucurie, că a primit veste de-a casă, îmbracă rochia ca
să vădă cum îi șede. Nici nu trebue să spun, că astă dată Florița
căzù mai moartă. Boanța fugì mai iute, durerea hoților fù mai mare
și învierea mai puternică și mai îmbucurătoare – decât înainte de
asta cu atâtea săptămâni.
Acuma hoții cumpărară toate mătăsurile și frumusețele ce se
aflau la neguțătorii cei mari și împărătești; iar îngrijirea lor se făcù pe
de șapte ori câte de șapte mai mare decât ce a fost cândva.
Peste nouă luni, nouă săptămâni și nouă zile crâșmărița, acuma
de a treia oară, adecă de a doua oară de a treia oară, iarăși se fălì
către căutătoare cu frumuseța sa.
«Ești frumoasă, îi răspunse căutătoarea, – dar Florița e mai
frumoasă, de o sută și o mie de ori mai frumoasă decât ce-a fost ea
însuși când-va, – și trăește ca o împărăteasă».
După aceste vorbe crâșmărița n’a mai chemat pe Boanța la sine,
ci și-a legat catrința și ea însăși s’a dus la coliba babei.
Ce-au vorbit, – ce n’au vorbit, – ce sfaturi au făcut: aceea nu se
poate spune… Bune gânduri cu de-a bună samă nu le-a trecut prin
minte… Vai și amar de acela ce dă de rău cu muerile!
Boanța se suflecă, acuma chiar de a treia oară, și acea nu e
glumă, când o vrăjitoare ca și Boanța se suflecă, cum înainte de asta
nu s’a suflecat încă… De astă dată nici nu pornì pe picioare, ci în
miez de noapte călărind pe o prăjină strâmbă… Mare primejdie
trebue să fi fost în gândul ei, că s’a opintit atât de băbește!
De când Florița murise în două rânduri, hoții nu mai dormeau nici
ziua, nici noaptea, ci stau la pază, cum stai când de mare necaz și
primejdie te temi. Pentru ca nu cumva să-i cuprinză somnul, unul
dintre ei totdeauna trebuià să se culce pe un pat de spini, iară subt
pat erà jăratec viu și înfocat… Boanța văzù că acuma cu una cu două
n’are s’o isprăvească; ea făcù dar lucruri, vrăjitorii și fel de fel de
taine, încât mintea curată nici nu le poate gândì… Pentru ca să
adoarmă pe hoți, ea acuma nu făcù vraja cea mai mică, cu frunzele
de ștejar, ci vraja cea mai mare și ne mai pomenită, încât ți se ridică
perii în vârful capului, când gândești la ea. Luă un ac subțirel și mic,
dar mic și subțirel, încât nici cu vârful limbei nu puteai să-l simțești,
dar încă să-l vezi cu ochii, împunse doisprezece ștejari cu acest ac,
grăi o mulțime de zicăli încălcite, se’ntoarse de trei ori peste cap, – și
hoții, toți doisprezece, împreună cu ghebosul, – chiar și acela de pe
spini și jăratic, adormiră ca morți.
Când Boanța intră, acuma de a treia oară, în casă la Florița, ea
nu zise numai «sănătate și voie bună», ci alte vorbe care de care
mai frumoase și mai dulci, cum vorbesc adecă babele când voiesc
să-ți strice firea… eară Floriței îi săreà inima de bucurie, când auzeà
atâta veste bună și frumoasă dela «ai săi».
«Să te împodobesc, ca pe o împărăteasă, mi-a poruncit maică-ta
cea bună – grăi Boanța într’un târziu. – Să-ți pepten eu părul și să ți-
l…
De unde ar puteà Florița să nu facă precum a dorit maică-sa cea
dulce?… Ea lăsă ca Boanța să o pieptene, – și Boanța o pieptănă, –
atâta de frumos o pieptănă, atât de frumos îi împleti părul, încât i se
încurcau ochii, când priveà la ea și nu știà pe unde o vede mai
frumoasă… Dar Boanța nici nu fuse gata cu pieptănatul până ce
Florița și căzù moartă, mai moartă decât ce a fost cândva în viața
ei… Boanța i-a fost împletită firul morții în păr.
După ce Boanța își făcù păcatul, ea se suì pe prăjina cea strâmbă
și se depărtă mai răpede decât vântoasele.
Când hoții aflară cum că iarăși nu e bine, ei deteră a fugì care
încotro, a se opintì din ruptul sufletului ca doară cumva să învie pe
Florița și de a treia oară. Îi traseră inelele de pe degete, îi
dezbrăcară rochia, îi luară banii de pe piept: dar Florica rămase
moartă, – și hoții, cei doisprezece hoți grozavi din fundul codrului,
încet, încet, unul după altul, începură să plângă, – nu cum plâng
copii, ci cum plânge omul, când vede că acuma toate s’au sfârșit, că
de aci înnainte nu mai are ce să facă.
Când Florița fu cu totul dezbrăcată, hoții încetară a plânge și
rămaseră cu toții încremeniți; li se oprì suflarea și-i părăsì sufletul.
«S’o despletim!» grăì ghebosul.
«Să ferească Dumnezeu! răspunse căpitanul așà de frumos
numai ea știe împletì, cu degetele ei cele mărunțele».
«Da, da! – zisere ceilalți hoți. – Dacă a venit acuma până
într’atâta, să fie măcar și moartă precum a fost mai frumoasă’n
viață».
De aci înainte hoții multă vorbă nu făcură; nici n’aveau ce să-și
mai zică: îmbrăcară pe Florița în cele mai frumoase giulgiuri, îi puse
fiecare câte un crinișor pe frunte, aleseră cel mai frumos copac din
codru, făcură un coșciug, cum ei îl știau a face mai frumos, așezară
pe Florița în coșciug – și-i aprinseră la cap o lumină de ceară curată,
topită tocmai din fagurele, în care a fost să fie matca albinilor… După
ce le gătiră astea, căutară cea mai înaltă poiană din codru și unde
erau cele mai multe flori, făcură un mormânt de trei ori mai adânc
decât ce erà de lat și de trei ori mai lat decât erà de lung… și apoi…
sărută fiecare pe Florica în mijlocul frunții, – și o luară, – și o
duseră…
«Ho! stați! – grăì ghebosul, când văzù că hoții voesc să arunce
pământ asupra Floriței. Pământ pe trupul ei? Nu vă temeți de mănia
lui Dumnezeu?»
Hoții toți, unul după altul, lăsară pământul din mână; le venea să
intre în pământ de rușinea păcatului ce erau să facă.
Când erau să pornească către casă, nici unul nu putea să facă
începutul: erau legați de pământ, și simțeau că acasă nu au ce să
mai caute… Se așezară dar jur împrejur pe lângă mormântul Floriței
și priviră… priviră, până ce privind muriră toți doisprezece, unul după
altul. Doisprezece hoți au murit, și ghebosul împreună cu dânșii…
Sărmanii de ei! mai c’au fost oameni de treabă… Bag sama așa a
fost să fie.

Multă, foarte multă vreme a stat Florița așezată în mormânt; pe


lângă mormânt peste pământul ce sta în jurul gropii au fost crescut
tot flori din flori, care de care mai frumoase și ne mai pomenite, și
florile nu cresc ca și bureții peste noapte… După multă vreme dară
feciorul împăratului a venit cu mulți oameni și cu mare treabă, ca să
vâneze prin codru… De odată auziră, cum fac cânii mare larmă și
multă lătrătură. Feciorul împăratului trimise pe câțiva argați dintre
cei mai tari la inimă, ca să vază ce e, cum și pentru ce.
Argații veniră și spuseră, că s’au adunat cânii într’o poeană înaltă
și luminoasă, și, suindu-se pe un dâmb cu flori, toți cu toții, cu mic
cu mare, au început – nu să latre, ci să urle, cum urlă cânele, când
vede bufnița strigând pe hornul casei, ori când arde casa stăpânului
său, – să urle adecă a primejdie.
Feciorul cel de împărat – fecior de împărat adecă, care nu se
mulțumește cu una cu două – poruncì argaților să-l aștepte și se
duse ca să vază el cu ochii și s’audă cu urechile lui de treaba cânilor.
Când simțiră cânii apropierea stăpânului lor, ei încetară a da
semn de primejdie și deteră ași mișcà cozile. Hei! dar din loc nu se
mișcară până ce nu pășì feciorul cel de împărat în florile cele
frumoase… Fecior de împărat, fecior de împărat… doisprezece
oameni impietriți nu sunt glumă: zău și chiar un fecior de împărat
trebue să tresară, când îi vede printre flori – și apoi când privi în
mormânt?… Feciorului de împărat îi părù cum că chiar și al lui suflet
a impietrit, când văzù pe floarea codrilor… El a văzut multe fete de
împărat: Florița e însă Florița… Când văzù dar că Florița e moartă, el
se întristă, după aceea se supără, și mai la urmă atâta de grozav se
amărî încât îi venea ca să ia lumea în ghiare și așa să dee cu ea de
pământ, încât toată să se sfarme, ca nici semânța să nu rămână de
ea!…
Ei! dar feciorii cei de împărat sunt scurți la vorbă. «Dacă n’am
văzut-o vie, s’o văd cel puțin moartă,» își zise el, și apoi merse la
argați, le poruncì ca să pornească către casă. Numai doi oameni
credincioși ținù la sine, și când se făcù noapte, cu acești doi
împreună scoaseră pe Florița din mormânt, și o duseră prin ascuns la
curtea împăratului… După ce Florița fu bine pusă, ca nimeni să nu
afle de ea, feciorul împăratului poruncì argaților să tacă despre cele
ce au făcut și văzut și n’au mai văzut, și-și făcù treaba mai departe.
El alese cele mai frumoase douăsprezece case ce se aflau în curtea
împăratului, așeză pe Floarea codrilor în cea mai frumoasă dintre
ele, poruncì ca douăsprezece fete, cele mai sprintene, să grijească
pe Florița zi și noapte, să o așeze într’un leagăn de aur și să o
legene ca și când ar fi vie. Fața Floriței și acuma erà rumenă;
crinișorii de pe fruntea ei nici acuma n’au veștejit, și părul ei și
acuma tot atât de frumos erà pieptănat și împletit: feciorul cel de
împărat dete poruncă aspră, ca nimeni să nu atingă fața, crinișorii și
părul… De aici înainte făt-frumosul împărătesc de dimineață până
sara și de sara până dimineața nu se mișcă de la leagănul Floriței:
priveà – priveà în fața cea frumoasă până ce adormea privind și cu
ochii deschiși.
Cele douăsprezece fete ce aveau să grijească pe Florița nu mai
încetau ași sparge capul asupra poruncii aspre ce li s’a dat. «Oare
pentru ce să nu atingem crinișorii și pentru ce să nu-i despletim
părul? și dacă am face, ce s’ar face? cum ar fi?» se întrebau ele în
gândul lor. Așa e muierea! n’are odihnă până ce nu află, ce ar dorì să
știe.
«Știți voi ce? grăì cea mai șireată dintre ele. Feciorul împăratului
doarme: aide s’atingem și să despletim; până când el se trezește, noi
iarăși facem precum a fost.»
La astfel de lucruri multă vorbă nu fac muierile: ele începură să
despletească pe Florița, și cum o despletiră, îi scoaseră firul morții
din păr; eară Florița, Floarea codrilor, se făcù mai vie, mai frumoasă
și mai sprintenă decât ce a fost cândva în viața ei. Când fetele
văzură morții râzând, ele, înspăimântate, și învrăjbite, fugiră care
încontro, din larma ce făcură se trezì și feciorul cel de împărat.
Acuma poate fie care să știe, ce e aceea când feciorul cel de împărat
vede pe Floarea codrilor chiar vie, privește în ochii ei cei blânzi și
aude vorba ei cea dulce. Infricoșat și grozav și ne mai pomenit de
frumos lucru trebue să fie așa ceva.
Feciorul împăratului nici trei vorbe n’a grăit până ce a și mers
vestea în curte, cum că «eacă așa și așa», că s’a întâmplat adecă ce
s’a întâmplat cu minune și cu taină nepricepută, și când a venit
împăratul cel bătrân ca să vadă ce e, cum și pentru ce, el atât de
tare s’a speriat, încât îi înegriră perii capului și înjuni cu șeptezeci și
șepte de ani!
După ce oamenii se desmeticiră, Florița stete de vorbă cu ei, și le
spuse cum și ce, de unde și până unde, eaca încoace și încolo, adecă
toată întâmplarea și patimile ei. Impăratul cel bătrân asculta, precum
asculți la copilași, când încep ca să vorbească, asculta adecă, încât îi
stà resuflarea în loc, și precum ascultà, el tare și foarte mult se
supărà, când auzea câte toate despre suferințele sărmanei de
Florița; eară când asta încetă cu vorba, el grăì către ea cu vorba lui
cea blândă și împărătească:
«Fătul meu, – draga mea! bunul Dumnezeu a voit ca să vii tu la
casa mea, să îmi fii mie noră și nevastă feciorului meu.»
Florița nu zise nimic, ci privì numai așa cu coada ochiului la cel
voinic frumos fecior pe împărat… eară feciorului i se făcură vorbele
nod și crimpiță tocmai pe vărful limbii.
Până ce zici «una, două, trei» vestea despre cununia feciorului de
împărat ajunse până în cele patru colțuri ale lumii. Până și orbii și
șchiopii porniră în cale, ca să vină, să vadă și să nu mai uite cât vor
traì. Crișmărița cea frumoasă, nici ea nu putea să rămână acasă: se
găti dar cum numai ea știea, și când fuse gătită, earăși întrebă de
căutătoare, acuma de a șeptea oară, – de-a șeptea oară, asta nu e
glumă!
Frumoasă zău! răspunse căutătoarea, – dar Florița e mireasă de
împărat!
Când crîșmărița auzì aceste vorbe, ea poruncì, ca să lase tot vinul
să curgă, să spargă toate vasele, și pornì către fiica sa cea dragă și
ginere-său cel împărătesc.
Se făcù apoi o nuntă, o cununie și un ospăț decât care mai vestit
și mai minunat de când e lumea n’a fost: chiar și copiii cei de țigan
mâncau cu linguri de aur, iar după ce-au mâncat și le duceau cu
sineacasă, ca să le aibă și să țină minte.
După nuntă împăratul poruncì, ca să se facă o casă cu păreții de
oglindă, să se adune cele mai frumoase neveste din țară, și să
închidă pe crișmărița cea vicleană cu ele, pentru-ca să vază și
văzând să se surpe în gândul ei, cumcă nu-i ea cea mai frumoasă în
țară3).
Iar Florița și feciorul cel de împărat trăiră fericiți și fără supărare,
cum trăesc oamenii buni la suflet și înțelepți la minte, încât vestea
depre ei ajunse chiar și până la noi…
ILEANA CEA ȘIREATA

POVESTE
fost ce a fost; dacă n’ar fi fost, nici nu s’ar povestì.
A fost odinioară un împărat, care avea trei fete, dintre
care cea mai mare erà frumoasă, cea mijlocie mai
frumoasă, iar cea mai tânără, Ileana, atâta de frumoasă, încât și
sântul soare se opria în cale, ca s’o vadă și să se desfăteze de
frumuseța ei.
Într’o zi împăratul primì carte și veste dela vecinul său, împărat
mare și puternic, – cumcă – eacă – nu-e bine, și are să se bată cu
dânsul pentru o mare pricină împărătească. Împăratul se puse la sfat
cu bătrânii țării, și, când văzură cumcă nu-e în cotro, poruncì
voinicilor să încalece pe armăsari, să-și apuce armele și să se
pregătească de bătaia cea grozavă ce-avea să se facă și să fie.
Înainte de a încăleca și el însuși, împăratul chemă pe fiicele sale
la sine, le grăì vorbe blânde și părintești și dete apoi la fiecare câte o
floare frumoasă, câte o păsărică veselă și câte un măr fraged. «A
cărei floare se va veștejì, a cărei păsărică se va întristà și a cărei măr
va putrezì despre acea voi ști, că nu ș’a păzit credința», grăì
împăratul cel înțelept, încălecă apoi pe cal, zise «sănătate bună» și
pornì cu voinicii săi în calea cea mare.
Când cei trei feciori ai împăratului vecin primiră veste, că
împăratul a pornit în cale și că el s’a depărtat de a casă, ei se
înțeleseră între sine și încălecară, ca să meargă la cetatea cea cu trei
fete de împărat, să răpească credința fetelor și să-i facă împăratului
supărare. Cel mai bătrân dintre feciori, voinic și viteaz, și frumos,
merse înnainte, ca să vază ce-e și cum, – și apoi să aducă veste și să
spuie.
Trei zile și trei nopți a stat voinicul pe sub ziduri fără ca vre una
din fete să se fi arătat la fereastră. În crepetul zorilor de a patra zi el
perdù răbdarea, își întărì pe inimă și bătù la fereasta celei mai mari
dintre fetele de împărat.
«Ce-e? – cine-e? – și ce vrea? – întrebă fata trezită din somnul
cel mai dulce.
«Eu sunt, surioară! – grăi feciorul de împărat, – voinic împărătesc
ce stau de trei zile cu dragoste la tine la fereastă».
Fata cea de împărat nici nu se apropie de fereastră, ci grăì cu
glas înțelept.
«Mergi pe calea, pe care ai venit: flori să-ți crească în cale, și
spini să-ți rămână pe urmă».
Peste trei zile și trei nopți feciorul de împărat earăși bătu la
fereastră. Acuma fata de împărat se apropie de fereastră și grăì cu
glas blând.
«Ți-am zis să mergi pe calea, pe care ai venit: spini să-ți crească
’n cale, și flori să-ți rămână pe urmă».
Încă trei zile și trei nopți stete feciorul de împărat la fereastra
fetei. In crepetul zorilor de-a zecea zi, adecă după ce au trecut de
trei ori câte trei zile și de trei ori câte trei nopți, el își netezì părul și
bătù, acuma d’a treia oară, la fereastră.
«Ce e? – cine e? și ce voiește? întrebă fata de împărat – acuma
mai răstit decât în celelalte rânduri.
«Eu sunt surioară! – grăì feciorul de împărat. De trei ori câte trei
zile stau cu dor la tine la fereastră: vreau să-ți văd fața, să-ți privesc
în ochi și să aud cum curg vorbele de pe buzele tale».
Fata de împărat deschise fereastra, privì cu supărare la voinicul
cel frumos, apoi grăì cu glas neauzit:
«Eu ți-ași privì în față și ți-așì grăì o vorbă: mergi însă mai ’nainte
la sora mea cea mijlocie – și numai după aceea vină la mine».
«Am să trimit pe frate-meu cel mijlociu, grăì feciorul de împărat.
Să-mi dai însă o sărutare, pentru ca să-mi fie calea mai ușoară». Și
nici n’a zis bine până-ce și fură un sărutat dela fata cea frumoasă.
«Să n’ai parte de altul! – zise fata de împărat ștergându-se pe
buze cu mâneca cea țesută cu altițe… Mergi pe calea, pe care ai
venit: flori să-ți crească în cale și flori să-ți rămână pe urmă».
Feciorul de împărat merse la frații săi, le spuse – cum și ce, – și
cel mijlociu pornì în cale.
După-ce feciorul cel mijlociu stete de nouă ori câte nouă zile și de
nouă ori câte nouă nopți la fereastra fetei celei mijlocii și bătù de a
treia oară la fereastra ei, ea deschise fereastra și îi grăì cu glas
drăgostos:
«Eu ți-aș privì în față și ți-ași grăì o vorbă: să mergi însă la sora
mea cea mai tânără, și numai după aceea vino la mine».
«Am să trimit pe frate-meu cel mai tânăr, grăì feciorul de
împărat. Să-mi dai o sărutare ca să pot merge mai iute». Și nici nu
zise până ce și fură un sărutat.
«Să nu ai parte de altul; – grăì și această fată… Mergi în calea,
pe carea-i venit: flori să-ți crească în cale, și flori să-ți rămână pe
urmă.
Feciorul cel de împărat merse la frații săi, le spuse – cum și ce, –
și, acum de-a treia oara, pornì feciorul de împărat, – cel mai tânăr
fecior de împărat. Când el sosì la cetatea cea cu trei fete, Ileana stà
la fereastră, și, cum stà, ea îl văzù și’i grăì cu glas vesel:
«Cel voinic frumos cu față de împărat, – ce cale ți-ai ales de mâni
așa de înfocat?»
Când feciorul de împărat văzù fața Ilenei și auzì vorba ei, el stete
locului, privì la ea și apoi grăì cu glas voinicesc:
«Am pornit la soare, ca să-i fur o rază, să-i încredinț sora și s’o
duc acasă să mi-o fac mireasă. Acum surioară mă opresc în cale să
privesc la tine, în raza feței tale și să-ți zic o vorbă și să-ți fur o
vorbă.
Ileana îi răspunse cu înțelepciune: «De ți-ar fi năravul cum îți
este vorba, de ți-ar fi și sufletul cum îți este fața, mândre și
frumoase, blânde drăgostoase; te-aș chema în casă, te-aș pune la
masă și te-aș ospătà și te-aș sărutà».
Feciorul de împărat sărì de pe cal când auzi aceste vorbe, apoi
grăì cu glas voinicesc:
«Că-mi este năravul cum îmi auzi vorba, că-mi este sufletul
precum îmi vezi fața: lasă-mă în casă, pune-mă la masă: și, din zori
în seară rău să nu’ți pară». Și nici nu-și grăì vorba – până-ce și sărì
pe fereastră și peste fereastră în casă și în casă la masă și la masă
tocmai în frunte, unde ședea împăratul când erà mire.
«Ei! stăi! – grăi Ileana. Să văd mai înainte – ești ce-ar fi să fii – și
numai dup’aceea să grăim vorba și să gustăm poama și să începem
dragostea. Poți tu face să ’nflorească din brusture trandafir?
Ba! – grăì feciorul de împărat.
– Atunci floarea ta este scaiul! – zise Ileana cea înțeleaptă. Poți
tu face, ca să cânte liliacul în glas frumos?»
«Ba! – grăì feciorul cel de împărat.
«Atunci zioa ta e noaptea! – zise Ileana cea înțeleaptă. Poți tu
face să rodească măr pe earba lupului?»
«Pot!» – grăì feciorul de împărat.
«El să fie poama ta! – zise Ileana cea frumoasă și șireată. Așază-
te la masă».
Feciorul de împărat se așeză la masă. Ei dar Ileana – e Ileana cea
șireată! El nu se așeză încă bine – și iată – că și căzù, cu scaun cu
tot, în pivnița cea adâncă, în care erà ascunsă comoara împăratului.
Acuma Ileana începù să strige «primejdie» și când se adunară
toți argații, ca să vade ce e și pentru ce, ea le spuse, că a auzit
troncote prin pivniță și se teme cum că a intrat cineva în pivniță, ca
să fure comoara împăratului. Multe vorbe n’au făcut argații, ci de-loc
deschiseră ușa cea de fer și intrară în pivniță și aflară pe feciorul cel
de împărat și cu rușine îl duseră la judecată.
Ileana spuse judecata:
«Douăsprezece fete pedepsite să’l scoață afară din țară și, când
vor ajunge cu el la marginea țării, fiecare să-i dea câte un sărutat».
Așà s’a poruncit; așà s’a întâmplat.
Când feciorul cel de împărat a sosit acasă la frații săi, li-a spus
toată întâmplarea și, după ce li-a spus-o, mare supărare a intrat în
sufletele lor. Ei au trimis dară vorbă la cele două mai mari fete de
împărat, ca ele să facă ce vor face, ca să trimită cumva pe Ileana la
curtea împăratului celui cu trei feciori, pentru ca ei să se poată
răsbuna asupra ei – pentru batjocura ce a pus pe capul lor. Când cea
mai mare fată de împărat primì cuvântul feciorilor de împărat, ea se
făcù bolnavă, chemă pe Ileana la sine la pat și îi spuse, că ea numai
așà se va puteà însănătoșà, dacă Ileana îi va aduce mâncare de pe
vatra feciorilor de împărat.
Ileana de dragul surorii sale le făcea toate: ea luă dar cofița și
pornì către curtea celor trei feciori de împărat, ca să meargă să
ceară sau să iee și să aducă.
Sosind la curte, Ileana intră în ruptul sufletului în cuhnea
împărătească și grăì către bucătarul cel mare.
«Pentru numele lui Dumnezeu! – n’auzi tu cum te strigă
împăratul? – mergi iute, ca să vezi – ce e și pentru ce și care
pricină!»
Bucătariul își luă picioarele pe umere și se depărtă – ca și la
poruncă împărătească adecă. Ileana rămase singură în cuhne, își
umplù vasele de bucate, vărsă apoi pe jos toate bucatele cele
scumpe ce stau la foc și după aceea se ferì din cale.
După-ce feciorii de împărat înțeleseră și despre această
batjocură, ei se supărară încă mai tare decât ce-au fost până acuma,
trimiseră din nou vorbă la cele două surori și se pregătiră din nou la
răzbunare. Abea primì sora cea mijlocie cuvântul voinicilor, ea se
făcù bolnavă, chemă pe Ileana la sine la pat și îi spuse, că numai așa
se va însănătoșà, dacă va gustà din vinul ce se află în pivnițele
feciorilor de împărat. Ileana pentru sora sa le făceà toate: luă dar
cofița și pornì ca să meargă – și să vină. Sosind la curte, ea intră în
ruptul sufletului în pivniță și grăi către pivnițariul cel mare:
«Pentru numele lui Dumnezeu! – n’auzi tu cum te strigă
împărăteasa? – fugi și vezi cum, ce și pentruce pricină!»
Pivnițariul își luă picioarele pe umere și se depărtă ca și la
porunca împărătesei adecă. Ileana își umplù vasele cu vin, vărsă ce-
a rămas, prin pivniță, și apoi porni către casă.
Feciorii de împărat trimiseră, acuma d’a treia oară, veste la cele
două fete de împărat, ca ele să trimită pe Ileana cum n’au trimis-o
încă. Fetele de împărat se făcură acuma amândouă bolnave,
chemară pe sora lor la sine și îi spuseră, că ele numai atunci se vor
însănătoși, dacă Ileana le va aduce două mere dela feciorii cei de
împărat.
«Dragi surorile mele, – grăì Ileana către ele, pentru voi mă duc și
în foc și în apă; cu atât mai bucuros la voinicii cei împărătești». Iși
luă după acea cofița și pornì, ca să meargă, să afle, să ià, să aducă
și să scape pe dragele surorile sale dela moarte.
După ce-a înțeles feciorul de împărat cel mai tânăr, cumcă Ileana
are să vină la el în grădină, ca să fure merele cele de aur, el poruncì
că, dacă va auzi cineva vaete în grădină, nimeni să nu cuteze să
intre, ci să lase pe cel ce s’ar văità, ca să se vaete în pace. Luă după
aceea cuțite mari și săbii și sulițe și fel de fel de lucruri – și le
ascunse în pământ, pe sub mărul cel cu poame de aur; le ascunse
așa, că numai vârful ascuțit le ieșeà din pământ. După ce au gătit
tot, el se ascunse într’un tufiș așteptând sosirea Ilenei.
Ileana sosì la poarta grădinii, și când ea văzù leii cei mari ce stau
pară la intrare, le aruncă câte o bucățică de carne: leii începură a se
bate, iar Ileana merse la măr, pășì încet printre cuțite, săbii, sulițe și
alte lucruri și se suì în pom.
«Să-ți fie de bine surioară, grăi feciorul de împărat acuma. Imi
pare bine, că te văd la casa mea».
«A mea să fie bucuria! – răspunse Ileana, – că am voinic
împărătesc și frumos și viteaz de tovarăș. Aide, suie-te în pom și-mi
ajută să culeg mere pentru dragele surorile mele, că le-au cerut cu
limbă de moarte».
Feciorul de împărat nici nu doreà mai mult, el aveà de gând ca să
tragă pe Ileana din pom între cuțite. «Ești bună tu, Ileano, grăi el, fii
dar încă mai bună și-mi dă mâna de mă ajută în pom!»
«Rău e gândul tău, – își gândì Ileana, – dar parte să ai de el!» îi
dete apoi mâna, îl ridică pe tulpină până la cracuri, îl lăsă apoi ca să
cadă între cuțite și săbii și sulițe și fel de fel de lucruri ce erau gătite
spre pierzarea ei. «N’ați! grăì după aceea, să știi și tu ce ai avut de
gând».
Voinicul cel rău la suflet începù să strige și să se vaete: hei! dar
nimeni nu veneà să-i ajute, ci-l lăsau ca, după porunca lui, să se
vaete în pace și să sufără și să rabde usturările cele grozave.
Ileana își luă merele, le duse acasă, le dete la surorile ei, se
întoarse după aceea la curtea împăratului și le spuse argaților, ca să
meargă să scape pe domnul lor din primejdia cea mare.
Feciorul cel de împărat, batjocorit ca vai de el, trimise după cea
mai vestită vrăjitoare din țară, ca să vină, să-i facă leac și să-i
vindece ranele. Ileana s’a fost dus însă mai înainte la vrăjitoare și i-a
dat bani mulți pentru ca s’o lase pe ea, pe Ileana, să meargă în locul
vrăjitoarei. Așa ajunse Ileana ca vrăjitoare la curtea împăratului: ea
poruncì apoi, ca să se ià pielea unui bivol și să se pună trei zile și trei
nopți în murătură sărată, și după aceea s’o scoată și să învelească în
ea pe feciorul cel rănit. Usturările feciorului de împărat se făcură încă
mai strașnice, durerile lui încă mai nesuferite. Când el văzù dar cum
c’acuma nu e bine, trimise după un popă, ca, înnainte de ce-ar murì,
să-și ușureze sufletul și să se împărtășească. Dar Ileana nici acuma
nu dormea; ea merse la popa, îi dete mulți bani și făcù, ca el să o
trimită pe ea în locul său. Așa ajunse Ileana ca popă la curtea
împăratului.
Când Ileana ajunse la patul feciorului de împărat, el erà pe pragul
morții; nu mai erau în el decât trei răsuflări.
«Fătul meu, grăì Ileana popită, m’ai chemat la tine, ca să-ți
mărturisești păcatele. Gândește dar la ceasul morți și spune-mi, ce-ți
zace la inimă. Ești supărat pe cineva ori ba?
«Ba! pe nimeni! grăì feciorul de împărat, pe nimeni afară de
Ileana, fata cea mai tânără a împăratului vecin. Și o urăsc cu dor și
dragoste, vorbì mai departe feciorul de împărat. Dacă ar fi să nu mor
și să mă însănătoșesc, mă duc s’o pețesc la împăratul, și dacă n’o
pierì în noaptea cea dintâiu, atunci ea să-mi fie soție credincioasă și
după lege».
Ileana ascultă aceste vorbe, zise încă și ea puține și apoi merse
acasă. Aici înțelese că surorile ei plâng și se vaietă pentru că au fost
simțit că împăratul are să sosească acasă dela lupta cea mare.
«Bucurie s’aveți, le zise Ileana, când auziți, că taica nostru cel
bun are să vină acasă întreg și sănătos».
«Hei! că noi ne-am bucurà, răspunseră surorile, dacă nu ne-ar fi
veștejit floarea, nu ne-ar fi putrezit mărul și nu ni s’ar fi supărat
păsărica; dar acum e vai și amar de capul nostru».
Când Ileana auzì astfel de vorbe, ea merse la sine în casă și află
că floarea e încă aburită de rouă, că pasărea e flămândă și că mărul
numai nu zice: «mănâncă-mă, surioară». Ca să le ajute dar dragilor
surorilor ei, ea dete la una dintre ele floarea, la alta dete păsărica,
iar sie-și ținù numai mărul cel fraged. Așa așteptară sosirea
împăratului celui aspru la poruncă.
Impăratul, îndată ce sosì acasă, intră la fata cea mai mare și o
întrebă de floare, de păsărică și de măr. Ea îi arătă numai floarea; și
asta erà însă pe jumătate veștejită. Impăratul nu zise nimic, ci merse
la fiică-sa cea mijlocie. Asta-i arătă numai păsărica; și asta erà însă
pe jumătate întristată. Impăratul iarăși nu zise nimic, ci merse fără
vorbă la fiică-sa cea mai mică, la Ileana cea înțeleaptă.
Când împăratul văzù mărul pe dulapul Ilenei, el erà să-l mănânce
cu ochii, de frumos ce erà. – «Unde ai pus floarea și ce ai făcut
păsăruica?» întrebă el pe Ileana.
Ileana nici nu răspunse, ci fugì la surorile sale și aduse o floare
proaspătă și o pasăre veselă.
«Mare să crești, fata mea! – grăì împăratul, acum văd că ți-ai
păzit credința.»
De la Ileana împăratul iarăși merse la fiică-sa cea mijlocie și apoi
la cea mai mare. După ce el le întrebă de cele trei lucruri ce le-a
încredințat, ele își aduseră cu grabă pasărea, floarea și mărul dela
Ileana. Hei! dar bunul Dumnezeu nu rabdă minciuna: la ele floarea
erà veștedă, pasărea erà tristă și numai mărul erà proaspăt, fraged,
rumen și îmbietor la față.
*
Când împăratul văzù acestea, el înțelese toată treaba: poruncì
dar, ca pe cele două fete mai mari să le îngroape pân’ la sinișori în
pământ și așà să le lase ca să vestească asprimea pedepsei
împărătești. Iar pe Ileana o lăudă și sărută și multă vorbă bună și
împărătească făcù cu ea, zicându-i: «Mult noroc să ai, fata mea, căci
tu ți-ai păzit credința.»
După ce feciorul cel mai tânăr al împăratului vecin s’a
însănătoșat, el încălecă și pornì, ca să vină și să pețească pe Ileana.
Impăratul cel bătrân, tata Ilenei, îi zise cu vorbă părintească, când el
își spuse gândul, care l-a făcut să pornească în cale: «Fătul meu,
voinice, mergi și întreabă pe Ileana; cum ea dorește, cu ajutorul lui
Dumnezeu, așa are să fie.»
Iar Ileana nu zise nici o vorbă, cì lăsă, ca voinicul cel pățit să o
sărute. Atunci împăratul pricepù toată treaba și grăì: «Dragi copiii
mei, bag sama așa a fost dat, ca voi să vă fiți soț și soție; să vă fie
dară de bine!»
Multă vreme n’a trecut pănă ce Ileana se cunună cu feciorul cel
voinic și frumos și viteaz și împărătesc, și li se făcù o nuntă, încât i-a
mers vestea în șapte țări… Hei! dar Ileana n’a uitat vorba și gândul
cel rău al feciorului de împărat: ea știà cum că în cea dintăi noapte
după cununie are să o primejduiască. – Poruncì dară, ca să se facă o
păpușă de zahăr tomai atât de mare cum erà ea însuși…, cu față, cu
ochi, cu buze, cu toată făptura Ilenei… Și când păpușa fù gătită, ea
o ascunse în patul, în care ea aveà să se culce în acea noapte.
Sara, când cuscrii și corinteii s’au fost așezat la odihnă și Ileana
s’a fost culcat în pat, feciorul de împărat grăì către mireasa lui:
«Dragă Ileană, să mai aștepți puțintel, că eu vin îndată.» Eșì
după aceea din casă.
Ileana nu se gândì mult, ci sărì din pat, lăsă păpușa cea de zahăr
în locul său și se ascunse sub o perdea ce stà la capul patului.
Ileana nici nu se ascunsese bine pănă ce feciorul cel de împărat
și intră în casă cu o sabie ascuțită în mână.
«Să-mi spui acuma, Ileană draga mea, grăì el, tu m’ai aruncat pe
mine în pivniță?»
«Eu!» grăì Ileana de sub perdea.
Feciorul de împărat dete odată cu sabia peste sinișorii păpușii.
«Tu m’ai scos cu batjocură din țară, întrebă el de-a doua oară.
«Eu», grăì Ileana.
Feciorul cel de împărat dete peste față.
«Tu mi-ai vărsat mâncările? întrebă feciorul de împărat de-a treia
oară.
«Eu», grăì Ileana.
Feciorul de împărat dete cu spada de sus în jos.
«Tu mi-ai vărsat vinul?» întrebă feciorul de împărat de-a patra
oară.
«Eu», grăì Ileana.
Feciorul de împărat dete cu spada odată cruciș și odată curmeziș.
– Iar Ileana începù a răsuflà aburi de moarte.
«Tu m’ai aruncat în cuțite?» întrebă feciorul de împăràt de-a
cincea oară și mai în urmă.
«Eu», grăì Ileana.
Feciorul de împărat împunse acuma cu sabia în inima Ilenei,
începù apoi să dea în toate părțile, și cruciș, și curmeziș, și în lung, și
în lat, să dea din toate puterile ce aveà, încât îi curgeau lacrămile
pârău. Când se apropiară zorile de ziuă, el începù să plângă din
toată inima. – Odată îi sărì o bucățică de zahăr în gură.
«Hei! Ileană! dulce ai fost vie, dar dulce ești și moartă!» zise el
plângând încă mai tare.
«Dulce zău!» grăì Ileana, eșind de sub perdea, «dar pe de-o sută
și de o mie de ori mai dulce am să fiu de aci înainte.»
Feciorul de împărat stete împietrit de bucurie când văzù pe Ileana
întreagă și sănătoasă. El o cuprinse în brațe, și de aici înainte trăiră
mulți ani fericiți și împărățiră peste țară cu pace și cu noroc.
DOI FEȚI CU STEA IN FRUNTE

POVESTE
fost ce a fost; dacă n’ar fi fost, nici nu s’ar povestì.
A fost odată un împărat. Impăratul acesta stăpânea o
lume întreagă, și în lumea asta erà un păcurar4) bătrân și
o păcurăriță, care aveau trei fete: Ana, Stana și Lăptița.
Ana, cea mai în vârstă dintre surori, erà frumoasă, încât oile
încetau a paște când o zăreau în mijlocul lor; Stana, cea mijlocie, erà
frumoasă, încât lupii păzeau turma când o vedeau pe dânsa stăpână;
eară Lăptița, cea mai tânără soră, albă ca spuma laptelui și cu păr
moale ca lâna mielușeilor, erà frumoasă, – mai frumoasă decât
snrorile sale împreună – frumoasă, cum numai dânsa erà.
Intr’o zi de vară, când razele soarelui erau mai stâmpărate, cele
trei surori se duseră ca să culeagă căpșune în marginea codrilor.
Pe când ele culegeau căpșunele, îndată se aude un șir de
tropote, ca și când ar venì și s’ar apropià o turmă de călăreți. Erà
cine erà; erà tocmai feciorul împăratului venind ca să meargă cu
prietenii și cu curtenii săi la vânat.
Tot voinici frumoși, crescuți în șelele cailor; dar cel mai frumos și
pe cel mai infocat armăsar erà… cine altul putea să fie?… făt-voinic
feciorul de împărat. Focul cailor se stămpără în zărirea celor trei
surori și călăreții deteră în pas mai încetișor, până ce, veniți și sosiți,
se simțiră duși.
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebooknice.com

You might also like