bell 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +5 -0
- data/.rvmrc +1 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +47 -0
- data/MIT-LICENSE +20 -0
- data/README.org +128 -0
- data/Rakefile +16 -0
- data/bell.gemspec +30 -0
- data/bin/bell +5 -0
- data/features/create_user.feature +16 -0
- data/features/full_report.feature +84 -0
- data/features/import_public_contacts.feature +20 -0
- data/features/import_user_contacts.feature +43 -0
- data/features/list_all_contacts.feature +19 -0
- data/features/list_user_contacts.feature +27 -0
- data/features/list_users.feature +22 -0
- data/features/remove_user.feature +21 -0
- data/features/rename_user.feature +25 -0
- data/features/step_definitions/cli_steps.rb +59 -0
- data/features/step_definitions/contact_steps.rb +104 -0
- data/features/step_definitions/database_steps.rb +3 -0
- data/features/step_definitions/report_steps.rb +17 -0
- data/features/step_definitions/user_steps.rb +71 -0
- data/features/support/env.rb +65 -0
- data/features/user_report.feature +67 -0
- data/lib/bell/cli.rb +12 -0
- data/lib/bell/commands/command.rb +58 -0
- data/lib/bell/commands/contact_command.rb +91 -0
- data/lib/bell/commands/implosion_command.rb +14 -0
- data/lib/bell/commands/report_command.rb +69 -0
- data/lib/bell/commands/user_command.rb +74 -0
- data/lib/bell/commands.rb +5 -0
- data/lib/bell/csv_parser.rb +52 -0
- data/lib/bell/dispatcher.rb +13 -0
- data/lib/bell/displayable.rb +13 -0
- data/lib/bell/full_report.rb +145 -0
- data/lib/bell/handlers/contacts_handler.rb +79 -0
- data/lib/bell/handlers/implosions_handler.rb +9 -0
- data/lib/bell/handlers/reports_handler.rb +41 -0
- data/lib/bell/handlers/users_handler.rb +50 -0
- data/lib/bell/handlers.rb +4 -0
- data/lib/bell/message.rb +115 -0
- data/lib/bell/public_contact.rb +17 -0
- data/lib/bell/user.rb +16 -0
- data/lib/bell/user_contact.rb +18 -0
- data/lib/bell/user_report.rb +88 -0
- data/lib/bell/util.rb +31 -0
- data/lib/bell.rb +157 -0
- data/spec/bell/cli_spec.rb +4 -0
- data/spec/bell/commands/command_spec.rb +59 -0
- data/spec/bell/commands/contact_command_spec.rb +112 -0
- data/spec/bell/commands/implosion_command_spec.rb +31 -0
- data/spec/bell/commands/report_command_spec.rb +71 -0
- data/spec/bell/commands/user_command_spec.rb +128 -0
- data/spec/bell/csv_parser_spec.rb +167 -0
- data/spec/bell/dispatcher_spec.rb +4 -0
- data/spec/bell/full_report_spec.rb +4 -0
- data/spec/bell/handlers/contacts_handler_spec.rb +160 -0
- data/spec/bell/handlers/implosions_handler_spec.rb +11 -0
- data/spec/bell/handlers/reports_handler_spec.rb +183 -0
- data/spec/bell/handlers/users_handler_spec.rb +94 -0
- data/spec/bell/public_contact_spec.rb +4 -0
- data/spec/bell/user_contact_spec.rb +4 -0
- data/spec/bell/user_report_spec.rb +4 -0
- data/spec/bell/user_spec.rb +4 -0
- data/spec/spec_helper.rb +21 -0
- metadata +230 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm 1.9.2@bell --create
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
bell (0.0.1)
|
5
|
+
embratel (= 1.1.2)
|
6
|
+
sequel (= 3.23.0)
|
7
|
+
sqlite3-ruby (= 1.3.3)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: http://rubygems.org/
|
11
|
+
specs:
|
12
|
+
builder (3.0.0)
|
13
|
+
cucumber (0.10.2)
|
14
|
+
builder (>= 2.1.2)
|
15
|
+
diff-lcs (>= 1.1.2)
|
16
|
+
gherkin (>= 2.3.5)
|
17
|
+
json (>= 1.4.6)
|
18
|
+
term-ansicolor (>= 1.0.5)
|
19
|
+
diff-lcs (1.1.2)
|
20
|
+
embratel (1.1.2)
|
21
|
+
gherkin (2.3.7)
|
22
|
+
json (>= 1.4.6)
|
23
|
+
json (1.5.1)
|
24
|
+
rake (0.8.7)
|
25
|
+
rspec (2.5.0)
|
26
|
+
rspec-core (~> 2.5.0)
|
27
|
+
rspec-expectations (~> 2.5.0)
|
28
|
+
rspec-mocks (~> 2.5.0)
|
29
|
+
rspec-core (2.5.1)
|
30
|
+
rspec-expectations (2.5.0)
|
31
|
+
diff-lcs (~> 1.1.2)
|
32
|
+
rspec-mocks (2.5.0)
|
33
|
+
sequel (3.23.0)
|
34
|
+
sqlite3 (1.3.3)
|
35
|
+
sqlite3-ruby (1.3.3)
|
36
|
+
sqlite3 (>= 1.3.3)
|
37
|
+
term-ansicolor (1.0.5)
|
38
|
+
|
39
|
+
PLATFORMS
|
40
|
+
ruby
|
41
|
+
|
42
|
+
DEPENDENCIES
|
43
|
+
bell!
|
44
|
+
bundler (>= 1.0.0)
|
45
|
+
cucumber (= 0.10.2)
|
46
|
+
rake (= 0.8.7)
|
47
|
+
rspec (= 2.5.0)
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 Murilo Soares Pereira
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.org
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
* bell
|
2
|
+
Tenha controle sobre as suas faturas de telefone da Embratel.
|
3
|
+
|
4
|
+
** Instalando (ainda não disponível)
|
5
|
+
#+BEGIN_SRC
|
6
|
+
gem install bell
|
7
|
+
#+END_SRC
|
8
|
+
Você precisa ter o ruby e o rubygems instalados.
|
9
|
+
|
10
|
+
** Como Isso Pode Me Ajudar?
|
11
|
+
Bell permite que você crie e mantenha usuários e suas listas de contatos.
|
12
|
+
Estes dados combinados com um arquivo de fatura da embratel te permitem
|
13
|
+
obter todo o tipo de informação.
|
14
|
+
|
15
|
+
Por exemplo:
|
16
|
+
- mostrar quanto um determinado usuário gastou e para quais números ligou
|
17
|
+
- mostrar quanto foi gasto em ligações para um determinado número e quanto
|
18
|
+
foi gasto em cada uma das ligações
|
19
|
+
- montar relatórios completos, que mostram:
|
20
|
+
- o valor total da fatura
|
21
|
+
- o valor gasto por cada usuário
|
22
|
+
- o valor total, e todas as ligações públicas (feitas por mais de um
|
23
|
+
usuário)
|
24
|
+
- o valor total, e todas as ligações desconhecidas (não presentes em
|
25
|
+
nenhuma lista de contatos)
|
26
|
+
|
27
|
+
** Como Usar
|
28
|
+
*** Criando Usuários
|
29
|
+
#+BEGIN_SRC
|
30
|
+
$ bell user create joão
|
31
|
+
Usuário 'joão' criado.
|
32
|
+
#+END_SRC
|
33
|
+
|
34
|
+
Você agora pode ver o joão na lista de usuários
|
35
|
+
#+BEGIN_SRC
|
36
|
+
$ bell user list
|
37
|
+
joão
|
38
|
+
#+END_SRC
|
39
|
+
|
40
|
+
*** Importando Contatos
|
41
|
+
Com o usuário 'joão' criado você pode importar a lista de contatos dele. A
|
42
|
+
lista de contatos deve ser um arquivo csv, onde cada linha deste arquivo
|
43
|
+
representa um contato, sendo a primeira coluna o nome e a segunda o número
|
44
|
+
de telefone.
|
45
|
+
|
46
|
+
Exemplo:
|
47
|
+
#+CAPTION: Lista de contatos
|
48
|
+
[[http://content.screencast.com/users/murilasso/folders/Default/media/99ad1dae-ef89-4c8b-9bfe-eeaa7ac5e3aa/2010-10-30-a7e887a6e.png]]
|
49
|
+
|
50
|
+
Repare que o formato do número de telefone deve ser uma sequência de 10
|
51
|
+
dígitos, sendo os dois primeiros o DDD e os oito últimos o número em si.
|
52
|
+
|
53
|
+
Com um arquivo da lista de contatos, podemos importar estes contatos para
|
54
|
+
um usuário
|
55
|
+
#+BEGIN_SRC
|
56
|
+
$ bell contact import /path/para/lista/de/contatos.csv -u joão
|
57
|
+
#+END_SRC
|
58
|
+
|
59
|
+
Agora ao listar os contatos do joão você pode ver os contatos que acabou
|
60
|
+
de importar
|
61
|
+
#+BEGIN_SRC
|
62
|
+
$ bell contact list -u joão
|
63
|
+
Pedro Silva (1111111111)
|
64
|
+
Cássio Cunha (2222222222)
|
65
|
+
Jorge Montebello (3333333333)
|
66
|
+
Julia Gum (4444444444)
|
67
|
+
Cecília Fernandes (5555555555)
|
68
|
+
Francisco Côco (6666666666)
|
69
|
+
#+END_SRC
|
70
|
+
|
71
|
+
Com um usuário e sua lista de contatos você pode começar
|
72
|
+
a visualizar relatórios, usando os arquivos de fatura da Embratel.
|
73
|
+
|
74
|
+
*** Fatura da Embratel
|
75
|
+
A Embratel fornece faturas de conta de telefone em seu
|
76
|
+
[[http://fatura.embratel.net.br/embratel/index.html][serviço online]].
|
77
|
+
Para extrair informações sobre uma fatura, você precisará do arquivo
|
78
|
+
.csv de um dado mês.
|
79
|
+
**** Como obter o arquivo da fatura?
|
80
|
+
- [[http://fatura.embratel.net.br/embratel/jsp/selectClientRegister.jsp][cadastre-se]] se você não possui uma conta
|
81
|
+
- logue no site
|
82
|
+
- escolha o mês da fatura
|
83
|
+
- vá em 'Opções' e selecione 'Exportar toda a conta'
|
84
|
+
- exporte como 'Excel - CSV'
|
85
|
+
|
86
|
+
Com usuários e suas respectivas listas de contatos criados você pode
|
87
|
+
visualizar diversos tipos de relatórios para a fatura de um dado mês.
|
88
|
+
|
89
|
+
*** Visualizando Relatórios
|
90
|
+
Relatório completo
|
91
|
+
#+BEGIN_SRC
|
92
|
+
$ bell report /path/para/fatura.csv
|
93
|
+
#+END_SRC
|
94
|
+
|
95
|
+
Relatório de usuário
|
96
|
+
#+BEGIN_SRC
|
97
|
+
$ bell report /path/para/fatura.csv -u joão
|
98
|
+
#+END_SRC
|
99
|
+
|
100
|
+
Relatório de ligação
|
101
|
+
#+BEGIN_SRC
|
102
|
+
$ bell report /path/para/fatura.csv -n 1111111111
|
103
|
+
#+END_SRC
|
104
|
+
|
105
|
+
** Para rodar os testes
|
106
|
+
*** Pegue o código
|
107
|
+
#+BEGIN_SRC
|
108
|
+
git clone git://github.com/murilasso/bell.git
|
109
|
+
cd bell
|
110
|
+
#+END_SRC
|
111
|
+
|
112
|
+
*** Instale o bundler e as dependências (se já não estiverem instaladas)
|
113
|
+
#+BEGIN_SRC
|
114
|
+
gem install bundler
|
115
|
+
bundle install
|
116
|
+
#+END_SRC
|
117
|
+
|
118
|
+
*** Rode os testes
|
119
|
+
#+BEGIN_SRC
|
120
|
+
rake
|
121
|
+
#+END_SRC
|
122
|
+
|
123
|
+
** Autor
|
124
|
+
[[http://murilopereira.com][Murilo Pereira]]
|
125
|
+
|
126
|
+
** Licença
|
127
|
+
Distribuído sob a
|
128
|
+
[[http://github.com/murilasso/embratel/blob/master/MIT-LICENSE][licença MIT]].
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'spec/rake/spectask'
|
5
|
+
desc "Run RSpec specs"
|
6
|
+
Spec::Rake::SpecTask.new('spec') do |t|
|
7
|
+
t.spec_opts = %w[--backtrace --colour]
|
8
|
+
t.spec_files = FileList['spec/**/*.rb']
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'cucumber/rake/task'
|
12
|
+
Cucumber::Rake::Task.new(:features) do |features|
|
13
|
+
features.cucumber_opts = "features --format progress"
|
14
|
+
end
|
15
|
+
|
16
|
+
task :default => [:spec, :features]
|
data/bell.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path('../lib/bell', __FILE__)
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'bell'
|
7
|
+
s.version = Bell::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.author = 'Murilo Pereira'
|
10
|
+
s.email = 'murilo@murilopereira.com'
|
11
|
+
s.homepage = 'https://github.com/murilasso/bell'
|
12
|
+
s.summary = 'Tenha controle sobre as suas faturas de telefone da Embratel.'
|
13
|
+
|
14
|
+
s.required_rubygems_version = '>= 1.3.6'
|
15
|
+
|
16
|
+
s.add_development_dependency('bundler', '>= 1.0.0')
|
17
|
+
s.add_development_dependency('cucumber', '0.10.2')
|
18
|
+
s.add_development_dependency('rake', '0.8.7')
|
19
|
+
s.add_development_dependency('rspec', '2.5.0')
|
20
|
+
|
21
|
+
s.add_dependency('embratel', '1.1.2')
|
22
|
+
s.add_dependency('fastercsv', '1.5.4') if RUBY_VERSION < '1.9'
|
23
|
+
s.add_dependency('sequel', '3.23.0')
|
24
|
+
s.add_dependency('sqlite3-ruby', '1.3.3')
|
25
|
+
|
26
|
+
s.files = `git ls-files`.split("\n")
|
27
|
+
s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
|
28
|
+
s.require_path = 'lib'
|
29
|
+
s.executable = 'bell'
|
30
|
+
end
|
data/bin/bell
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
@no-txn
|
2
|
+
Feature: Shell user creates a user
|
3
|
+
As a person using the shell
|
4
|
+
I want to create users
|
5
|
+
In order to associate phone bill calls and contact lists to a name
|
6
|
+
|
7
|
+
Scenario: When the given user name isn't taken
|
8
|
+
Given no user with name "murilo" exists
|
9
|
+
When I create a user with name "murilo"
|
10
|
+
Then bell should tell me that a user with name "murilo" was created
|
11
|
+
And I should have the user "murilo" in the database
|
12
|
+
|
13
|
+
Scenario: When the given user name isn't taken
|
14
|
+
Given a user with name "murilo" exists
|
15
|
+
When I create a user with name "murilo"
|
16
|
+
Then bell should tell me that the user "murilo" already exists
|
@@ -0,0 +1,84 @@
|
|
1
|
+
@no-txn
|
2
|
+
Feature: Shell user requests a full report
|
3
|
+
As a person using the shell
|
4
|
+
I want to show full reports
|
5
|
+
In order to see how much each user spent on phone calls
|
6
|
+
|
7
|
+
Scenario: Non-existing file
|
8
|
+
When I request a full report using "/non/existent/path"
|
9
|
+
Then bell should tell me that "/non/existent/path" does not exist
|
10
|
+
|
11
|
+
Scenario: Directory
|
12
|
+
Given a directory named "tmp"
|
13
|
+
When I request a full report using "tmp"
|
14
|
+
Then bell should tell me that "tmp" is a directory
|
15
|
+
|
16
|
+
Scenario: Non CSV file
|
17
|
+
Given a file named "non_csv_file.txt" with:
|
18
|
+
"""
|
19
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit
|
20
|
+
"""
|
21
|
+
When I request a full report using "non_csv_file.txt"
|
22
|
+
Then bell should tell me that "non_csv_file.txt" is not a csv file
|
23
|
+
|
24
|
+
Scenario: Malformed CSV file
|
25
|
+
Given a file named "malformed_csv_file.csv" with:
|
26
|
+
"""
|
27
|
+
"1", 'first"
|
28
|
+
"""
|
29
|
+
When I request a full report using "malformed_csv_file.csv"
|
30
|
+
Then bell should tell me that "malformed_csv_file.csv" is a malformed csv file
|
31
|
+
|
32
|
+
Scenario: Phone bill file with invalid rows
|
33
|
+
Given a file named "invalid_rows.csv" with:
|
34
|
+
"""
|
35
|
+
Detalhes da fatura
|
36
|
+
|
37
|
+
"Seq ","Origem ","Descri��o ","Periodo/Data ","Terminal_Destino ","Local Origem","Local Destino ","Hora Inicio ","Hora Fim ","Imp ","Pais ","Qtde ","Unid ","Valor (R$) "
|
38
|
+
1,"1634125644-FRANQUIA 01 ","04 - LIGACOES DDD PARA CELULARES ","11/08/10 A 99/99/99 ",1993692887,"SCL -SP ","CAS -SP ",02:56:29 AM," ","E "," ",500
|
39
|
+
2,"1634125644-FRANQUIA 01 ","04 - LIGACOES DDD PARA CELULARES ","11/08/10 A 99/99/99 ",1993692887,"SCL -SP ","CAS -SP ",02:59:03 AM," ","E "," ",900,"MIN ",1.3
|
40
|
+
3,"1634125644-FRANQUIA 01 ",
|
41
|
+
|
42
|
+
"""
|
43
|
+
When I request a full report using "invalid_rows.csv"
|
44
|
+
Then bell should tell me that "invalid_rows.csv" has errors on lines 4, 6
|
45
|
+
|
46
|
+
Scenario: Valid phone bill file
|
47
|
+
Given a user with name "bob" exists
|
48
|
+
And a user with name "earl" exists
|
49
|
+
And "bob" has a contact with number "1993692887" in his contact list
|
50
|
+
And "earl" has a contact with number "1992563321" in his contact list
|
51
|
+
And a public contact with number "1634124321" and name "wig"
|
52
|
+
And a file named "fatura.csv" with:
|
53
|
+
"""
|
54
|
+
Detalhes da fatura
|
55
|
+
|
56
|
+
"Seq ","Origem ","Descri��o ","Periodo/Data ","Terminal_Destino ","Local Origem","Local Destino ","Hora Inicio ","Hora Fim ","Imp ","Pais ","Qtde ","Unid ","Valor (R$) "
|
57
|
+
1,"1634125644-FRANQUIA 01 ","04 - LIGACOES DDD PARA CELULARES ","11/08/10 A 99/99/99 ",1993692887,"SCL -SP ","CAS -SP ",02:56:29 AM," ","E "," ",500,"MIN ",0.73
|
58
|
+
2,"1634125644-FRANQUIA 01 ","04 - LIGACOES DDD PARA CELULARES ","11/08/10 A 99/99/99 ",1993692887,"SCL -SP ","CAS -SP ",02:59:03 AM," ","E "," ",900,"MIN ",1.3
|
59
|
+
3,"1634125644-FRANQUIA 01 ","04 - LIGACOES DDD PARA CELULARES ","13/08/10 A 99/99/99 ",1992563321,"SCL -SP ","CAS -SP ",09:07:55 PM," ","E "," ",5800,"MIN ",8.47
|
60
|
+
3,"1634125644-FRANQUIA 01 ","04 - LIGACOES DDD PARA CELULARES ","10/10/10 A 99/99/99 ",1634124321,"SCL -SP ","CAS -SP ",10:10:10 PM," ","E "," ",5800,"MIN ",18.47
|
61
|
+
3,"1634125644-FRANQUIA 01 ","04 - LIGACOES DDD PARA CELULARES ","09/09/09 A 99/99/99 ",1912341234,"SCL -SP ","CAS -SP ",09:09:09 PM," ","E "," ",5800,"MIN ",3.70
|
62
|
+
3,"1634125644-FRANQUIA 01 ","04 - LIGACOES DDD PARA CELULARES ","13/08/10 A 99/99/99 ",,"SCL -SP ","CAS -SP ",09:07:55 PM," ","E "," ",5800,"MIN ",1.11
|
63
|
+
|
64
|
+
"""
|
65
|
+
When I request a full report using "fatura.csv"
|
66
|
+
Then the output should be:
|
67
|
+
"""
|
68
|
+
[resumo]
|
69
|
+
Total: 33.78
|
70
|
+
Usuários: 10.50
|
71
|
+
Públicas: 18.47
|
72
|
+
Desconhecidas: 3.70
|
73
|
+
Taxas: 1.11
|
74
|
+
|
75
|
+
[usuários]
|
76
|
+
bob 4.44
|
77
|
+
earl 10.88
|
78
|
+
|
79
|
+
[ligações públicas]
|
80
|
+
1634124321 (wig) 10:10:10 PM 10/10/10 18.47
|
81
|
+
|
82
|
+
[ligações desconhecidas]
|
83
|
+
1912341234 09:09:09 PM 09/09/09 3.70
|
84
|
+
"""
|
@@ -0,0 +1,20 @@
|
|
1
|
+
@no-txn
|
2
|
+
Feature: Shell user imports a csv file of public contacts
|
3
|
+
As a person using the shell
|
4
|
+
I want to import public contacts
|
5
|
+
In order to split common phone calls between all users
|
6
|
+
|
7
|
+
Scenario: Valid contacts file
|
8
|
+
Given a file named "public_contacts.csv" with:
|
9
|
+
"""
|
10
|
+
"john",1234123412
|
11
|
+
"bob",9876987698
|
12
|
+
"""
|
13
|
+
When I request a public contact import using "public_contacts.csv"
|
14
|
+
Then "john" should be in the public contact list
|
15
|
+
And "bob" should be in the public contact list
|
16
|
+
And the output should be:
|
17
|
+
"""
|
18
|
+
'john (1234123412)' adicionado à lista de contatos públicos.
|
19
|
+
'bob (9876987698)' adicionado à lista de contatos públicos.
|
20
|
+
"""
|
@@ -0,0 +1,43 @@
|
|
1
|
+
@no-txn
|
2
|
+
Feature: Shell user imports a csv file of a user's contacts
|
3
|
+
As a person using the shell
|
4
|
+
I want to import user contacts
|
5
|
+
In order to associate phone calls to users
|
6
|
+
|
7
|
+
Scenario: Non-existing file
|
8
|
+
Given a user with name "earl" exists
|
9
|
+
When I request a contact import for "earl" using "/non/existant/path"
|
10
|
+
Then bell should tell me that "/non/existant/path" does not exist
|
11
|
+
|
12
|
+
Scenario: Directory
|
13
|
+
Given a directory named "tmp"
|
14
|
+
And a user with name "earl" exists
|
15
|
+
When I request a contact import for "earl" using "tmp"
|
16
|
+
Then bell should tell me that "tmp" is a directory
|
17
|
+
|
18
|
+
Scenario: Invalid contacts file
|
19
|
+
Given a user with name "earl" exists
|
20
|
+
And a file named "invalid.csv" with:
|
21
|
+
"""
|
22
|
+
"john",1234123412
|
23
|
+
"bob
|
24
|
+
"""
|
25
|
+
When I request a contact import for "earl" using "invalid.csv"
|
26
|
+
Then bell should tell me that "invalid.csv" is an invalid contacts file
|
27
|
+
|
28
|
+
Scenario: Valid contacts file
|
29
|
+
Given a user with name "earl" exists
|
30
|
+
And "earl" has an empty contact list
|
31
|
+
And a file named "earl.csv" with:
|
32
|
+
"""
|
33
|
+
"john",1234123412
|
34
|
+
"bob",9876987698
|
35
|
+
"""
|
36
|
+
When I request a contact import for "earl" using "earl.csv"
|
37
|
+
Then the output should be:
|
38
|
+
"""
|
39
|
+
'john (1234123412)' adicionado à lista de contatos do usuário 'earl'.
|
40
|
+
'bob (9876987698)' adicionado à lista de contatos do usuário 'earl'.
|
41
|
+
"""
|
42
|
+
And "earl" should have "john" in his contact list
|
43
|
+
And "earl" should have "bob" in his contact list
|
@@ -0,0 +1,19 @@
|
|
1
|
+
@no-txn
|
2
|
+
Feature: Shell user lists all contacts
|
3
|
+
As a person using the shell
|
4
|
+
I want to list all contacts
|
5
|
+
In order to see the contacts' names and numbers
|
6
|
+
|
7
|
+
Scenario: When there are no created contacts
|
8
|
+
Given no created contacts
|
9
|
+
When I list all contacts
|
10
|
+
Then bell should tell me that there are no created contacts
|
11
|
+
|
12
|
+
Scenario: When there are created contacts
|
13
|
+
Given a user with name "murilo" exists
|
14
|
+
And a user with name "roberto" exists
|
15
|
+
And "murilo" has a contact with name "augusto" and number "1234123412" in his contact list
|
16
|
+
And "roberto" has a contact with name "selma" and number "9876987698" in his contact list
|
17
|
+
When I list all contacts
|
18
|
+
Then bell's output should contain "augusto (1234123412) - murilo"
|
19
|
+
And bell's output should contain "selma (9876987698) - roberto"
|
@@ -0,0 +1,27 @@
|
|
1
|
+
@no-txn
|
2
|
+
Feature: Shell user lists a user's contacts
|
3
|
+
As a person using the shell
|
4
|
+
I want to a user's contacts
|
5
|
+
In order to see the contacts' names and numbers
|
6
|
+
|
7
|
+
Scenario: When there are no contacts created
|
8
|
+
Given a user with name "murilo" exists
|
9
|
+
And "murilo" has an empty contact list
|
10
|
+
When I list the contacts for the user with name "murilo"
|
11
|
+
Then bell should tell me that "murilo" has an empty contact list
|
12
|
+
|
13
|
+
Scenario: When there are contacts created
|
14
|
+
Given a user with name "murilo" exists
|
15
|
+
And "murilo" has a contact with name "augusto" and number "1234123412" in his contact list
|
16
|
+
And "murilo" has a contact with name "roberto" and number "9876987698" in his contact list
|
17
|
+
When I list the contacts for the user with name "murilo"
|
18
|
+
Then bell's output should contain /augusto (1234123412)/
|
19
|
+
And bell's output should contain /roberto (9876987698)/
|
20
|
+
|
21
|
+
Scenario: When there are contacts created and asked for the CSV format
|
22
|
+
Given a user with name "murilo" exists
|
23
|
+
And "murilo" has a contact with name "augusto" and number "1234123412" in his contact list
|
24
|
+
And "murilo" has a contact with name "roberto" and number "9876987698" in his contact list
|
25
|
+
When I list the contacts for the user with name "murilo" in CSV format
|
26
|
+
Then bell's output should contain /"augusto",1234123412/
|
27
|
+
And bell's output should contain /"roberto",9876987698/
|
@@ -0,0 +1,22 @@
|
|
1
|
+
@no-txn
|
2
|
+
Feature: Shell user lists users
|
3
|
+
As a person using the shell
|
4
|
+
I want to list users
|
5
|
+
In order to know the names I can associate contacts with
|
6
|
+
|
7
|
+
Scenario: When no users are in the database
|
8
|
+
Given no user exists
|
9
|
+
When I list all users
|
10
|
+
Then bell should tell me that there are no created users
|
11
|
+
|
12
|
+
Scenario: When there is one user in the database
|
13
|
+
Given a user with name "murilo" exists
|
14
|
+
When I list all users
|
15
|
+
Then bell's output should contain "murilo"
|
16
|
+
|
17
|
+
Scenario: When there is more than one user in the database
|
18
|
+
Given a user with name "murilo" exists
|
19
|
+
And a user with name "augusto" exists
|
20
|
+
When I list all users
|
21
|
+
Then bell's output should contain "murilo"
|
22
|
+
And bell's output should contain "augusto"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
@no-txn
|
2
|
+
Feature: Shell user removes a user
|
3
|
+
As a person using the shell
|
4
|
+
I want to remove users
|
5
|
+
In order to keep my database updated
|
6
|
+
|
7
|
+
Scenario: When the user that doesn't exist
|
8
|
+
Given no user with name "murilo" exists
|
9
|
+
When I remove the user with name "murilo"
|
10
|
+
Then bell should tell me that there is no user with name "murilo"
|
11
|
+
|
12
|
+
Scenario: When the user exists
|
13
|
+
Given a user with name "murilo" exists
|
14
|
+
When I remove the user with name "murilo"
|
15
|
+
Then bell should tell me that the user "murilo" was removed
|
16
|
+
|
17
|
+
Scenario: When the user exists and has contacts
|
18
|
+
Given a user with name "murilo" exists
|
19
|
+
And "murilo" has a contact with name "selma" in his contact list
|
20
|
+
When I remove the user with name "murilo"
|
21
|
+
Then I should not have a contact with name "selma" in the database
|
@@ -0,0 +1,25 @@
|
|
1
|
+
@no-txn
|
2
|
+
Feature: Shell user renames a user
|
3
|
+
As a person using the shell
|
4
|
+
I want to rename users
|
5
|
+
In order to keep the user base updated
|
6
|
+
|
7
|
+
Scenario: When there's no user with the source name
|
8
|
+
Given no user with name "bob" exists
|
9
|
+
And a user with name "john" exists
|
10
|
+
When I rename "bob" to "john"
|
11
|
+
Then bell should tell me that there is no user with name "bob"
|
12
|
+
|
13
|
+
Scenario: When there's a user with the source name and a user with the target name
|
14
|
+
Given a user with name "bob" exists
|
15
|
+
And a user with name "john" exists
|
16
|
+
When I rename "bob" to "john"
|
17
|
+
Then bell should tell me that the user "john" already exists
|
18
|
+
|
19
|
+
Scenario: When there's a user with the source name and no user with the target name
|
20
|
+
Given a user with name "bob" exists
|
21
|
+
And no user with name "john" exists
|
22
|
+
When I rename "bob" to "john"
|
23
|
+
Then bell should tell me that the user "bob" was renamed to "john"
|
24
|
+
And I should have the user "john" in the database
|
25
|
+
And I should not have the user "bob" in the database
|
@@ -0,0 +1,59 @@
|
|
1
|
+
Given /^a directory named "([^"]*)"$/ do |name|
|
2
|
+
inside_the_tmp_directory do
|
3
|
+
FileUtils.mkdir(name)
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
Given /^a file named "([^"]*)" with:$/ do |file, content|
|
8
|
+
inside_the_tmp_directory do
|
9
|
+
file = File.new(file, 'w+') << content
|
10
|
+
file.flush
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
Then /^bell should tell me that "([^"]*)" does not exist$/ do |path|
|
15
|
+
path = File.join(TMP_PATH, path)
|
16
|
+
Bell.output.string.chomp.should == Bell::Message.no_such_file_or_directory(path)
|
17
|
+
end
|
18
|
+
|
19
|
+
Then /^bell should tell me that "([^"]*)" is a directory$/ do |path|
|
20
|
+
path = File.join(TMP_PATH, path)
|
21
|
+
Bell.output.string.chomp.should == Bell::Message.path_is_a_directory(path)
|
22
|
+
end
|
23
|
+
|
24
|
+
Then /^bell should tell me that "([^"]*)" is an invalid contacts file$/ do |path|
|
25
|
+
path = File.join(TMP_PATH, path)
|
26
|
+
Bell.output.string.chomp.should == Bell::Message.invalid_contacts_file(path)
|
27
|
+
end
|
28
|
+
|
29
|
+
Then /^bell should tell me that "([^"]*)" is not a csv file$/ do |path|
|
30
|
+
path = File.join(TMP_PATH, path)
|
31
|
+
Bell.output.string.chomp.should == Bell::Message.non_csv_file(path)
|
32
|
+
end
|
33
|
+
|
34
|
+
Then /^bell should tell me that "([^"]*)" has (?:an )?errors? on lines? ((?:\d+, )*(?:\d+))$/ do |path, numbers|
|
35
|
+
path = File.join(TMP_PATH, path)
|
36
|
+
message = numbers.insert(0, numbers.size == 1 ? 'Erro na linha ' : 'Erro nas linhas ')
|
37
|
+
Bell.output.string.chomp.should == Bell::Message.invalid_rows(path, message)
|
38
|
+
end
|
39
|
+
|
40
|
+
Then /^bell should tell me that "([^"]*)" is a malformed csv file$/ do |path|
|
41
|
+
path = File.join(TMP_PATH, path)
|
42
|
+
Bell.output.string.chomp.should == Bell::Message.malformed_csv_file(path)
|
43
|
+
end
|
44
|
+
|
45
|
+
Then /^bell's output should contain "(.*)"$/ do |text|
|
46
|
+
Bell.output.string.should be_include(text)
|
47
|
+
end
|
48
|
+
|
49
|
+
Then /^bell's output should contain \/(.*)\/$/ do |text|
|
50
|
+
Bell.output.string.should be_include(text)
|
51
|
+
end
|
52
|
+
|
53
|
+
Then /^the output should be "([^"]*)"$/ do |text|
|
54
|
+
Bell.output.string.chomp.should == text
|
55
|
+
end
|
56
|
+
|
57
|
+
Then /^the output should be:$/ do |text|
|
58
|
+
Then %{the output should be "#{text}"}
|
59
|
+
end
|