wordpress-deploy 1.0.0.alpha1 → 1.0.0.alpha2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/.gitignore +26 -1
  2. data/.rspec +1 -0
  3. data/.rvmrc +48 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +2 -5
  6. data/Gemfile.lock +40 -28
  7. data/Guardfile +24 -0
  8. data/README.md +22 -7
  9. data/bin/wp-deploy +1 -4
  10. data/lib/wordpress_deploy.rb +22 -48
  11. data/lib/wordpress_deploy/cli/helpers.rb +27 -14
  12. data/lib/wordpress_deploy/cli/utility.rb +86 -37
  13. data/lib/wordpress_deploy/database/mysql.rb +22 -136
  14. data/lib/wordpress_deploy/environment.rb +68 -0
  15. data/lib/wordpress_deploy/errors.rb +54 -0
  16. data/lib/wordpress_deploy/logger.rb +28 -50
  17. data/lib/wordpress_deploy/transfer_protocols/ftp.rb +305 -0
  18. data/lib/wordpress_deploy/version.rb +1 -1
  19. data/lib/wordpress_deploy/wordpress/configuration.rb +196 -0
  20. data/spec/data/ftp.yml +4 -0
  21. data/spec/data/wp-config-sample.php +90 -0
  22. data/spec/data/wp-config.yml +128 -0
  23. data/spec/database/mysql_spec.rb +93 -0
  24. data/spec/environment_spec.rb +35 -0
  25. data/spec/spec_helper.rb +36 -1
  26. data/spec/transfer_protocols/ftp_spec.rb +193 -0
  27. data/spec/wordpress/configuration_spec.rb +202 -0
  28. data/wordpress_deploy.gemspec +13 -10
  29. metadata +63 -47
  30. data/lib/wordpress_deploy/config.rb +0 -68
  31. data/lib/wordpress_deploy/database/base.rb +0 -53
  32. data/lib/wordpress_deploy/pipeline.rb +0 -110
  33. data/lib/wordpress_deploy/storage/base.rb +0 -99
  34. data/lib/wordpress_deploy/storage/ftp.rb +0 -133
  35. data/lib/wordpress_deploy/storage/local.rb +0 -82
  36. data/lib/wordpress_deploy/storage/scp.rb +0 -99
  37. data/lib/wordpress_deploy/storage/sftp.rb +0 -108
  38. data/spec/config_spec.rb +0 -16
@@ -0,0 +1,4 @@
1
+ hostname: ftp.lovelett.me
2
+ username: real_user
3
+ password: their_pa$$w0rd
4
+ remote_dir: /ryan
@@ -0,0 +1,90 @@
1
+ <?php
2
+ /**
3
+ * The base configurations of the WordPress.
4
+ *
5
+ * This file has the following configurations: MySQL settings, Table Prefix,
6
+ * Secret Keys, WordPress Language, and ABSPATH. You can find more information
7
+ * by visiting {@link http://codex.wordpress.org/Editing_wp-config.php Editing
8
+ * wp-config.php} Codex page. You can get the MySQL settings from your web host.
9
+ *
10
+ * This file is used by the wp-config.php creation script during the
11
+ * installation. You don't have to use the web site, you can just copy this file
12
+ * to "wp-config.php" and fill in the values.
13
+ *
14
+ * @package WordPress
15
+ */
16
+
17
+ // ** MySQL settings - You can get this info from your web host ** //
18
+ /** The name of the database for WordPress */
19
+ define('DB_NAME', 'database_name_here');
20
+
21
+ /** MySQL database username */
22
+ define('DB_USER', 'username_here');
23
+
24
+ /** MySQL database password */
25
+ define('DB_PASSWORD', 'password_here');
26
+
27
+ /** MySQL hostname */
28
+ define('DB_HOST', 'localhost');
29
+
30
+ /** Database Charset to use in creating database tables. */
31
+ define('DB_CHARSET', 'utf8');
32
+
33
+ /** The Database Collate type. Don't change this if in doubt. */
34
+ define('DB_COLLATE', '');
35
+
36
+ /**#@+
37
+ * Authentication Unique Keys and Salts.
38
+ *
39
+ * Change these to different unique phrases!
40
+ * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
41
+ * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
42
+ *
43
+ * @since 2.6.0
44
+ */
45
+ define('AUTH_KEY', 'put your unique phrase here');
46
+ define('SECURE_AUTH_KEY', 'put your unique phrase here');
47
+ define('LOGGED_IN_KEY', 'put your unique phrase here');
48
+ define('NONCE_KEY', 'put your unique phrase here');
49
+ define('AUTH_SALT', 'put your unique phrase here');
50
+ define('SECURE_AUTH_SALT', 'put your unique phrase here');
51
+ define('LOGGED_IN_SALT', 'put your unique phrase here');
52
+ define('NONCE_SALT', 'put your unique phrase here');
53
+
54
+ /**#@-*/
55
+
56
+ /**
57
+ * WordPress Database Table prefix.
58
+ *
59
+ * You can have multiple installations in one database if you give each a unique
60
+ * prefix. Only numbers, letters, and underscores please!
61
+ */
62
+ $table_prefix = 'wp_';
63
+
64
+ /**
65
+ * WordPress Localized Language, defaults to English.
66
+ *
67
+ * Change this to localize WordPress. A corresponding MO file for the chosen
68
+ * language must be installed to wp-content/languages. For example, install
69
+ * de_DE.mo to wp-content/languages and set WPLANG to 'de_DE' to enable German
70
+ * language support.
71
+ */
72
+ define('WPLANG', '');
73
+
74
+ /**
75
+ * For developers: WordPress debugging mode.
76
+ *
77
+ * Change this to true to enable the display of notices during development.
78
+ * It is strongly recommended that plugin and theme developers use WP_DEBUG
79
+ * in their development environments.
80
+ */
81
+ define('WP_DEBUG', false);
82
+
83
+ /* That's all, stop editing! Happy blogging. */
84
+
85
+ /** Absolute path to the WordPress directory. */
86
+ if ( !defined('ABSPATH') )
87
+ define('ABSPATH', dirname(__FILE__) . '/');
88
+
89
+ /** Sets up WordPress vars and included files. */
90
+ require_once(ABSPATH . 'wp-settings.php');
@@ -0,0 +1,128 @@
1
+ development:
2
+ DB_NAME: developer_database_name
3
+ DB_USER: root
4
+ DB_PASSWORD: q9&hu6Re_*dReWr_GAba_2wr89#2Ra8$
5
+ DB_HOST: localhost
6
+ DB_CHARSET: utf8
7
+ DB_COLLATE: ''
8
+
9
+ # FTP Transfer settings
10
+ FTP_HOST: localhost
11
+ FTP_USER: root
12
+ FTP_PASSWORD: q9&hu6Re_*dReWr_GAba_2wr89#2Ra8$
13
+ FTP_DIR: /wordpress
14
+
15
+ # Authentication Unique Keys and Salts
16
+ # https://api.wordpress.org/secret-key/1.1/salt/
17
+ # If no salts are supplied they will be generated automatically
18
+ #AUTH_KEY: '*oH{(q=`tIzdNJKUk$XfHNNjKd$W=f$S`CtD.,;x0R}$/A,}]!+q0>>QfB#.Bsw]'
19
+ #SECURE_AUTH_KEY: '{yg|7Q*j-?$%`b|Z!+5U,pvM,eA0+$/ruprp.mO[;|fExU:n0,-!at0+3UY@;h`X'
20
+ #LOGGED_IN_KEY: 'k]N 9I<-rZq#k Xg)IPhv$E*ktbD7Z_AtI){U;(P;0r#LJlYncEr%8v9tG`>BHU+'
21
+ #NONCE_KEY: ' /w9->::-YB Xa#lf%TPH+cIf?]Ru4OfKGF2h8PHsa)2,n-~kRJ<[slUg<GZ Asx'
22
+ #AUTH_SALT: 'VYwGGP,#|9P[5RCUTdv2c8)`^{dotU0fWrU`JE9qq^n=F4//e)fCs<HF6sd>~yjW'
23
+ #SECURE_AUTH_SALT: 'ok}@vSs=n6%_%UCO|&[?Jc;,-,.#Q3}zR4ej%IoAL7RavTN/Xe,UrQ4)p}onRie0'
24
+ #LOGGED_IN_SALT: 'Z!,C*:Q_I9A`[pJm-b0Z/(Gm2qvK8>0~| T&)lM+sxG.OdEmgHbAGF&(^>2.rDGW'
25
+ #NONCE_SALT: 'ay)${bFV=F1KH[`NZ+W+Zk?Hc:@}jN}Ec)+Zn[F1fyP,mwi|@tk/(1hdp[G2F%os'
26
+
27
+ production:
28
+ DB_NAME: production_database_name
29
+ DB_USER: some_user
30
+ DB_PASSWORD: trecuwawraJaZe6P@kucraDrachustUq
31
+ DB_HOST: abbott.biz:6654
32
+ DB_CHARSET: utf8
33
+ DB_COLLATE: ''
34
+
35
+ # FTP Transfer settings
36
+ FTP_HOST: ftp.abbott.biz:6654
37
+ FTP_USER: some_user
38
+ FTP_PASSWORD: trecuwawraJaZe6P@kucraDrachustUq
39
+
40
+ # Authentication Unique Keys and Salts
41
+ # https://api.wordpress.org/secret-key/1.1/salt/
42
+ # If no salts are supplied they will be generated automatically
43
+ #AUTH_KEY: '*oH{(q=`tIzdNJKUk$XfHNNjKd$W=f$S`CtD.,;x0R}$/A,}]!+q0>>QfB#.Bsw]'
44
+ #SECURE_AUTH_KEY: '{yg|7Q*j-?$%`b|Z!+5U,pvM,eA0+$/ruprp.mO[;|fExU:n0,-!at0+3UY@;h`X'
45
+ #LOGGED_IN_KEY: 'k]N 9I<-rZq#k Xg)IPhv$E*ktbD7Z_AtI){U;(P;0r#LJlYncEr%8v9tG`>BHU+'
46
+ #NONCE_KEY: ' /w9->::-YB Xa#lf%TPH+cIf?]Ru4OfKGF2h8PHsa)2,n-~kRJ<[slUg<GZ Asx'
47
+ #AUTH_SALT: 'VYwGGP,#|9P[5RCUTdv2c8)`^{dotU0fWrU`JE9qq^n=F4//e)fCs<HF6sd>~yjW'
48
+ #SECURE_AUTH_SALT: 'ok}@vSs=n6%_%UCO|&[?Jc;,-,.#Q3}zR4ej%IoAL7RavTN/Xe,UrQ4)p}onRie0'
49
+ #LOGGED_IN_SALT: 'Z!,C*:Q_I9A`[pJm-b0Z/(Gm2qvK8>0~| T&)lM+sxG.OdEmgHbAGF&(^>2.rDGW'
50
+ #NONCE_SALT: 'ay)${bFV=F1KH[`NZ+W+Zk?Hc:@}jN}Ec)+Zn[F1fyP,mwi|@tk/(1hdp[G2F%os'
51
+
52
+ red:
53
+ DB_NAME: red
54
+ DB_USER: red_user
55
+ DB_PASSWORD: Bun__huPEMeBreM6tebRAp@eguzuQExe
56
+ DB_HOST: hanerutherford.biz
57
+ DB_CHARSET: utf8
58
+ DB_COLLATE: ''
59
+
60
+ # FTP Transfer settings
61
+ FTP_HOST: ftp.hanerutherford.biz
62
+ FTP_USER: red_user
63
+ FTP_PASSWORD: Bun__huPEMeBreM6tebRAp@eguzuQExe
64
+ FTP_DIR: /html
65
+
66
+ # Authentication Unique Keys and Salts
67
+ # https://api.wordpress.org/secret-key/1.1/salt/
68
+ # If no salts are supplied they will be generated automatically
69
+ AUTH_KEY: '*oH{(q=`tIzdNJKUk$XfHNNjKd$W=f$S`CtD.,;x0R}$/A,}]!+q0>>QfB#.Bsw]'
70
+ SECURE_AUTH_KEY: '{yg|7Q*j-?$%`b|Z!+5U,pvM,eA0+$/ruprp.mO[;|fExU:n0,-!at0+3UY@;h`X'
71
+ LOGGED_IN_KEY: 'k]N 9I<-rZq#k Xg)IPhv$E*ktbD7Z_AtI){U;(P;0r#LJlYncEr%8v9tG`>BHU+'
72
+ NONCE_KEY: ' /w9->::-YB Xa#lf%TPH+cIf?]Ru4OfKGF2h8PHsa)2,n-~kRJ<[slUg<GZ Asx'
73
+ AUTH_SALT: 'VYwGGP,#|9P[5RCUTdv2c8)`^{dotU0fWrU`JE9qq^n=F4//e)fCs<HF6sd>~yjW'
74
+ SECURE_AUTH_SALT: 'ok}@vSs=n6%_%UCO|&[?Jc;,-,.#Q3}zR4ej%IoAL7RavTN/Xe,UrQ4)p}onRie0'
75
+ LOGGED_IN_SALT: 'Z!,C*:Q_I9A`[pJm-b0Z/(Gm2qvK8>0~| T&)lM+sxG.OdEmgHbAGF&(^>2.rDGW'
76
+ NONCE_SALT: 'ay)${bFV=F1KH[`NZ+W+Zk?Hc:@}jN}Ec)+Zn[F1fyP,mwi|@tk/(1hdp[G2F%os'
77
+
78
+ green:
79
+ DB_NAME: green
80
+ DB_USER: domenick.dare
81
+ DB_PASSWORD: Daw&HEWuzaz6sa&epHech_spAKucHaTH
82
+ DB_HOST: yundt.org
83
+ DB_CHARSET: utf8
84
+ DB_COLLATE: ''
85
+
86
+ # FTP Transfer settings
87
+ FTP_HOST: ftp.yundt.org
88
+ FTP_USER: domenick.dare
89
+ FTP_PASSWORD: Daw&HEWuzaz6sa&epHech_spAKucHaTH
90
+ FTP_DIR: /wordpress
91
+
92
+ # Authentication Unique Keys and Salts
93
+ # https://api.wordpress.org/secret-key/1.1/salt/
94
+ # If no salts are supplied they will be generated automatically
95
+ #AUTH_KEY: '*oH{(q=`tIzdNJKUk$XfHNNjKd$W=f$S`CtD.,;x0R}$/A,}]!+q0>>QfB#.Bsw]'
96
+ #SECURE_AUTH_KEY: '{yg|7Q*j-?$%`b|Z!+5U,pvM,eA0+$/ruprp.mO[;|fExU:n0,-!at0+3UY@;h`X'
97
+ #LOGGED_IN_KEY: 'k]N 9I<-rZq#k Xg)IPhv$E*ktbD7Z_AtI){U;(P;0r#LJlYncEr%8v9tG`>BHU+'
98
+ #NONCE_KEY: ' /w9->::-YB Xa#lf%TPH+cIf?]Ru4OfKGF2h8PHsa)2,n-~kRJ<[slUg<GZ Asx'
99
+ #AUTH_SALT: 'VYwGGP,#|9P[5RCUTdv2c8)`^{dotU0fWrU`JE9qq^n=F4//e)fCs<HF6sd>~yjW'
100
+ #SECURE_AUTH_SALT: 'ok}@vSs=n6%_%UCO|&[?Jc;,-,.#Q3}zR4ej%IoAL7RavTN/Xe,UrQ4)p}onRie0'
101
+ #LOGGED_IN_SALT: 'Z!,C*:Q_I9A`[pJm-b0Z/(Gm2qvK8>0~| T&)lM+sxG.OdEmgHbAGF&(^>2.rDGW'
102
+ #NONCE_SALT: 'ay)${bFV=F1KH[`NZ+W+Zk?Hc:@}jN}Ec)+Zn[F1fyP,mwi|@tk/(1hdp[G2F%os'
103
+
104
+ blue:
105
+ DB_NAME: blue
106
+ DB_USER: harrison
107
+ DB_PASSWORD: w5@reba?9?pepuk7w9a#H86ustaGawE!
108
+ DB_HOST: torphagenes.com:/tmp/mysql5.sock
109
+ DB_CHARSET: utf8
110
+ DB_COLLATE: ''
111
+
112
+ # FTP Transfer settings
113
+ FTP_HOST: ftp.torphagenes.com
114
+ FTP_USER: harrison
115
+ FTP_PASSWORD: w5@reba?9?pepuk7w9a#H86ustaGawE!
116
+ FTP_DIR: /wordpress
117
+
118
+ # Authentication Unique Keys and Salts
119
+ # https://api.wordpress.org/secret-key/1.1/salt/
120
+ # If no salts are supplied they will be generated automatically
121
+ #AUTH_KEY: '*oH{(q=`tIzdNJKUk$XfHNNjKd$W=f$S`CtD.,;x0R}$/A,}]!+q0>>QfB#.Bsw]'
122
+ #SECURE_AUTH_KEY: '{yg|7Q*j-?$%`b|Z!+5U,pvM,eA0+$/ruprp.mO[;|fExU:n0,-!at0+3UY@;h`X'
123
+ #LOGGED_IN_KEY: 'k]N 9I<-rZq#k Xg)IPhv$E*ktbD7Z_AtI){U;(P;0r#LJlYncEr%8v9tG`>BHU+'
124
+ #NONCE_KEY: ' /w9->::-YB Xa#lf%TPH+cIf?]Ru4OfKGF2h8PHsa)2,n-~kRJ<[slUg<GZ Asx'
125
+ #AUTH_SALT: 'VYwGGP,#|9P[5RCUTdv2c8)`^{dotU0fWrU`JE9qq^n=F4//e)fCs<HF6sd>~yjW'
126
+ #SECURE_AUTH_SALT: 'ok}@vSs=n6%_%UCO|&[?Jc;,-,.#Q3}zR4ej%IoAL7RavTN/Xe,UrQ4)p}onRie0'
127
+ #LOGGED_IN_SALT: 'Z!,C*:Q_I9A`[pJm-b0Z/(Gm2qvK8>0~| T&)lM+sxG.OdEmgHbAGF&(^>2.rDGW'
128
+ #NONCE_SALT: 'ay)${bFV=F1KH[`NZ+W+Zk?Hc:@}jN}Ec)+Zn[F1fyP,mwi|@tk/(1hdp[G2F%os'
@@ -0,0 +1,93 @@
1
+ require 'spec_helper'
2
+
3
+ include WordpressDeploy::Database
4
+ include WordpressDeploy::Wordpress
5
+
6
+ describe MySql do
7
+
8
+ let(:mysql) { "/path/to/mysql" }
9
+ let(:mysqldump) { "/path/to/mysqldump" }
10
+
11
+ it { should respond_to :run }
12
+ it { should respond_to :utility }
13
+ it { should respond_to :command_name }
14
+ it { should respond_to :mysqldump }
15
+ it { should respond_to :configuration }
16
+ it { should respond_to :configuration= }
17
+
18
+ shared_examples "command based on configuration" do
19
+ before(:each) do
20
+ subject.configuration = WordpressDeploy::Wordpress::Configuration.new name
21
+ subject.stub(:utility).with("mysqldump").and_return(mysqldump)
22
+ end
23
+ its(:arguments) { should eq expected_args }
24
+ its(:mysqldump) { should eq "#{mysqldump} #{expected_args}" }
25
+ end
26
+
27
+ context "when configuration is 'development'" do
28
+ it_should_behave_like "command based on configuration" do
29
+ let(:name) { "development" }
30
+ let(:expected_args) { "-P \"3306\" -h \"localhost\" -u \"root\" -pq9&hu6Re_*dReWr_GAba_2wr89#2Ra8$ -B \"developer_database_name\"" }
31
+ end
32
+ end
33
+
34
+ context "when configuration is 'production'" do
35
+ it_should_behave_like "command based on configuration" do
36
+ let(:name) { "production" }
37
+ let(:expected_args) { "-P \"6654\" -h \"abbott.biz\" -u \"some_user\" -ptrecuwawraJaZe6P@kucraDrachustUq -B \"production_database_name\"" }
38
+ end
39
+ end
40
+
41
+ context "when configuration is 'red'" do
42
+ it_should_behave_like "command based on configuration" do
43
+ let(:name) { "red" }
44
+ let(:expected_args) { "-P \"3306\" -h \"hanerutherford.biz\" -u \"red_user\" -pBun__huPEMeBreM6tebRAp@eguzuQExe -B \"red\"" }
45
+ end
46
+ end
47
+
48
+ context "when configuration is 'green'" do
49
+ it_should_behave_like "command based on configuration" do
50
+ let(:name) { "green" }
51
+ let(:expected_args) { "-P \"3306\" -h \"yundt.org\" -u \"domenick.dare\" -pDaw&HEWuzaz6sa&epHech_spAKucHaTH -B \"green\"" }
52
+ end
53
+ end
54
+
55
+ context "when configuration is 'blue'" do
56
+ it_should_behave_like "command based on configuration" do
57
+ let(:name) { "blue" }
58
+ let(:expected_args) { "-P \"3306\" -h \"torphagenes.com\" -u \"harrison\" -pw5@reba?9?pepuk7w9a#H86ustaGawE! -B \"blue\"" }
59
+ end
60
+ end
61
+
62
+ context "find commands" do
63
+ it "should raise Errors::Cli::UtilityNotFoundError if no command given" do
64
+ expect{subject.utility ""}.to raise_error(WordpressDeploy::Errors::Cli::UtilityNotFoundError)
65
+ end
66
+ it "should raise Errors::Cli::UtilityNotFoundError if command not found" do
67
+ expect{subject.utility "missing_system_command"}.to raise_error(WordpressDeploy::Errors::Cli::UtilityNotFoundError)
68
+ end
69
+ it "mysql" do
70
+ stdin = Object.new
71
+ stdin.stub(:close)
72
+
73
+ stdout = Object.new.stub(:read).and_return("")
74
+ stdout.stub(:read).and_return(mysql)
75
+
76
+ stderr = Object.new.stub(:read).and_return("")
77
+ stderr.stub(:read).and_return("")
78
+
79
+ wait_thr = Object.new
80
+ wait_thr.stub(:value).and_return($?)
81
+
82
+ Open3.should_receive(:popen3).exactly(1).times.and_yield(stdin, stdout, stderr, wait_thr)
83
+
84
+ subject.utility("mysql").should eq mysql
85
+ WordpressDeploy::Database::MySql::UTILITY["mysql"].should eq mysql
86
+ end
87
+ end
88
+
89
+ it "should parse out the command name" do
90
+ subject.command_name("#{mysqldump} -P \"3306\" -h \"NOT_localhost\" -u \"root\" -ptemp -B \"developer_database_name\"").should eq "mysqldump"
91
+ end
92
+
93
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe WordpressDeploy::Environment do
4
+
5
+ it { should respond_to :set_options }
6
+
7
+ let(:new_options) do
8
+ Hash["root_dir", "/some/new/dir", "wp_dir", "./dir2"]
9
+ end
10
+
11
+ it "should allow mass assignment of options" do
12
+ subject.set_options new_options
13
+ subject.root_dir.should eq "/some/new/dir"
14
+ subject.wp_dir.should eq "/some/new/dir/dir2"
15
+ subject.log_file.should =~ /\/some\/new\/dir/
16
+ end
17
+
18
+ its(:root_dir) { should eq data_dir }
19
+ its(:wp_dir) { should eq data_dir }
20
+ its(:log_file) { should =~ /#{data_dir}.*.log/ }
21
+
22
+ context "logs" do
23
+ before(:all) { @log_before = WordpressDeploy::Environment.logging? }
24
+ it "should default to logging off unless explicitly set to true" do
25
+ WordpressDeploy::Environment.logging = true
26
+ [:true, "true", 1, 0, false, :false, "Cool"].each do |val|
27
+ WordpressDeploy::Environment.logging = val
28
+ WordpressDeploy::Environment.logging?.should be_false
29
+ end
30
+ end
31
+ its(:logging?) { should be_false }
32
+ after(:all) { WordpressDeploy::Environment.logging = @log_before }
33
+ end
34
+ end
35
+
@@ -1,5 +1,40 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
1
4
  require 'wordpress_deploy'
2
5
 
6
+ def data_dir
7
+ File.join(File.dirname(__FILE__), "data")
8
+ end
9
+
3
10
  RSpec.configure do |config|
4
- config.color_enabled = true
11
+ # == Mock Framework
12
+ #
13
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
14
+ #
15
+ # config.mock_with :mocha
16
+ # config.mock_with :flexmock
17
+ # config.mock_with :rr
18
+ config.mock_with :rspec
19
+
20
+ # Reset the environment for each spec that is run
21
+ config.before(:each) do
22
+ WordpressDeploy::Environment.root_dir = data_dir
23
+ WordpressDeploy::Environment.wp_dir = "."
24
+ WordpressDeploy::Environment.config_dir = "."
25
+ WordpressDeploy::Environment.logging = false
26
+ end
27
+
28
+ # Clean-up log files after each spec
29
+ config.after(:all) do
30
+ WordpressDeploy::Environment.clean!
31
+ end
32
+
33
+ end
34
+
35
+ RSpec::Matchers.define :be_salt do |expected|
36
+ match do |actual|
37
+ actual.instance_of? String
38
+ actual.to_s.size === 64
39
+ end
5
40
  end
@@ -0,0 +1,193 @@
1
+ require 'spec_helper'
2
+
3
+ include WordpressDeploy
4
+
5
+ describe WordpressDeploy::TransferProtocols::Ftp do
6
+ before(:each) do
7
+ # None of the methods that follow are testing
8
+ # the Net::FTP object actions; therefore they
9
+ # can be stubbed out
10
+ @ftp = double("ftp")
11
+ [:connect, :login, :passive=].each do |methods|
12
+ @ftp.stub(methods).with(any_args)
13
+ end
14
+ Net::FTP.stub(:new).and_return(@ftp)
15
+ end
16
+
17
+ it { should respond_to :name }
18
+ it { should respond_to :name= }
19
+ it { should respond_to :available_names }
20
+ it { should respond_to :names }
21
+ it { should respond_to :port }
22
+ it { should respond_to :port? }
23
+ it { should respond_to :host }
24
+ it { should respond_to :configuration }
25
+ it { should respond_to :configuration= }
26
+
27
+ it { should respond_to :FTP_USER }
28
+ it { should respond_to :FTP_PASSWORD }
29
+ it { should respond_to :FTP_HOST }
30
+ it { should respond_to :FTP_DIR }
31
+
32
+ its(:names) { should have(5).strings }
33
+ its(:names) { should include "development" }
34
+ its(:names) { should include "production" }
35
+ its(:names) { should include "red" }
36
+ its(:names) { should include "green" }
37
+ its(:names) { should include "blue" }
38
+ its(:available_names) { should have(5).strings }
39
+ its(:available_names) { should include "development" }
40
+ its(:available_names) { should include "production" }
41
+ its(:available_names) { should include "red" }
42
+ its(:available_names) { should include "green" }
43
+ its(:available_names) { should include "blue" }
44
+
45
+ it "should allow creation of new configuration by name" do
46
+ ftp = WordpressDeploy::TransferProtocols::Ftp.new "red"
47
+ ftp.name.should eq "red"
48
+ end
49
+
50
+ it "should only allow configuration names found in the yaml file" do
51
+ ["production", "development", "red", "green", "blue"].each do |name|
52
+ subject.name = name
53
+ subject.name.should eq name
54
+ end
55
+ [:production, nil].each do |name|
56
+ subject.name = name
57
+ subject.name.should_not eq name
58
+ end
59
+ end
60
+
61
+ shared_examples "ftp named configuration" do
62
+ before(:each) { subject.name = name }
63
+ its(:name) { should eq name }
64
+ its(:FTP_USER) { should eq ftp_user }
65
+ its(:FTP_PASSWORD) { should eq ftp_password }
66
+ its(:FTP_HOST) { should eq ftp_host }
67
+ its(:FTP_DIR) { should eq ftp_dir_raw }
68
+ its(:local_path) { should eq Environment.wp_dir }
69
+ its(:remote_path) { should eq ftp_dir }
70
+ its(:username) { should eq ftp_user }
71
+ its(:password) { should eq ftp_password }
72
+ its(:host) { should eq host }
73
+ its(:port) { should eq port }
74
+ its(:port?) { should eq has_port }
75
+ end
76
+
77
+ context "development" do
78
+ it_should_behave_like "ftp named configuration" do
79
+ let(:name) { "development" }
80
+ let(:ftp_user) { "root" }
81
+ let(:ftp_password) { "q9&hu6Re_*dReWr_GAba_2wr89#2Ra8$" }
82
+ let(:ftp_host) { "localhost" }
83
+ let(:ftp_dir_raw) { "/wordpress" }
84
+ let(:ftp_dir) { "/wordpress" }
85
+ let(:host) { "localhost" }
86
+ let(:port) { 21 }
87
+ let(:has_port) { false }
88
+ end
89
+ end
90
+
91
+ context "production" do
92
+ it_should_behave_like "ftp named configuration" do
93
+ let(:name) { "production" }
94
+ let(:ftp_user) { "some_user" }
95
+ let(:ftp_password) { "trecuwawraJaZe6P@kucraDrachustUq" }
96
+ let(:ftp_host) { "ftp.abbott.biz:6654" }
97
+ let(:ftp_dir_raw) { nil }
98
+ let(:ftp_dir) { "/" }
99
+ let(:host) { "ftp.abbott.biz" }
100
+ let(:port) { 6654 }
101
+ let(:has_port) { true }
102
+ end
103
+ end
104
+
105
+ context "red" do
106
+ it_should_behave_like "ftp named configuration" do
107
+ let(:name) { "red" }
108
+ let(:ftp_user) { "red_user" }
109
+ let(:ftp_password) { "Bun__huPEMeBreM6tebRAp@eguzuQExe" }
110
+ let(:ftp_host) { "ftp.hanerutherford.biz" }
111
+ let(:ftp_dir_raw) { "/html" }
112
+ let(:ftp_dir) { "/html" }
113
+ let(:host) { "ftp.hanerutherford.biz" }
114
+ let(:port) { 21 }
115
+ let(:has_port) { false }
116
+ end
117
+ end
118
+
119
+ context "green" do
120
+ it_should_behave_like "ftp named configuration" do
121
+ let(:name) { "green" }
122
+ let(:ftp_user) { "domenick.dare" }
123
+ let(:ftp_password) { "Daw&HEWuzaz6sa&epHech_spAKucHaTH" }
124
+ let(:ftp_host) { "ftp.yundt.org" }
125
+ let(:ftp_dir_raw) { "/wordpress" }
126
+ let(:ftp_dir) { "/wordpress" }
127
+ let(:host) { "ftp.yundt.org" }
128
+ let(:port) { 21 }
129
+ let(:has_port) { false }
130
+ end
131
+ end
132
+
133
+ context "blue" do
134
+ it_should_behave_like "ftp named configuration" do
135
+ let(:name) { "blue" }
136
+ let(:ftp_user) { "harrison" }
137
+ let(:ftp_password) { "w5@reba?9?pepuk7w9a#H86ustaGawE!" }
138
+ let(:ftp_host) { "ftp.torphagenes.com" }
139
+ let(:ftp_dir_raw) { "/wordpress" }
140
+ let(:ftp_dir) { "/wordpress" }
141
+ let(:host) { "ftp.torphagenes.com" }
142
+ let(:port) { 21 }
143
+ let(:has_port) { false }
144
+ end
145
+ end
146
+
147
+ it "has methods that allow for interactive overwrite" do
148
+ expect { subject.transmit }.to raise_error(NotImplementedError)
149
+ expect { subject.receive }.to raise_error(NotImplementedError)
150
+ end
151
+
152
+ it { should respond_to :transmit! }
153
+ it { should respond_to :receive! }
154
+
155
+ context "FTP connection" do
156
+ before(:each) do
157
+ @ftp = double("ftp")
158
+ @ftp.should_receive(:connect).with("localhost", 21)
159
+ @ftp.should_receive(:login).with("root", "q9&hu6Re_*dReWr_GAba_2wr89#2Ra8$")
160
+ @ftp.should_receive(:passive=).with(true)
161
+ @ftp.stub(:pwd)
162
+ @ftp.stub(:closed?).and_return(false)
163
+ @ftp.stub(:close)
164
+ @ftp.stub(:chdir)
165
+ @ftp.stub(:putbinaryfile)
166
+ Net::FTP.stub(:new).and_return(@ftp)
167
+ WordpressDeploy::TransferProtocols::Ftp.any_instance.stub(:ftp).and_return(@ftp)
168
+ end
169
+
170
+ it "with valid credentials" do
171
+ ftp = WordpressDeploy::TransferProtocols::Ftp.new("developer")
172
+ end
173
+
174
+ it "close an open connection" do
175
+ ftp = WordpressDeploy::TransferProtocols::Ftp.new("developer")
176
+ ftp.close.should be_true
177
+ #ftp.close.should be_false
178
+ end
179
+
180
+ it "should send files" do
181
+ files = Dir.glob(File.join(data_dir, "**/*"))
182
+
183
+ Dir.should_receive(:glob).with("/Users/ryan/Source/wordpress-deploy/spec/data/**/*").and_return(files)
184
+
185
+ ftp = WordpressDeploy::TransferProtocols::Ftp.new("developer")
186
+
187
+ ftp.should_receive(:put_file).exactly(files.count).times
188
+
189
+ ftp.transmit!
190
+ end
191
+ end
192
+
193
+ end