13
from scope_harness import *
14
from scope_harness.testing import *
15
from fake_server_fixture import FakeServerFixture
17
logger = logging.getLogger(__name__)
20
class FakeSearchRequestHandler(http.server.SimpleHTTPRequestHandler):
22
self.send_content(head_only=False)
25
self.send_content(head_only=True)
27
def send_content(self, head_only=False):
28
path = self.translate_path(self.server.root_folder + self.path)
29
logger.info("opening this path: %s", path)
30
logger.info("server serves at: %s", self.server.root_folder)
31
if os.path.isdir(path):
32
path = os.path.join(path, "index.json")
36
new_url = self.server.url
37
replaced_contents = contents.replace(b"[FAKE_SERVER_BASE]",
38
new_url.encode("utf-8"))
40
self.send_error(404, "File not found")
44
self.send_response(200)
45
self.send_header("Content-type", "application/json")
46
self.send_header("Content-Length", len(replaced_contents))
52
self.wfile.write(replaced_contents)
58
class FakeServer(socketserver.ForkingMixIn, http.server.HTTPServer):
59
def __init__(self, server_address, root_folder):
60
super().__init__(server_address, FakeSearchRequestHandler)
61
self.root_folder = root_folder
64
class StoreTestBase(ScopeHarnessTestCase, fixtures.TestWithFixtures):
66
def setupJsonServer(self, env_var, root_folder, append_slash=False):
67
server_fixture = FakeServerFixture(FakeServer, root_folder)
68
self.useFixture(server_fixture)
69
self.useFixture(fixtures.EnvironmentVariable(env_var,
70
newvalue=server_fixture.url))
73
self.useFixture(fixtures.TempHomeDir())
74
self.useFixture(fixtures.EnvironmentVariable('LANGUAGE',
75
newvalue='en_US.utf-8'))
76
self.setupJsonServer("U1_SEARCH_BASE_URL",
77
"fake_responses/click-package-index/", append_slash=True)
78
self.setupJsonServer("U1_REVIEWS_BASE_URL",
79
"fake_responses/ratings-and-reviews/")
80
self.setupJsonServer("PAY_BASE_URL",
81
"fake_responses/software-center-agent/")
84
class StoreTest(StoreTestBase):
87
self.harness = ScopeHarness.new_from_scope_list(Parameters([
88
"/usr/lib/arm-linux-gnueabihf/unity-scopes/clickstore/com.canonical.scopes.clickstore.ini"
90
self.view = self.harness.results_view
91
self.view.active_scope = 'com.canonical.scopes.clickstore'
93
def test_surfacing_results(self):
94
self.view.browse_department('')
95
self.view.search_query = ''
96
cpi_base = os.environ["U1_SEARCH_BASE_URL"]
98
# Check first apps of every category
99
match = CategoryListMatcher() \
101
.mode(CategoryListMatcherMode.BY_ID) \
102
.category(CategoryMatcher("app-of-the-week") \
105
.category(CategoryMatcher("top-apps") \
107
.mode(CategoryMatcherMode.STARTS_WITH) \
108
.result(ResultMatcher(cpi_base + "/api/v1/package/com.ubuntu.developer.bobo1993324.udropcabin") \
109
.properties({'installed': False, 'version': '0.2.1', 'price': 0.0, 'price_area':'FREE', 'rating':'☆ 4.2'}) \
110
.title('uDropCabin') \
111
.subtitle('Zhang Boren') \
113
.category(CategoryMatcher("our-favorite-games") \
115
.mode(CategoryMatcherMode.BY_URI) \
116
.result(ResultMatcher(cpi_base + "/api/v1/package/com.ubuntu.developer.andrew-hayzen.volleyball2d") \
118
.category(CategoryMatcher("travel-apps") \
120
.match(self.view.categories)
121
self.assertMatchResult(match)
123
def test_surfacing_departments(self):
124
self.view.search_query = ''
126
departments = self.view.browse_department('')
128
self.assertTrue(self.view.has_departments)
129
self.assertFalse(self.view.has_alt_departments)
131
match = DepartmentMatcher() \
132
.mode(DepartmentMatcherMode.STARTS_WITH) \
140
.child(ChildDepartmentMatcher('books-comics')) \
141
.child(ChildDepartmentMatcher('business')) \
142
.child(ChildDepartmentMatcher('communication')) \
143
.child(ChildDepartmentMatcher('developer-tools')) \
144
.child(ChildDepartmentMatcher('education')) \
145
.child(ChildDepartmentMatcher('entertainment')) \
146
.child(ChildDepartmentMatcher('finance')) \
147
.child(ChildDepartmentMatcher('food-drink')) \
148
.child(ChildDepartmentMatcher('games')) \
149
.child(ChildDepartmentMatcher('graphics')) \
150
.child(ChildDepartmentMatcher('health-fitness')) \
151
.child(ChildDepartmentMatcher('lifestyle')) \
152
.child(ChildDepartmentMatcher('media-video')) \
153
.child(ChildDepartmentMatcher('medical')) \
154
.child(ChildDepartmentMatcher('music-audio')) \
155
.child(ChildDepartmentMatcher('news-magazines')) \
156
.child(ChildDepartmentMatcher('personalisation')) \
157
.child(ChildDepartmentMatcher('productivity')) \
158
.child(ChildDepartmentMatcher('reference')) \
159
.child(ChildDepartmentMatcher('science-engineering')) \
160
.child(ChildDepartmentMatcher('shopping')) \
161
.child(ChildDepartmentMatcher('social-networking')) \
162
.child(ChildDepartmentMatcher('sports')) \
163
.child(ChildDepartmentMatcher('travel-local')) \
164
.child(ChildDepartmentMatcher('universal-accessaccessibility')) \
165
.child(ChildDepartmentMatcher('accessories')) \
166
.child(ChildDepartmentMatcher('weather')) \
168
self.assertMatchResult(match)
170
def test_department_browsing(self):
171
self.view.search_query = ''
173
departments = self.view.browse_department('games')
175
match = DepartmentMatcher() \
177
.mode(DepartmentMatcherMode.STARTS_WITH) \
181
.parent_label('All') \
185
self.assertMatchResult(match)
187
res_match = CategoryListMatcher() \
189
.mode(CategoryListMatcherMode.BY_ID) \
190
.category(CategoryMatcher("top-games") \
193
.category(CategoryMatcher("__all-scopes__") \
196
.category(CategoryMatcher("__all-apps__") \
199
.match(self.view.categories)
200
self.assertMatchResult(res_match)
202
def test_uninstalled_app_preview(self):
203
self.view.browse_department('')
204
self.view.search_query = 'Calendar'
206
pview = self.view.categories[0].results[0].tap()
207
self.assertIsInstance(pview, PreviewView)
209
match = PreviewColumnMatcher().column(\
211
.widget(PreviewWidgetMatcher("hdr")) \
212
.widget(PreviewWidgetMatcher("buttons") \
216
{"download_sha512":"2fa658804e63da1869037cd9bc74b792875404f03b6c6449271ae5244688ff42a4524712ccb748ab9004344cccddd59063f3d3a4af899a3cc6f64ddc1a27072b",
217
"download_url":"https://public.apps.ubuntu.com/download/com.ubuntu/calendar/com.ubuntu.calendar_0.4.572_all.click","id":"install_click","label":"Install"}]
218
,"online_account_details": {
219
"login_failed_action":1,
220
"login_passed_action":3,
221
"provider_name":"ubuntuone",
223
"service_name": "ubuntuone",
224
"service_type":"ubuntuone"}}
227
.widget(PreviewWidgetMatcher("screenshots") \
229
.widget(PreviewWidgetMatcher("summary") \
231
.widget(PreviewWidgetMatcher("other_metadata") \
233
.widget(PreviewWidgetMatcher("updates") \
235
.widget(PreviewWidgetMatcher("whats_new") \
237
.widget(PreviewWidgetMatcher("reviews_title") \
239
.widget(PreviewWidgetMatcher("summary") \
241
).match(pview.widgets)
242
self.assertMatchResult(match)
244
if __name__ == '__main__':
245
unittest.main(argv = sys.argv[:1])