/tests/OfficialAccount/Material/ClientTest.php

https://github.com/easy-swoole/wechat · PHP · 309 lines · 278 code · 24 blank · 7 comment · 0 complexity · 8a79544f17bf3d6216a35924b8356c87 MD5 · raw file

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: XueSi
  5. * Email: <1592328848@qq.com>
  6. * Date: 2021/5/16
  7. * Time: 23:31
  8. */
  9. namespace EasySwoole\WeChat\Tests\OfficialAccount\Material;
  10. use EasySwoole\WeChat\Kernel\Messages\Article;
  11. use EasySwoole\WeChat\Kernel\ServiceContainer;
  12. use EasySwoole\WeChat\Tests\Mock\Message\Status;
  13. use EasySwoole\WeChat\Tests\TestCase;
  14. use EasySwoole\WeChat\OfficialAccount\Material\Client;
  15. use Psr\Http\Message\ServerRequestInterface;
  16. class ClientTest extends TestCase
  17. {
  18. public function testUploadImage()
  19. {
  20. $response = $this->buildResponse(Status::CODE_OK, $this->readMockResponseJson('upload.json'));
  21. $app = $this->mockAccessToken(new ServiceContainer([
  22. 'appId' => 'mock_appId'
  23. ]));
  24. $app = $this->mockHttpClient(function (ServerRequestInterface $request) {
  25. $this->assertEquals('POST', $request->getMethod());
  26. $this->assertEquals('/cgi-bin/material/add_material', $request->getUri()->getPath());
  27. $this->assertEquals('access_token=mock_access_token&type=image', $request->getUri()->getQuery());
  28. }, $response, $app);
  29. $client = new Client($app);
  30. $ret = $client->uploadImage(__DIR__ . '/mock_data/mock_image.jpg');
  31. $this->assertIsArray($ret);
  32. $this->assertEquals(json_decode($this->readMockResponseJson('upload.json'), true), $ret);
  33. }
  34. public function testUploadVoice()
  35. {
  36. $response = $this->buildResponse(Status::CODE_OK, $this->readMockResponseJson('upload.json'));
  37. $app = $this->mockAccessToken(new ServiceContainer([
  38. 'appId' => 'mock_appId'
  39. ]));
  40. $app = $this->mockHttpClient(function (ServerRequestInterface $request) {
  41. $this->assertEquals('POST', $request->getMethod());
  42. $this->assertEquals('/cgi-bin/material/add_material', $request->getUri()->getPath());
  43. $this->assertEquals('access_token=mock_access_token&type=voice', $request->getUri()->getQuery());
  44. }, $response, $app);
  45. $client = new Client($app);
  46. $ret = $client->uploadVoice(__DIR__ . '/mock_data/mock_voice.mp3');
  47. $this->assertIsArray($ret);
  48. $this->assertEquals(json_decode($this->readMockResponseJson('upload.json'), true), $ret);
  49. }
  50. public function testUploadThumb()
  51. {
  52. $response = $this->buildResponse(Status::CODE_OK, $this->readMockResponseJson('upload.json'));
  53. $app = $this->mockAccessToken(new ServiceContainer([
  54. 'appId' => 'mock_appId'
  55. ]));
  56. $app = $this->mockHttpClient(function (ServerRequestInterface $request) {
  57. $this->assertEquals('POST', $request->getMethod());
  58. $this->assertEquals('/cgi-bin/material/add_material', $request->getUri()->getPath());
  59. $this->assertEquals('access_token=mock_access_token&type=thumb', $request->getUri()->getQuery());
  60. }, $response, $app);
  61. $client = new Client($app);
  62. $ret = $client->uploadThumb(__DIR__ . '/mock_data/mock_thumb.jpg');
  63. $this->assertIsArray($ret);
  64. $this->assertEquals(json_decode($this->readMockResponseJson('upload.json'), true), $ret);
  65. }
  66. public function testUploadVideo()
  67. {
  68. $response = $this->buildResponse(Status::CODE_OK, $this->readMockResponseJson('upload.json'));
  69. $app = $this->mockAccessToken(new ServiceContainer([
  70. 'appId' => 'mock_appId'
  71. ]));
  72. $app = $this->mockHttpClient(function (ServerRequestInterface $request) {
  73. $this->assertEquals('POST', $request->getMethod());
  74. $this->assertEquals('/cgi-bin/material/add_material', $request->getUri()->getPath());
  75. $this->assertEquals('access_token=mock_access_token&type=video', $request->getUri()->getQuery());
  76. }, $response, $app);
  77. $client = new Client($app);
  78. $ret = $client->uploadVideo(__DIR__ . '/mock_data/mock_video.mp4', 'VIDEO_TITLE', 'INTRODUCTION');
  79. $this->assertIsArray($ret);
  80. $this->assertEquals(json_decode($this->readMockResponseJson('upload.json'), true), $ret);
  81. }
  82. public function testUploadArticle()
  83. {
  84. $response = $this->buildResponse(Status::CODE_OK, '{"media_id":"MEDIA_ID"}');
  85. $app = $this->mockAccessToken(new ServiceContainer([
  86. 'appId' => 'mock_appId'
  87. ]));
  88. $app = $this->mockHttpClient(function (ServerRequestInterface $request) {
  89. $this->assertEquals('POST', $request->getMethod());
  90. $this->assertEquals('/cgi-bin/material/add_news', $request->getUri()->getPath());
  91. $this->assertEquals('access_token=mock_access_token', $request->getUri()->getQuery());
  92. }, $response, $app);
  93. $client = new Client($app);
  94. $articles = new Article([
  95. 'title' => 'TITLE',
  96. 'thumb_media_id' => 'THUMB_MEDIA_ID',
  97. 'author' => 'AUTHOR',
  98. 'digest' => 'DIGEST',
  99. 'show_cover_pic' => 'SHOW_COVER_PIC(0 / 1)',
  100. 'show_cover' => 'SHOW_COVER_PIC(0 / 1)',
  101. 'content' => 'CONTENT',
  102. 'content_source_url' => 'CONTENT_SOURCE_URL',
  103. 'need_open_comment' => 1,
  104. 'only_fans_can_comment' => 1
  105. ]);
  106. $ret = $client->uploadArticle($articles);
  107. $this->assertIsArray($ret);
  108. $this->assertEquals(json_decode('{"media_id":"MEDIA_ID"}', true), $ret);
  109. $response = $this->buildResponse(Status::CODE_OK, '{"media_id":"MEDIA_ID"}');
  110. $app = $this->mockAccessToken(new ServiceContainer([
  111. 'appId' => 'mock_appId'
  112. ]));
  113. $app = $this->mockHttpClient(function (ServerRequestInterface $request) {
  114. $this->assertEquals('POST', $request->getMethod());
  115. $this->assertEquals('/cgi-bin/material/add_news', $request->getUri()->getPath());
  116. $this->assertEquals('access_token=mock_access_token', $request->getUri()->getQuery());
  117. }, $response, $app);
  118. $client = new Client($app);
  119. $article1 = new Article([
  120. 'title' => 'TITLE1',
  121. 'thumb_media_id' => 'THUMB_MEDIA_ID',
  122. 'author' => 'AUTHOR',
  123. 'digest' => 'DIGEST',
  124. 'show_cover_pic' => 'SHOW_COVER_PIC(0 / 1)',
  125. 'show_cover' => 'SHOW_COVER_PIC(0 / 1)',
  126. 'content' => 'CONTENT',
  127. 'content_source_url' => 'CONTENT_SOURCE_URL',
  128. 'need_open_comment' => 1,
  129. 'only_fans_can_comment' => 1
  130. ]);
  131. $article2 = new Article([
  132. 'title' => 'TITLE2',
  133. 'thumb_media_id' => 'THUMB_MEDIA_ID',
  134. 'author' => 'AUTHOR',
  135. 'digest' => 'DIGEST',
  136. 'show_cover_pic' => 'SHOW_COVER_PIC(0 / 1)',
  137. 'show_cover' => 'SHOW_COVER_PIC(0 / 1)',
  138. 'content' => 'CONTENT',
  139. 'content_source_url' => 'CONTENT_SOURCE_URL',
  140. 'need_open_comment' => 1,
  141. 'only_fans_can_comment' => 1
  142. ]);
  143. $articlesArr = [
  144. $article1,
  145. $article2
  146. ];
  147. $ret = $client->uploadArticle($articlesArr);
  148. $this->assertIsArray($ret);
  149. $this->assertEquals(json_decode('{"media_id":"MEDIA_ID"}', true), $ret);
  150. }
  151. public function testUpdateArticle()
  152. {
  153. $response = $this->buildResponse(Status::CODE_OK, '{"errcode":0,"errmsg":"ok"}');
  154. $app = $this->mockAccessToken(new ServiceContainer([
  155. 'appId' => 'mock_appId'
  156. ]));
  157. $app = $this->mockHttpClient(function (ServerRequestInterface $request) {
  158. $this->assertEquals('POST', $request->getMethod());
  159. $this->assertEquals('/cgi-bin/material/update_news', $request->getUri()->getPath());
  160. $this->assertEquals('access_token=mock_access_token', $request->getUri()->getQuery());
  161. }, $response, $app);
  162. $client = new Client($app);
  163. $article = new Article([
  164. 'title' => 'TITLE',
  165. 'thumb_media_id' => 'THUMB_MEDIA_ID',
  166. 'author' => 'AUTHOR',
  167. 'digest' => 'DIGEST',
  168. 'show_cover_pic' => 'SHOW_COVER_PIC(0 / 1)',
  169. 'show_cover' => 'SHOW_COVER_PIC(0 / 1)',
  170. 'content' => 'CONTENT',
  171. 'content_source_url' => 'CONTENT_SOURCE_URL'
  172. ]);
  173. $this->assertTrue($client->updateArticle('MEDIA_ID', $article, 1));
  174. }
  175. public function testUploadArticleImage()
  176. {
  177. $response = $this->buildResponse(Status::CODE_OK, $this->readMockResponseJson('uploadArticleImage.json'));
  178. $app = $this->mockAccessToken(new ServiceContainer([
  179. 'appId' => 'mock_appId'
  180. ]));
  181. $app = $this->mockHttpClient(function (ServerRequestInterface $request) {
  182. $this->assertEquals('POST', $request->getMethod());
  183. $this->assertEquals('/cgi-bin/media/uploadimg', $request->getUri()->getPath());
  184. $this->assertEquals('access_token=mock_access_token&type=news_image', $request->getUri()->getQuery());
  185. }, $response, $app);
  186. $client = new Client($app);
  187. $ret = $client->uploadArticleImage(__DIR__.'/mock_data/mock_image.jpg');
  188. $this->assertIsArray($ret);
  189. $this->assertSame(json_decode($this->readMockResponseJson('uploadArticleImage.json'), true), $ret);
  190. }
  191. public function testUpload()
  192. {
  193. $response = $this->buildResponse(Status::CODE_OK, $this->readMockResponseJson('upload.json'));
  194. $app = $this->mockAccessToken(new ServiceContainer([
  195. 'appId' => 'mock_appId'
  196. ]));
  197. $app = $this->mockHttpClient(function (ServerRequestInterface $request) {
  198. $this->assertEquals('POST', $request->getMethod());
  199. $this->assertEquals('/cgi-bin/material/add_material', $request->getUri()->getPath());
  200. $this->assertEquals('access_token=mock_access_token&type=image', $request->getUri()->getQuery());
  201. }, $response, $app);
  202. $client = new Client($app);
  203. $ret = $client->upload('image', __DIR__ . '/mock_data/mock_image.jpg');
  204. $this->assertIsArray($ret);
  205. $this->assertEquals(json_decode($this->readMockResponseJson('upload.json'), true), $ret);
  206. }
  207. public function testdelete()
  208. {
  209. $response = $this->buildResponse(Status::CODE_OK, '{"errcode":0,"errmsg":"ok"}');
  210. $app = $this->mockAccessToken(new ServiceContainer([
  211. 'appId' => 'mock_appId'
  212. ]));
  213. $app = $this->mockHttpClient(function (ServerRequestInterface $request) {
  214. $this->assertEquals('POST', $request->getMethod());
  215. $this->assertEquals('/cgi-bin/material/del_material', $request->getUri()->getPath());
  216. $this->assertEquals('access_token=mock_access_token', $request->getUri()->getQuery());
  217. }, $response, $app);
  218. $client = new Client($app);
  219. $this->assertTrue($client->delete('MEDIA_ID'));
  220. }
  221. public function testStats()
  222. {
  223. $response = $this->buildResponse(Status::CODE_OK, $this->readMockResponseJson('stats.json'));
  224. $app = $this->mockAccessToken(new ServiceContainer([
  225. 'appId' => 'mock_appId'
  226. ]));
  227. $app = $this->mockHttpClient(function (ServerRequestInterface $request) {
  228. $this->assertEquals('GET', $request->getMethod());
  229. $this->assertEquals('/cgi-bin/material/get_materialcount', $request->getUri()->getPath());
  230. $this->assertEquals('access_token=mock_access_token', $request->getUri()->getQuery());
  231. }, $response, $app);
  232. $client = new Client($app);
  233. $ret = $client->stats();
  234. $this->assertIsArray($ret);
  235. $this->assertEquals(json_decode($this->readMockResponseJson('stats.json'), true), $ret);
  236. }
  237. public function testGet1()
  238. {
  239. $response = $this->buildResponse(Status::CODE_OK, $this->readMockResponseJson('get1.json'));
  240. $app = $this->mockAccessToken(new ServiceContainer([
  241. 'appId' => 'mock_appId'
  242. ]));
  243. $app = $this->mockHttpClient(function (ServerRequestInterface $request) {
  244. $this->assertEquals('POST', $request->getMethod());
  245. $this->assertEquals('/cgi-bin/material/get_material', $request->getUri()->getPath());
  246. $this->assertEquals('access_token=mock_access_token', $request->getUri()->getQuery());
  247. }, $response, $app);
  248. $client = new Client($app);
  249. $ret = $client->get('MEDIA_ID');
  250. $this->assertIsArray($ret);
  251. $this->assertEquals(json_decode($this->readMockResponseJson('get1.json'), true), $ret);
  252. }
  253. public function testGet2()
  254. {
  255. $response = $this->buildResponse(Status::CODE_OK, $this->readMockResponseJson('get2.json'));
  256. $app = $this->mockAccessToken(new ServiceContainer([
  257. 'appId' => 'mock_appId'
  258. ]));
  259. $app = $this->mockHttpClient(function (ServerRequestInterface $request) {
  260. $this->assertEquals('POST', $request->getMethod());
  261. $this->assertEquals('/cgi-bin/material/get_material', $request->getUri()->getPath());
  262. $this->assertEquals('access_token=mock_access_token', $request->getUri()->getQuery());
  263. }, $response, $app);
  264. $client = new Client($app);
  265. $ret = $client->get('MEDIA_ID');
  266. $this->assertIsArray($ret);
  267. $this->assertEquals(json_decode($this->readMockResponseJson('get2.json'), true), $ret);
  268. }
  269. public function testGetApiBytype()
  270. {
  271. $response = $this->buildResponse(Status::CODE_OK, $this->readMockResponseJson('stats.json'));
  272. $app = $this->mockAccessToken(new ServiceContainer([
  273. 'appId' => 'mock_appId'
  274. ]));
  275. $app = $this->mockHttpClient(function (ServerRequestInterface $request) {
  276. }, $response, $app);
  277. $client = new Client($app);
  278. $this->assertSame('/cgi-bin/media/uploadimg', $client->getApiByType('news_image'));
  279. $this->assertSame('/cgi-bin/material/add_material', $client->getApiByType('image'));
  280. }
  281. protected function readMockResponseJson(string $file): string
  282. {
  283. return file_get_contents(dirname(__FILE__) . '/mock_data/' . $file);
  284. }
  285. }