kaltura_box 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +24 -0
  3. data/Gemfile +6 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +60 -0
  6. data/Rakefile +2 -0
  7. data/kaltura_box.gemspec +28 -0
  8. data/lib/generators/kaltura_box/install_generator.rb +16 -0
  9. data/lib/generators/templates/kaltura_box.rb +18 -0
  10. data/lib/generators/templates/kaltura_upload.js +67 -0
  11. data/lib/kaltura_box.rb +10 -0
  12. data/lib/kaltura_box/api.rb +13 -0
  13. data/lib/kaltura_box/category.rb +18 -0
  14. data/lib/kaltura_box/category/class_methods.rb +50 -0
  15. data/lib/kaltura_box/category/instance_methods.rb +30 -0
  16. data/lib/kaltura_box/client.rb +45 -0
  17. data/lib/kaltura_box/configuration.rb +22 -0
  18. data/lib/kaltura_box/entry.rb +36 -0
  19. data/lib/kaltura_box/entry/class_methods.rb +51 -0
  20. data/lib/kaltura_box/entry/instance_methods.rb +13 -0
  21. data/lib/kaltura_box/entry/metadata.rb +152 -0
  22. data/lib/kaltura_box/entry/metadata/class_and_instance_methods.rb +54 -0
  23. data/lib/kaltura_box/entry/metadata/class_methods.rb +69 -0
  24. data/lib/kaltura_box/version.rb +3 -0
  25. data/spec/api_spec.rb +22 -0
  26. data/spec/category_spec.rb +51 -0
  27. data/spec/entry_spec.rb +38 -0
  28. data/spec/metadata_spec.rb +256 -0
  29. data/spec/spec_helper.rb +68 -0
  30. data/spec/support/video.flv +0 -0
  31. data/vendor/kaltura-ruby-client/README +20 -0
  32. data/vendor/kaltura-ruby-client/Rakefile +19 -0
  33. data/vendor/kaltura-ruby-client/kaltura.gemspec +15 -0
  34. data/vendor/kaltura-ruby-client/kaltura.yml +7 -0
  35. data/vendor/kaltura-ruby-client/lib/kaltura.rb +31 -0
  36. data/vendor/kaltura-ruby-client/lib/kaltura_client.rb +14450 -0
  37. data/vendor/kaltura-ruby-client/lib/kaltura_client_base.rb +432 -0
  38. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_abc_screeners_watermark_access_control_client_plugin.rb +37 -0
  39. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_ad_cue_point_client_plugin.rb +108 -0
  40. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_annotation_client_plugin.rb +237 -0
  41. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_aspera_client_plugin.rb +61 -0
  42. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_attachment_client_plugin.rb +227 -0
  43. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_audit_client_plugin.rb +349 -0
  44. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_bulk_upload_client_plugin.rb +109 -0
  45. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_bulk_upload_csv_client_plugin.rb +55 -0
  46. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_bulk_upload_filter_client_plugin.rb +46 -0
  47. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_bulk_upload_xml_client_plugin.rb +40 -0
  48. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_caption_client_plugin.rb +406 -0
  49. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_caption_search_client_plugin.rb +138 -0
  50. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_code_cue_point_client_plugin.rb +97 -0
  51. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_content_distribution_client_plugin.rb +1717 -0
  52. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_cue_point_client_plugin.rb +290 -0
  53. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_document_client_plugin.rb +522 -0
  54. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_drm_client_plugin.rb +204 -0
  55. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_drop_folder_client_plugin.rb +810 -0
  56. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_drop_folder_xml_bulk_upload_client_plugin.rb +39 -0
  57. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_email_notification_client_plugin.rb +276 -0
  58. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_event_notification_client_plugin.rb +405 -0
  59. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_external_media_client_plugin.rb +203 -0
  60. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_file_sync_client_plugin.rb +151 -0
  61. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_http_notification_client_plugin.rb +309 -0
  62. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_kontiki_client_plugin.rb +72 -0
  63. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_like_client_plugin.rb +82 -0
  64. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_metadata_client_plugin.rb +788 -0
  65. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_multi_centers_client_plugin.rb +45 -0
  66. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_short_link_client_plugin.rb +231 -0
  67. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_tag_search_client_plugin.rb +145 -0
  68. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_var_console_client_plugin.rb +238 -0
  69. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_velocix_client_plugin.rb +40 -0
  70. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_virus_scan_client_plugin.rb +263 -0
  71. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_webex_drop_folder_client_plugin.rb +121 -0
  72. data/vendor/kaltura-ruby-client/lib/kaltura_plugins/kaltura_widevine_client_plugin.rb +195 -0
  73. data/vendor/kaltura-ruby-client/license.txt +674 -0
  74. data/vendor/kaltura-ruby-client/test/access_control_service_test.rb +75 -0
  75. data/vendor/kaltura-ruby-client/test/base_entry_service_test.rb +267 -0
  76. data/vendor/kaltura-ruby-client/test/configuration_test.rb +178 -0
  77. data/vendor/kaltura-ruby-client/test/cue_point_service_test.rb +67 -0
  78. data/vendor/kaltura-ruby-client/test/data_service_test.rb +76 -0
  79. data/vendor/kaltura-ruby-client/test/document_service_test.rb +41 -0
  80. data/vendor/kaltura-ruby-client/test/media/test.mov +0 -0
  81. data/vendor/kaltura-ruby-client/test/media/test.pdf +0 -0
  82. data/vendor/kaltura-ruby-client/test/media/test.png +0 -0
  83. data/vendor/kaltura-ruby-client/test/media/test.swf +0 -0
  84. data/vendor/kaltura-ruby-client/test/media/test.wmv +0 -0
  85. data/vendor/kaltura-ruby-client/test/media_service_test.rb +294 -0
  86. data/vendor/kaltura-ruby-client/test/metadata_profile_service_test.rb +63 -0
  87. data/vendor/kaltura-ruby-client/test/test_helper.rb +59 -0
  88. metadata +220 -0
@@ -0,0 +1,22 @@
1
+ require 'singleton'
2
+
3
+ module KalturaBox
4
+ class Config
5
+ include Singleton
6
+
7
+ ATTRIBUTES = [ :login_email, :login_password, :partner_id, :subpartner_id,
8
+ :administrator_secret, :user_secret, :thumb_width, :thumb_height,
9
+ :player_conf_id, :service_url, :logger ]
10
+
11
+ attr_accessor *ATTRIBUTES
12
+ end
13
+
14
+ def self.config
15
+ if block_given?
16
+ yield Config.instance
17
+ else
18
+ Config.instance
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,36 @@
1
+ require 'kaltura_box/entry/class_methods'
2
+ require 'kaltura_box/entry/instance_methods'
3
+ require 'kaltura_box/entry/metadata'
4
+
5
+ module KalturaBox
6
+ module Entry
7
+
8
+ #
9
+ # Entry object should have the following attributes:
10
+ #
11
+ # entry_id
12
+ # title
13
+ # description
14
+ # title
15
+ # description
16
+ # thumbnail_url
17
+ # data_url
18
+ # download_url
19
+ # ms_duration
20
+ # tags
21
+ # plays
22
+ # views
23
+ #
24
+
25
+ def self.included(base)
26
+ base.extend ClassMethods
27
+ base.class_eval do
28
+ include InstanceMethods
29
+ include ClassMethods
30
+ include Metadata
31
+ end
32
+ super
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,51 @@
1
+ require 'kaltura'
2
+ require 'kaltura_box/client'
3
+ require 'active_record'
4
+
5
+ module KalturaBox
6
+ module Entry
7
+ module ClassMethods
8
+
9
+ def upload(upload_object, options={})
10
+ client = KalturaBox::Client.update_session
11
+ media_entry = Kaltura::KalturaMediaEntry.new
12
+
13
+ options.each do |key, value|
14
+ media_entry.send("#{key}=", value) if valid_entry_attribute?(key)
15
+ end
16
+
17
+ media_entry.media_type = Kaltura::KalturaMediaType::VIDEO unless options[:media_type]
18
+
19
+ if options[:source] == :file
20
+ upload_token = client.media_service.upload(upload_object)
21
+ client.media_service.add_from_uploaded_file(media_entry,upload_token).id
22
+ end
23
+ end
24
+
25
+ def video_list
26
+ client = KalturaBox::Client.update_session
27
+ media = Kaltura::KalturaMediaService.new(client)
28
+ media_list = media.list
29
+ media_list.objects.reject { |v| v.media_type != 1 }
30
+ end
31
+
32
+ def update_all_videos!
33
+ video_list.each do |v|
34
+ self.create(
35
+ entry_id: v.id,
36
+ title: v.name,
37
+ description: v.description,
38
+ thumbnail_url: v.thumbnail_url,
39
+ data_url: v.data_url,
40
+ download_url: v.download_url,
41
+ ms_duration: v.ms_duration,
42
+ tags: v.tags,
43
+ plays: v.plays,
44
+ views: v.views
45
+ )
46
+ end
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,13 @@
1
+ module KalturaBox
2
+ module Entry
3
+ module InstanceMethods
4
+
5
+ def get
6
+ client = KalturaBox::Client.update_session
7
+ media = Kaltura::KalturaMediaService.new(client)
8
+ media.get(self.entry_id)
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,152 @@
1
+ require 'active_support'
2
+ require 'kaltura_box/entry/metadata/class_methods'
3
+ require 'kaltura_box/entry/metadata/class_and_instance_methods'
4
+
5
+ module KalturaBox
6
+ module Entry
7
+
8
+ ##
9
+ # The Metadata module provides methods that get/set and add metadata to the
10
+ # Kaltura installation.
11
+ #
12
+ # @author Patrick Robertson
13
+ ##
14
+ module Metadata
15
+
16
+ ##
17
+ # @private
18
+ ##
19
+ def self.included(base)
20
+ base.extend ClassAndInstanceMethods
21
+ base.extend ClassMethods
22
+ base.class_eval do
23
+ include ClassAndInstanceMethods
24
+ end
25
+ super
26
+ end
27
+
28
+ ##
29
+ # @private
30
+ ##
31
+ def method_missing(name, *args)
32
+ method_name = name.to_s
33
+ unless self.class.generated_methods?
34
+ self.class.define_attribute_methods
35
+ if self.class.generated_methods.include?(method_name)
36
+ return self.send(name,*args)
37
+ else
38
+ super
39
+ end
40
+ else
41
+ super
42
+ end
43
+ end
44
+
45
+ ##
46
+ # @private
47
+ ##
48
+ def respond_to?(method)
49
+ case method.to_s
50
+ when /^(get|set)_(.*)/
51
+ valid_entry_attribute?($2.to_sym) || super
52
+ when /^(add)_(.*)/
53
+ (valid_entry_attribute?($2.pluralize.to_sym) && valid_add_attribute?($2) ) || super
54
+ else
55
+ super
56
+ end
57
+ end
58
+
59
+ ##
60
+ # Gets a Kaltura::MediaEntry given a Kaltura entry.
61
+ #
62
+ # @param [String] video_id Kaltura entry_id of the video.
63
+ #
64
+ # @return [Kaltura::MediaEntry] The MediaEntry object for the Kaltura entry.
65
+ # @raose [Kaltura::APIError] Raises a kaltura error if it can't find the entry.
66
+ ##
67
+ def get_entry(entry_id)
68
+ client = KalturaBox::Client.update_session
69
+ client.media_service.get(entry_id)
70
+ end
71
+
72
+ ##
73
+ # Sets a specific Kaltura::MediaEntry attribute given a Kaltura entry.
74
+ # This method is called by method_missing, allowing this module set attributes based
75
+ # off of the current API wrapper, rather than having to update along side the API wrapper.
76
+ #
77
+ # @param [String] attr_name The attribute to set.
78
+ # @param [String] entry_id The Kaltura entry ID.
79
+ # @param [String] value The value you wish to set the attribute to.
80
+ #
81
+ # @return [String] Returns the value as stored in the Kaltura database. Tag strings come back
82
+ # slightly funny.
83
+ #
84
+ # @raise [Kaltura::APIError] Passes Kaltura API errors directly through.
85
+ ##
86
+ def set_attribute(attr_name,entry_id,value)
87
+ client = KalturaBox::Client.update_session
88
+ media_entry = Kaltura::KalturaMediaEntry.new
89
+ media_entry.send("#{attr_name}=",value)
90
+ client.media_service.update(entry_id,media_entry).send(attr_name.to_sym)
91
+
92
+ end
93
+
94
+ ##
95
+ # Sets multiple Kaltura::MediaEntry attributes in one convienant method.
96
+ #
97
+ # @param [String] entry_id The Kaltura entry ID.
98
+ # @param [Hash] attributes
99
+ # @option attributes [String] :attribute A Kaltura::MediaEntry attribute to set
100
+ ##
101
+ def set(entry_id, attributes={})
102
+ KalturaBox::Client.update_session
103
+
104
+ attributes.each do |key,value|
105
+ attribute = key.to_s
106
+ set_attribute(attribute,entry_id,value) if valid_entry_attribute?(key)
107
+ end
108
+ end
109
+
110
+ ##
111
+ # @private
112
+ ##
113
+ def category_exists?(category_name)
114
+ client = KalturaBox::Client.update_session
115
+
116
+ category_filter = Kaltura::KalturaCategoryFilter.new
117
+ category_filter.full_name_equal = category_name
118
+ category_check = client.category_service.list(category_filter).objects
119
+ if category_check.nil?
120
+ false
121
+ else
122
+ category_check
123
+ end
124
+ end
125
+
126
+
127
+ ##
128
+ # Appends a specific Kaltura::MediaEntry attribute to the end of the original attribute given a Kaltura entry.
129
+ # This method is called by method_missing, allowing this module add attributes based
130
+ # off of the current API wrapper, rather than having to update along side the API wrapper.
131
+ #
132
+ # @param [String] attr_name The attribute to set.
133
+ # @param [String] entry_id The Kaltura entry ID.
134
+ # @param [String] value The value you wish to append the attribute with.
135
+ #
136
+ # @return [String] Returns the value as stored in the Kaltura database. Tag strings come back
137
+ # slightly funny.
138
+ #
139
+ # @raise [Kaltura::APIError] Passes Kaltura API errors directly through.
140
+ ##
141
+ def add_attribute(attr_name,entry_id,value)
142
+ client = KalturaBox::Client.update_session
143
+
144
+ old_attributes = client.media_service.get(entry_id).send(attr_name.to_sym)
145
+ media_entry = Kaltura::KalturaMediaEntry.new
146
+ media_entry.send("#{attr_name}=","#{old_attributes},#{value}")
147
+ client.media_service.update(entry_id,media_entry).send(attr_name.to_sym)
148
+ end
149
+
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,54 @@
1
+ module KalturaBox
2
+ module Entry
3
+ module Metadata
4
+
5
+ ##
6
+ # It is necessary to have the check for valid Kaltura MediaEntry methods available at both
7
+ # the class and instance level, so they are thrown into this module.
8
+ ##
9
+ module ClassAndInstanceMethods
10
+
11
+ ##
12
+ # Checks if a requested attribute is in fact a valid MediaEntry atrribute.
13
+ ##
14
+ def valid_entry_attribute?(request_attribute)
15
+ object_methods, media_entry_methods = Object.instance_methods , Kaltura::KalturaMediaEntry.instance_methods
16
+
17
+ #clean out all the setter methods from the media entry methods
18
+ valid_media_entry_methods = media_entry_methods.map{|m| m unless m =~/^(.*)=/}.compact!
19
+
20
+ valid_media_entry_methods -= object_methods
21
+ valid_entry_attributes.include?(request_attribute.to_sym)
22
+ end
23
+
24
+ ##
25
+ # @private
26
+ ##
27
+ def valid_entry_attributes
28
+ object_methods, media_entry_methods = Object.instance_methods , Kaltura::KalturaMediaEntry.instance_methods
29
+
30
+ #clean out all the setter methods from the media entry methods
31
+ valid_media_entry_methods = media_entry_methods.map{|m| m.to_sym unless m =~/^(.*)=/}.compact!
32
+
33
+ valid_media_entry_methods -= object_methods
34
+ end
35
+ ##
36
+ # Determines if an attribute is valid in the sense of the add method making sense. Only
37
+ # categories and tags are currently considered valid.
38
+ ##
39
+ def valid_add_attribute?(request_attribute)
40
+ case request_attribute.to_s
41
+ when /^(.*)_(categories|tags)/
42
+ return true
43
+ when /^(categories|tags)/
44
+ return true
45
+ else
46
+ return false
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,69 @@
1
+ module KalturaBox
2
+ module Entry
3
+ module Metadata
4
+ module ClassMethods
5
+
6
+ # Contains the names of the generated attribute methods.
7
+ def generated_methods #:nodoc:
8
+ @generated_methods ||= Set.new
9
+ end
10
+
11
+ def generated_methods?
12
+ !generated_methods.empty?
13
+ end
14
+
15
+ ##
16
+ # This method is called from with method_missing. It generates
17
+ # actual methods for all the valid Kaltura::Media Entry methods
18
+ # the first time a dynamic getter/setter/adder is called.
19
+ ##
20
+ def define_attribute_methods
21
+ return if generated_methods?
22
+ valid_entry_attributes.each do |name|
23
+ define_set_method(name)
24
+ define_get_method(name)
25
+ define_add_method(name) if valid_add_attribute?(name)
26
+ end
27
+ end
28
+
29
+ ##
30
+ # Defines the set method for a specific Media Entry attribute
31
+ ##
32
+ def define_set_method(attr_name)
33
+ evaluate_attribute_method( attr_name,
34
+ "def set_#{attr_name}(new_value);set_attribute('#{attr_name}',self.entry_id,new_value);end",
35
+ "set_#{attr_name}"
36
+ )
37
+ end
38
+
39
+ ##
40
+ # defines a get methods
41
+ ##
42
+ def define_get_method(attr_name)
43
+ evaluate_attribute_method( attr_name,
44
+ "def get_#{attr_name};get_entry(self.entry_id).send('#{attr_name}');end",
45
+ "get_#{attr_name}"
46
+ )
47
+ end
48
+
49
+ def define_add_method(attr_name)
50
+ evaluate_attribute_method( attr_name,
51
+ "def add_#{attr_name}(new_value);add_attribute('#{attr_name}',self.entry_id,new_value);end",
52
+ "add_#{attr_name}"
53
+ )
54
+ end
55
+
56
+ def evaluate_attribute_method(attr_name, method_definition, method_name=attr_name)
57
+ generated_methods << method_name
58
+
59
+ begin
60
+ class_eval(method_definition, __FILE__, __LINE__)
61
+ rescue SyntaxError => err
62
+ generated_methods.delete(attr_name)
63
+ end
64
+ end
65
+
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,3 @@
1
+ module KalturaBox
2
+ VERSION = "0.0.1"
3
+ end
data/spec/api_spec.rb ADDED
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe "KalturaBox::APIWrapper" do
4
+ let(:api) { KalturaBox::APIWrapper.new }
5
+
6
+ before(:all) { KalturaBoxTest.setup! }
7
+
8
+ describe "config values" do
9
+ it { expect( api.client.config.login_email ).to eq(KalturaBox.config.login_email) }
10
+ it { expect( api.client.config.login_password ).to eq(KalturaBox.config.login_password) }
11
+ it { expect( api.client.config.partner_id ).to eq(KalturaBox.config.partner_id) }
12
+ it { expect( api.client.config.subpartner_id ).to eq(KalturaBox.config.subpartner_id) }
13
+ it { expect( api.client.config.administrator_secret ).to eq(KalturaBox.config.administrator_secret) }
14
+ it { expect( api.client.config.user_secret ).to eq(KalturaBox.config.user_secret) }
15
+ it { expect( api.client.config.thumb_width ).to eq(KalturaBox.config.thumb_width) }
16
+ it { expect( api.client.config.thumb_height ).to eq(KalturaBox.config.thumb_height) }
17
+ it { expect( api.client.config.player_conf_id ).to eq(KalturaBox.config.player_conf_id) }
18
+ it { expect( api.client.config.service_url ).to eq(KalturaBox.config.service_url) }
19
+ it { expect( api.client.config.logger ).to eq(KalturaBox.config.logger) }
20
+ end
21
+
22
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+ require 'active_record'
3
+
4
+ class Category < ActiveRecord::Base
5
+ include KalturaBox::Category
6
+ end
7
+
8
+ describe "KalturaBox::Category" do
9
+
10
+ before(:all) { KalturaBoxTest.setup! }
11
+
12
+ describe "class methods" do
13
+
14
+ let(:categories) { Category.list }
15
+
16
+ before { KalturaBoxTest.setup_db! }
17
+
18
+ context "list" do
19
+ it { expect(categories.class).to eq Array }
20
+ end
21
+
22
+ context "update all categories" do
23
+ it { expect{Category.update_all_categories!}.to change{Category.count}.from(0).to(categories.count) }
24
+ end
25
+
26
+ context "add" do
27
+ it { expect{Category.add("new_cat", "New Category", true)}.to change{Category.count}.by(1) }
28
+ end
29
+
30
+ end
31
+
32
+ describe "instance methods" do
33
+
34
+ before { KalturaBoxTest.setup_db! }
35
+
36
+ let!(:category) { Category.add("new_cat2", "New Category 2") }
37
+
38
+ context "update" do
39
+ xit "Looking for a way to remove the updated category on Kaltura" do
40
+ expect{category.edit(name: "new_cat3", description: "New Category 3")}.to change{category.name}.from("new_cat2").to("new_cat3")
41
+ end
42
+ end
43
+
44
+ context "remove" do
45
+ let!(:category) { Category.add("new_cat4", "New Category 4") }
46
+ it { expect{category.remove}.to change{Category.count}.by(-1) }
47
+ end
48
+
49
+ end
50
+
51
+ end