Skip to content
Merged
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
b683e6a
remove: removed specific examples
wellfernandes Oct 18, 2025
45b5649
remove: packages and files removed after name changes
wellfernandes Oct 18, 2025
f639bcb
refactor: added constructor for address
wellfernandes Oct 18, 2025
94124f7
refactor: added constructor for certificate
wellfernandes Oct 18, 2025
8bf2489
refactor: added constructor for brazilian cert
wellfernandes Oct 18, 2025
d1b986e
refactor: added constructor for brazilian companies
wellfernandes Oct 18, 2025
f36b01e
refactor: added constructor for companies
wellfernandes Oct 18, 2025
198c46b
refactor: added constructor for cpf
wellfernandes Oct 18, 2025
5b6530f
feat: added new error invalid gender
wellfernandes Oct 18, 2025
199b2d1
refactor: added constructor for gender
wellfernandes Oct 18, 2025
968644d
refactor: added constructor for person
wellfernandes Oct 18, 2025
e4d70a6
refactor: added constructor for phone
wellfernandes Oct 18, 2025
f05476f
refactor: fixed package name removing underscore
wellfernandes Oct 18, 2025
47f4b0d
refactor: changed how the mocai object is instantiated
wellfernandes Oct 18, 2025
de3e41a
refactor: added constructor for mocai and changed how the mocai objec…
wellfernandes Oct 18, 2025
cacc80f
docs: updated readme
wellfernandes Oct 18, 2025
43a0605
docs: updated pt readme
wellfernandes Oct 18, 2025
a651c27
docs: added comment to mocai builder
wellfernandes Oct 18, 2025
06f6c45
docs: updated pt readme
wellfernandes Oct 18, 2025
d3c524b
docs: updated readme
wellfernandes Oct 22, 2025
1c5ef80
docs: updated pt readme
wellfernandes Oct 22, 2025
19708bc
refactor: fixed constructor and added error handling
wellfernandes Oct 22, 2025
33b1fa5
refactor: added error handling for entity instances
wellfernandes Oct 22, 2025
bef6750
fix: fixed error handling for generate address
wellfernandes Oct 22, 2025
798928b
fix: fixed error thats never propagated
wellfernandes Oct 22, 2025
74c2c0f
fix: fixed id for the acronym
wellfernandes Oct 22, 2025
26ce805
docs: removed unnecessary comment
wellfernandes Oct 22, 2025
3ab7c7f
refactor: remove setlanguage method to enforce immutability principle
wellfernandes Oct 23, 2025
5c929e2
docs: updated main readme
wellfernandes Oct 23, 2025
56c88c5
docs: updated pt readme
wellfernandes Oct 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 6 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,34 +37,20 @@ go get github.com/brazzcore/mocai
Basic Usage
Import the library into your project and start generating mocks:

```go
// specific
translations.SetLanguage("ptbr")

addr, err := address.GenerateAddress()
if err != nil {
log.Println(err)
}

addr.Street // returns street name
```

```go
// mocker
m, err := mocai.NewMocker("ptbr")
m, err := mocai.NewMocker("ptbr", true)
if err != nil {
log.Println(err)
log.Fatal(err)
}

m.Address().Street // returns street name
m.Phone().Number // returns phone number
m.Address.Street // returns street name
m.Phone.Number // returns phone number
```
### Examples
The ***examples*** folder contains samples of how to use the library, organized by approach:

- `specific/`: Examples using direct calls to each of Mocaí's mockable entities (e.g., phone.GeneratePhone, etc).
The ***examples*** folder contains samples of how to use the library:

- `mocker/`: Example using a main entry point `mocai.NewMocker("ptbr")` to generate mocks in a fluent and simplified way.
- `mocker/`: Example using a main entry point `mocai.NewMocker(lang string, isFormatted bool)` to generate mocks in a fluent and simplified way.

To run an example, navigate to the desired directory and run:
```
Expand Down
26 changes: 6 additions & 20 deletions docs/localization/pt/README-PT.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,35 +35,21 @@ go get github.com/brazzcore/mocai
Uso Básico
Importe a biblioteca em seu projeto e comece a gerar mocks:

```go
// specific
translations.SetLanguage("ptbr")

addr, err := address.GenerateAddress()
if err != nil {
log.Println(err)
}

addr.Street // retorna o nome da rua
```

```go
// mocker
m, err := mocai.NewMocker("ptbr")
m, err := mocai.NewMocker("ptbr", true)
if err != nil {
log.Println(err)
log.Fatal(err)
}

m.Address().Street // retorna o nome da rua
m.Phone().Number // retorna o número de telefone
m.Address.Street // retorna o nome da rua
m.Phone.Number // retorna o número de telefone
```

### Exemplos
O diretório ***examples*** contém exemplos de comoo usar a biblioteca, organizados por abordagem:

- `specific/`: Exemplos usando as funções diretas de cada entidade mockável do Mocaí (`phone.GeneratePhone`, etc).
O diretório ***examples*** contém exemplos de como usar a biblioteca:

- `mocker/`: Exemplo usando um ponto de entrada principal `mocai.NewMocker("ptbr")` para gerar mocks de maneira fluida e simplificada.
- `mocker/`: Exemplo usando um ponto de entrada principal `mocai.NewMocker(lang string, isFormatted bool)` para gerar mocks de maneira fluida e simplificada.

Para executar um exemplo, acesse o diretório desejado e execute:
```
Expand Down
10 changes: 2 additions & 8 deletions examples/mocker/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,15 @@ func main() {

// Initialize mocai and set a supported language
// If the language is not available, the default language pt-BR will be set
m, err := mocai.NewMocker("ptbr")
m, err := mocai.NewMocker("ptbr", true)
if err != nil {
log.Println(err)
}
// Generate mock data
// You can select which entity attributes to use
// by accessing the entity and its fields
m.Person() // m.Person().Age, m.Person().CPF...
m.Address() // m.Address().City, m.Address().Number...
m.Phone() // m.Phone().AreaCode, m.Phone().Number

// Printing mocks example
addr := m.Address()
fmt.Printf("Address: %s, %d - %s, %s (%s) - %s\n",
addr.Street, addr.Number, addr.City, addr.State, addr.UF, addr.ZIP)
m.Address.Street, m.Address.Number, m.Address.City, m.Address.State, m.Address.UF, m.Address.ZIP)

fmt.Println(cli.Footer)
}
96 changes: 0 additions & 96 deletions examples/specific/main.go

This file was deleted.

15 changes: 12 additions & 3 deletions pkg/mocai/entities/address/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,18 @@ type SlicesToCheck struct {
err error
}

// NewAddress creates and returns a new Address with randomly generated data.
func NewAddress() (*Address, error) {
addr, err := (&Address{}).generateAddress()
if err != nil {
return nil, err
}
return addr, nil
}

// GenerateAddress generates a mock address with random data.
// It returns a pointer to an Address and an error if the generation fails.
func GenerateAddress() (*Address, error) {
func (a *Address) generateAddress() (*Address, error) {
lang := translations.GetLanguage()

// Get the list of streets, cities, states, and ZIP codes
Expand All @@ -50,13 +59,13 @@ func GenerateAddress() (*Address, error) {
// - Verifies each item isn't just whitespace
for _, s := range slicesToCheck {
if len(s.data) == 0 {
return nil, s.err
return &Address{}, s.err
}

// Individual item validation (prevent empty values)
for _, item := range s.data {
if strings.TrimSpace(item) == "" {
return nil, fmt.Errorf("%w: empty value in slice", s.err)
return &Address{}, fmt.Errorf("%w: empty value in slice", s.err)
}
}
}
Expand Down
56 changes: 28 additions & 28 deletions pkg/mocai/entities/certificate/countries/brazilian_certificates.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,31 +47,31 @@ type DeathCertificate struct {

// BrazilianCertificates represents all brazilian certificates
type BrazilianCertificates struct {
BirthCertificate *BirthCertificate
MarriageCertificate *MarriageCertificate
DeathCertificate *DeathCertificate
BirthCertificate BirthCertificate
MarriageCertificate MarriageCertificate
DeathCertificate DeathCertificate
}

// GenerateBrazilianCertificates generates a valid brazilian certificates
// If formatted is true, returns the number with separators (-)
// Returns a pointer to BrazilianCertificates and error if any validation fails
func GenerateBrazilianCertificates(formatted bool) (*BrazilianCertificates, error) {
func GenerateBrazilianCertificates(formatted bool) (BrazilianCertificates, error) {
createdBirthCertificate, err := generateBirthCertificate(formatted)
if err != nil {
return nil, err
return BrazilianCertificates{}, err
}

createdMarriageCertificate, err := generateMarriageCertificate(formatted)
if err != nil {
return nil, err
return BrazilianCertificates{}, err
}

createdDeathCertificate, err := generateDeathCertificate(formatted)
if err != nil {
return nil, err
return BrazilianCertificates{}, err
}

createdBrazilianCertificates := &BrazilianCertificates{
createdBrazilianCertificates := BrazilianCertificates{
BirthCertificate: createdBirthCertificate,
MarriageCertificate: createdMarriageCertificate,
DeathCertificate: createdDeathCertificate,
Expand All @@ -84,12 +84,12 @@ func GenerateBrazilianCertificates(formatted bool) (*BrazilianCertificates, erro
// If formatted is true, returns the number with separators (-)
// certificateType is the type of certificate [1 - for birth certificate, 2 - for marriage certificate, 3 - for death certificate]
// Returns a pointer to BaseCertificate and error if any validation fails
func generateCertificate(formatted bool, certificateType int) (*BaseCertificate, error) {
func generateCertificate(formatted bool, certificateType int) (BaseCertificate, error) {
// Registry Office
// 1. Vital Records Office [6 digits]
vitalRecordsOffice := generateRandomNumber(100000, 899999)
if vitalRecordsOffice < 0 {
return nil, ErrInvalidVitalRecordsOffice
return BaseCertificate{}, ErrInvalidVitalRecordsOffice
}

// 2. Archive [2 digits]
Expand All @@ -107,26 +107,26 @@ func generateCertificate(formatted bool, certificateType int) (*BaseCertificate,
// 6. Book number [5 digits]
bookNumber := generateRandomNumber(10000, 89999)
if bookNumber < 0 {
return nil, ErrInvalidBookNumber
return BaseCertificate{}, ErrInvalidBookNumber
}

// 7. Page number [3 digits]
pageNumber := generateRandomNumber(100, 899)
if pageNumber < 0 {
return nil, ErrInvalidPageNumber
return BaseCertificate{}, ErrInvalidPageNumber
}

// 8. Term number [7 digits]
termNumber := generateRandomNumber(1000000, 8999999)
if termNumber < 0 {
return nil, ErrInvalidTermNumber
return BaseCertificate{}, ErrInvalidTermNumber
}

// Number without check digits [30 digits]
numberWithoutCheckDigits := fmt.Sprintf("%06d%02d%02d%04d%d%05d%03d%07d",
vitalRecordsOffice, archiveCode, serviceType, birthYear, certificateType, bookNumber, pageNumber, termNumber)
if len(numberWithoutCheckDigits) != 30 {
return nil, ErrInvalidNumberWithoutCheckDigits
return BaseCertificate{}, ErrInvalidNumberWithoutCheckDigits
}

// 9. Check digits calculation [2 digits]
Expand All @@ -139,10 +139,10 @@ func generateCertificate(formatted bool, certificateType int) (*BaseCertificate,
}

if certificateNumber == "" {
return nil, ErrInvalidCertificate
return BaseCertificate{}, ErrInvalidCertificate
}

createdBaseCertificate := &BaseCertificate{
createdBaseCertificate := BaseCertificate{
VitalRecordsOffice: vitalRecordsOffice,
ArchiveCode: archiveCode,
ServiceType: serviceType,
Expand All @@ -159,42 +159,42 @@ func generateCertificate(formatted bool, certificateType int) (*BaseCertificate,
}

// generateBirthCertificate generates a valid Brazilian birth certificate
func generateBirthCertificate(formatted bool) (*BirthCertificate, error) {
func generateBirthCertificate(formatted bool) (BirthCertificate, error) {
base, err := generateCertificate(formatted, brazilianBirthCertificateType)
if err != nil {
return nil, err
return BirthCertificate{}, err
}

createdBirthCertificate := &BirthCertificate{
BaseCertificate: *base,
createdBirthCertificate := BirthCertificate{
BaseCertificate: base,
}

return createdBirthCertificate, nil
}

// generateMarriageCertificate generates a valid Brazilian marriage certificate
func generateMarriageCertificate(formatted bool) (*MarriageCertificate, error) {
func generateMarriageCertificate(formatted bool) (MarriageCertificate, error) {
base, err := generateCertificate(formatted, brazilianMarriageCertificateType)
if err != nil {
return nil, err
return MarriageCertificate{}, err
}

createdMarriageCertificate := &MarriageCertificate{
BaseCertificate: *base,
createdMarriageCertificate := MarriageCertificate{
BaseCertificate: base,
}

return createdMarriageCertificate, nil
}

// generateDeathCertificate generates a valid Brazilian death certificate
func generateDeathCertificate(formatted bool) (*DeathCertificate, error) {
func generateDeathCertificate(formatted bool) (DeathCertificate, error) {
base, err := generateCertificate(formatted, brazilianDeathCertificateType)
if err != nil {
return nil, err
return DeathCertificate{}, err
}

createdDeathCertificate := &DeathCertificate{
BaseCertificate: *base,
createdDeathCertificate := DeathCertificate{
BaseCertificate: base,
}

return createdDeathCertificate, nil
Expand Down
Loading
Loading